statsd-kafka-backend icon indicating copy to clipboard operation
statsd-kafka-backend copied to clipboard

A Statsd backend for sending metrics to Kafka

trafficstars

kafka-backend

Etsy Statsd backend for sending metrics to kafka. This relies on posting stats data to a kafka rest proxy endpoint.

This is based on statsd-http-backend, and made specific to kafka.

Install

cd <your statsd install dir>
npm install git+ssh://[email protected]:target/statsd-kafka-backend.git

Configuration (maybe ... config.js?)

{
  restProxyUrl: "http://localhost:8082/topics",
  kafkaTopic: "test-metrics-api",
  backends: [ "./node_modules/statsd-kafka-backend/kafka-backend" ]
}

Run

bin/statsd config.js

Data format

Data posted to kafka - Example

{
  "records": [
    {
      "value": {
        "gauges": {
          "stats_counts.statsd.bad_lines_seen": 0,
          "stats_counts.statsd.packets_received": 63,
          "stats_counts.statsd.metrics_received": 63,
          "stats.gauges.not-configured-app.v0.api.ratios.internal_server_error": 0,
          "stats.gauges.not-configured-app.v0.gauge.response.app.v1.user.name": 504,
          "stats.gauges.not-configured-app.v0.counter.status.200.app.v1.user.name": 43479,
          "stats.gauges.not-configured-app.v0.api.all.max": 528.84,
          "stats.gauges.not-configured-app.v0.api.all.mean": 504.02,
          "stats.gauges.not-configured-app.v0.api.all.min": 500.47,
          "stats.gauges.not-configured-app.v0.api.all.stddev": 2.44,
          "stats.gauges.not-configured-app.v0.api.all.p50": 504.08,
          "stats.gauges.not-configured-app.v0.api.all.p75": 505.19,
          "stats.gauges.not-configured-app.v0.api.all.p95": 506.81,
          "stats.gauges.not-configured-app.v0.api.all.p98": 508.55,
          "stats.gauges.not-configured-app.v0.api.all.p99": 510.8,
          "stats.gauges.not-configured-app.v0.api.all.p999": 527.09,
          "stats.gauges.not-configured-app.v0.api.all.samples": 43479,
          "stats.gauges.not-configured-app.v0.api.all.m1_rate": 0,
          "stats.gauges.not-configured-app.v0.api.all.m5_rate": 0,
          "stats.gauges.not-configured-app.v0.api.all.m15_rate": 0,
          "stats.gauges.not-configured-app.v0.api.all.mean_rate": 3.28,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.max": 562.92,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.mean": 504.07,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.min": 500.44,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.stddev": 2.49,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.p50": 504.07,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.p75": 505.25,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.p95": 506.97,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.p98": 508.37,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.p99": 510.6,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.p999": 534.69,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.samples": 43479,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.m1_rate": 0,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.m5_rate": 0,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.m15_rate": 0,
          "stats.gauges.not-configured-app.v0.api.get.response-code.200.mean_rate": 3.28,
          "stats.gauges.not-configured-app.v0.api.response-code.200.max": 526.17,
          "stats.gauges.not-configured-app.v0.api.response-code.200.mean": 503.9,
          "stats.gauges.not-configured-app.v0.api.response-code.200.min": 500.43,
          "stats.gauges.not-configured-app.v0.api.response-code.200.stddev": 2.02,
          "stats.gauges.not-configured-app.v0.api.response-code.200.p50": 503.99,
          "stats.gauges.not-configured-app.v0.api.response-code.200.p75": 505.13,
          "stats.gauges.not-configured-app.v0.api.response-code.200.p95": 506.81,
          "stats.gauges.not-configured-app.v0.api.response-code.200.p98": 507.81,
          "stats.gauges.not-configured-app.v0.api.response-code.200.p99": 509.54,
          "stats.gauges.not-configured-app.v0.api.response-code.200.p999": 517.5,
          "stats.gauges.not-configured-app.v0.api.response-code.200.samples": 43479,
          "stats.gauges.not-configured-app.v0.api.response-code.200.m1_rate": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.200.m5_rate": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.200.m15_rate": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.200.mean_rate": 3.28,
          "stats.gauges.not-configured-app.v0.api.response-code.500.max": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.mean": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.min": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.stddev": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.p50": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.p75": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.p95": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.p98": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.p99": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.p999": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.samples": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.m1_rate": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.m5_rate": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.m15_rate": 0,
          "stats.gauges.not-configured-app.v0.api.response-code.500.mean_rate": 0,
          "stats.gauges.statsd.timestamp_lag": 0,
          "statsd.numStats": 0,
          "stats.statsd.kafkaStats.calculationtime": 0,
          "stats.statsd.processing_time": 0,
          "stats.statsd.kafkaStats.last_exception": 1462375567,
          "stats.statsd.kafkaStats.last_flush": 1462375587,
          "stats.statsd.kafkaStats.flush_time": 59,
          "stats.statsd.kafkaStats.flush_length": 4793
        },
        "durationUnit": "milliseconds",
        "clock": 1462375597,
        "rateUnit": "seconds"
      }
    }
  ]
}

Response Format - Example

{
  "offsets": [
    {
      "partition": 11,
      "offset": 15,
      "error_code": null,
      "error": null
    }
  ],
  "key_schema_id": null,
  "value_schema_id": null
}