in runtime/gateway.go [550:635]
func (gateway *Gateway) setupMetrics(config *StaticConfig) (err error) {
metricsType := config.MustGetString("metrics.type")
var service string
if config.ContainsKey(metricsServiceFromEnvKey) {
service = os.Getenv(config.MustGetString(metricsServiceFromEnvKey))
}
if service == "" {
service = config.MustGetString("metrics.serviceName")
}
env := config.MustGetString("env")
if metricsType == "m3" {
if gateway.metricsBackend != nil {
panic("expected no metrics backend in gateway.")
}
opts := m3.Options{
HostPorts: []string{config.MustGetString("metrics.m3.hostPort")},
Service: service,
Env: env,
MaxQueueSize: int(config.MustGetInt("metrics.m3.maxQueueSize")),
MaxPacketSizeBytes: int32(config.MustGetInt("metrics.m3.maxPacketSizeBytes")),
}
if gateway.metricsBackend, err = m3.NewReporter(opts); err != nil {
return err
}
} else if gateway.metricsBackend == nil {
panic("expected gateway to have MetricsBackend in opts")
}
defaultTags := map[string]string{
"env": env,
"service": service,
"dc": gateway.Config.MustGetString("datacenter"),
}
if config.MustGetBoolean("metrics.m3.includeHost") {
defaultTags["host"] = GetHostname()
}
// Adds in any env variable variables specified in config
envVarsToTagInRootScope := []string{}
config.MustGetStruct("envVarsToTagInRootScope", &envVarsToTagInRootScope)
for _, envVarName := range envVarsToTagInRootScope {
envVarValue := os.Getenv(envVarName)
defaultTags[envVarName] = envVarValue
}
gateway.RootScope, gateway.scopeCloser = tally.NewRootScope(
tally.ScopeOptions{
Tags: defaultTags,
CachedReporter: gateway.metricsBackend,
DefaultBuckets: gateway.metricsDefaultBuckets,
Separator: tally.DefaultSeparator,
SanitizeOptions: &m3.DefaultSanitizerOpts,
},
time.Duration(config.MustGetInt("metrics.flushInterval"))*time.Millisecond,
)
gateway.ContextMetrics = NewContextMetrics(gateway.RootScope)
// start collecting runtime metrics
collectInterval := time.Duration(config.MustGetInt("metrics.runtime.collectInterval")) * time.Millisecond
runtimeMetricsOpts := RuntimeMetricsOptions{
EnableCPUMetrics: config.MustGetBoolean("metrics.runtime.enableCPUMetrics"),
EnableMemMetrics: config.MustGetBoolean("metrics.runtime.enableMemMetrics"),
EnableGCMetrics: config.MustGetBoolean("metrics.runtime.enableGCMetrics"),
CollectInterval: collectInterval,
}
// runtime metrics should always have host tag
runtimeScope := gateway.RootScope
if _, ok := defaultTags["host"]; !ok {
runtimeScope = gateway.RootScope.Tagged(map[string]string{
"host": GetHostname(),
})
}
gateway.runtimeMetrics = StartRuntimeMetricsCollector(
runtimeMetricsOpts,
runtimeScope,
)
//Initialize M3Collector for hystrix metrics
c := plugins.InitializeM3Collector(gateway.RootScope)
metricCollector.Registry.Register(c.NewM3Collector)
return nil
}