func()

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
}