Pushing Metrics
Any limitations?
Any format rules?
Any restrictions around data types?
Anything to keep in mind around frequency of pushes? Any frequency is OK?
...
Request format
Custom metrics can be sent to receiver via HTTP as POST request.
Request parameters:
Name | Description |
---|---|
host | host name |
token | application token |
Request body format:
Code Block | ||
---|---|---|
| ||
[timestamp]\tcustom\t[metric_name]\t[filter1_value]\t[filter2_value]\t[metric_value]\t[aggregation_type]
.... |
Placeholder | Description | Limitations |
---|---|---|
timestamp | Number of milliseconds passed since Epoch (1 Jan 1970) | |
metric_name | Name of metric | Length > 0 and <= 255 |
filter1_value | Value of first filter | Length > 0 and <= 255 |
filter2_value | Value of second filter | Length > 0 and <= 255 |
metric_value | Value of metric (Double) | |
aggregation_type | Type of aggregation | Allowed values are: avg,min,max,sum |
Curl example
Code Block | ||
---|---|---|
| ||
TIMESTAMP=$(($(date +%s)*1000))
METRIC=`echo -n "$TIMESTAMP\tcustom\tconsumed_coffee\toffice-1\tkitchen-2\t100.0\tsum"`
TOKEN=488858e2-759b-46bf-a9d3-f6069b579be3
curl -H "Content-Type: text/plain" -X POST -d "$METRIC" "http://apps-local.sematext.com:8082/spm-receiver/receive?host=`hostname`&token=$TOKEN" |
Ruby example
Example using gem "httparty"
Code Block | ||
---|---|---|
| ||
require 'httparty'
class MetricSerializer
def serialize(options)
"#{options[:timestamp]}\tcustom\t#{options[:name]}\t#{options[:filter1]}\t#{options[:filter2]}\t#{options[:value]}\t#{options[:agg]}"
end
end
class MetricSender
include HTTParty
def initialize(options)
raise "receiver_url is required" unless options[:receiver_url]
raise "host is required" unless options[:host]
raise "token is required" unless options[:token]
self.class.default_options[:base_uri] = options[:receiver_url]
@serializer = MetricSerializer.new
@host = options[:host]
@token = options[:token]
@version = "1.9.0"
end
def send(options)
current_time = (Time.now.to_f * 1000).to_i
merged_options = {
:timestamp => current_time,
:agg => 'avg'
}.merge(options)
s = @serializer.serialize(merged_options)
puts s
post_metric(s)
end
private
def post_metric(body)
post_options = {
:query => {:host => @host, :token => @token, :v => @version},
:headers => {'Content-Type' => 'text/plain; charset=utf-8'},
:body => body
}
self.class.post('receive', post_options)
end
end
RECEIVER_OPTIONS = {
:receiver_url => "http://apps-local.sematext.com:8082/spm-receiver/",
:host => "katrin",
:token => "488858e2-759b-46bf-a9d3-f6069b579be3"
}
sender = MetricSender.new(RECEIVER_OPTIONS)
sender.send :name => "coffee_consumed", :filter1 => "office-1", :filter2 => "kitchen-2", :value => 100.0, :agg => "sum"
|
Comments