diff --git a/cmd/prometheus/config.go b/cmd/prometheus/config.go index 585619bb2..1f5c099d0 100644 --- a/cmd/prometheus/config.go +++ b/cmd/prometheus/config.go @@ -163,6 +163,18 @@ func init() { ) // Remote storage. + cfg.fs.StringVar( + &cfg.remote.GraphiteAddress, "storage.remote.graphite-address", "", + "The host:port of the remote Graphite server to send samples to. None, if empty.", + ) + cfg.fs.StringVar( + &cfg.remote.GraphiteTransport, "storage.remote.graphite-transport", "tcp", + "Transport protocol to use to communicate with Graphite. 'tcp', if empty.", + ) + cfg.fs.StringVar( + &cfg.remote.GraphitePrefix, "storage.remote.graphite-prefix", "", + "The prefix to prepend to all metrics exported to Graphite. None, if empty.", + ) cfg.fs.StringVar( &cfg.remote.OpentsdbURL, "storage.remote.opentsdb-url", "", "The URL of the remote OpenTSDB server to send samples to. None, if empty.", diff --git a/storage/remote/graphite/client.go b/storage/remote/graphite/client.go new file mode 100644 index 000000000..7aa5a3efe --- /dev/null +++ b/storage/remote/graphite/client.go @@ -0,0 +1,107 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package graphite + +import ( + "bytes" + "fmt" + "math" + "net" + "sort" + "time" + + "github.com/prometheus/common/log" + "github.com/prometheus/common/model" +) + +// Client allows sending batches of Prometheus samples to Graphite. +type Client struct { + address string + transport string + timeout time.Duration + prefix string +} + +// NewClient creates a new Client. +func NewClient(address string, transport string, timeout time.Duration, prefix string) *Client { + return &Client{ + address: address, + transport: transport, + timeout: timeout, + prefix: prefix, + } +} + +func pathFromMetric(m model.Metric, prefix string) string { + var buffer bytes.Buffer + + buffer.WriteString(prefix) + buffer.WriteString(escape(m[model.MetricNameLabel])) + + // We want to sort the labels. + labels := make(model.LabelNames, 0, len(m)) + for l, _ := range m { + labels = append(labels, l) + } + sort.Sort(labels) + + // For each label, in order, add ".