diff --git a/pkg/metrics/publishers/graphite.go b/pkg/metrics/publishers/graphite.go index 41370558f14..b65ea02468b 100644 --- a/pkg/metrics/publishers/graphite.go +++ b/pkg/metrics/publishers/graphite.go @@ -22,12 +22,12 @@ func CreateGraphitePublisher() (*GraphitePublisher, error) { return nil, nil } - graphiteReceiver := &GraphitePublisher{} - graphiteReceiver.Protocol = "tcp" - graphiteReceiver.Address = graphiteSection.Key("address").MustString("localhost:2003") - graphiteReceiver.Prefix = graphiteSection.Key("prefix").MustString("service.grafana.%(instance_name)s") + publisher := &GraphitePublisher{} + publisher.Protocol = "tcp" + publisher.Address = graphiteSection.Key("address").MustString("localhost:2003") + publisher.Prefix = graphiteSection.Key("prefix").MustString("service.grafana.%(instance_name)s") - return graphiteReceiver, nil + return publisher, nil } func (this *GraphitePublisher) Publish(metrics map[string]interface{}) { diff --git a/pkg/metrics/publishers/influxdb.go b/pkg/metrics/publishers/influxdb.go new file mode 100644 index 00000000000..e53028769e6 --- /dev/null +++ b/pkg/metrics/publishers/influxdb.go @@ -0,0 +1,87 @@ +package publishers + +import ( + "net/url" + "time" + + "github.com/grafana/grafana/pkg/log" + "github.com/grafana/grafana/pkg/setting" + "github.com/influxdata/influxdb/client" +) + +type InfluxPublisher struct { + database string + tags map[string]string + client *client.Client +} + +func CreateInfluxPublisher() (*InfluxPublisher, error) { + influxSection, err := setting.Cfg.GetSection("metrics.influxdb") + if err != nil { + return nil, nil + } + + publisher := &InfluxPublisher{ + tags: make(map[string]string), + } + + urlStr := influxSection.Key("url").MustString("localhost:2003") + urlParsed, err := url.Parse(urlStr) + + if err != nil { + log.Error(3, "Metics: InfluxPublisher: failed to init influxdb publisher", err) + return nil, nil + } + + publisher.database = influxSection.Key("database").MustString("grafana_metrics") + username := influxSection.Key("User").MustString("grafana") + password := influxSection.Key("Password").MustString("grafana") + + publisher.client, err = client.NewClient(client.Config{ + URL: *urlParsed, + Username: username, + Password: password, + }) + + tagsSec, err := setting.Cfg.GetSection("metrics.influxdb.tags") + if err != nil { + log.Error(3, "Metics: InfluxPublisher: failed to init influxdb settings no metrics.influxdb.tags section") + return nil, nil + } + + for _, key := range tagsSec.Keys() { + publisher.tags[key.Name()] = key.String() + } + + if err != nil { + log.Error(3, "Metics: InfluxPublisher: failed to init influxdb publisher", err) + } + + return publisher, nil +} + +func (this *InfluxPublisher) Publish(metrics map[string]interface{}) { + bp := client.BatchPoints{ + Time: time.Now(), + Database: this.database, + Tags: map[string]string{}, + } + + for key, value := range this.tags { + bp.Tags[key] = value + } + + for key, value := range metrics { + bp.Points = append(bp.Points, client.Point{ + Measurement: key, + Fields: map[string]interface{}{ + "value": value, + }, + }) + } + + _, err := this.client.Write(bp) + if err != nil { + log.Error(3, "Metrics: InfluxPublisher: publish error", err) + } +} diff --git a/pkg/metrics/settings.go b/pkg/metrics/settings.go index 285d91e71c0..33e34319e8a 100644 --- a/pkg/metrics/settings.go +++ b/pkg/metrics/settings.go @@ -43,5 +43,12 @@ func readSettings() *MetricSettings { settings.Publishers = append(settings.Publishers, graphitePublisher) } + if influxPublisher, err := publishers.CreateInfluxPublisher(); err != nil { + log.Error(3, "Metrics: Failed to init InfluxDB metric publisher", err) + } else if influxPublisher != nil { + log.Info("Metrics: Internal metrics publisher InfluxDB initialized") + settings.Publishers = append(settings.Publishers, influxPublisher) + } + return settings }