apple/swift-statsd-client

Support other formats for metric dimensions

Open

#13 opened on Feb 19, 2020

 (2 comments) (0 reactions) (0 assignees)Swift (23 forks)auto 404
good first issuekind/enhancement

Repository metrics

Stars
 (71 stars)
PR merge metrics
 (PR metrics pending)

Description

At present, the use of metrics dimensions results in some metrics being emitted in an unexpected way:

Timer(label: "my_event", dimensions: [("foo", "bar")]).recordNanoseconds(someDuration)

will emit a packet roughly like

my_event.foo.bar:123.45|ms

However, using the tag format for dimensions would be more appropriate in many applications:

my_event:123.45|ms#foo:bar

Unfortunately, there's not a standard syntax for tags (see https://github.com/statsd/statsd/issues/619), but I think this could be addressed by having an optional init parameter to specify the format:

enum DimensionFormat {
  case datadog
  case influxdb
  case inline
  // ..
}

class StatsdClient: MetricsFactory {
  public init(eventLoopGroupProvider: EventLoopGroupProvider = .createNew, host: String, port: Int, format: DimensionFormat = .inline) throws {
    // ...
  }
  // ...
}

// User initialization code
let statsdClient = try StatsdClient(host: statsdHost, port: statsdPort, format: .datadog)
MetricsSystem.bootstrap(statsdClient)

It may be preferable to avoid specific vendor names in the enum cases to avoid any sort of endorsement, but I'm confident that could be addressed.

Thoughts?

Contributor guide