event-exporter/sinks/stackdriver/metrics.go (65 lines of code) (raw):
package stackdriver
import (
"time"
"github.com/golang/glog"
"github.com/prometheus/client_golang/prometheus"
sd "google.golang.org/api/logging/v2"
)
var (
receivedEntryCount = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "received_entry_count",
Help: "Number of entries received by the Stackdriver sink",
Subsystem: "stackdriver_sink",
},
)
requestCount = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "request_count",
Help: "Number of request, issued to Stackdriver API",
Subsystem: "stackdriver_sink",
},
[]string{"code"},
)
successfullySentEntryCount = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "successfully_sent_entry_count",
Help: "Number of entries successfully ingested by Stackdriver",
Subsystem: "stackdriver_sink",
},
)
recordLatency = prometheus.NewHistogram(
prometheus.HistogramOpts{
Name: "records_latency_seconds",
Help: "Log entry latency between log timestamp and delivery to StackDriver.",
Subsystem: "stackdriver_sink",
// Highest bucket start at 2 sec * 1.5^19 = 4433.68 sec
Buckets: prometheus.ExponentialBuckets(2, 1.5, 20),
},
)
)
func init() {
prometheus.MustRegister(
receivedEntryCount,
successfullySentEntryCount,
requestCount,
recordLatency,
)
}
func measureLatencyOnSuccess(entries []*sd.LogEntry) {
samples := make([]time.Time, 0)
for _, e := range entries {
// Do not measure latency if a log entry does not have a timestamp.
if e.Timestamp == "" {
continue
}
t, err := time.Parse(time.RFC3339Nano, e.Timestamp)
if err != nil {
glog.Warningf("Failed to parse timestamp: %s", e.Timestamp)
continue
}
samples = append(samples, t)
}
now := time.Now()
for _, ts := range samples {
recordLatency.Observe(now.Sub(ts).Seconds())
}
}