mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
opentracing -> opencensus (#802)
* update vendor directory, add go.opencensus.io * update imports * oops * s/opentracing/opencensus/ & remove prometheus / zipkin stuff & remove old stats * the dep train rides again * fix gin build * deps from last guy * start in on the agent metrics * she builds * remove tags for now, cardinality error is fussing. subscribe instead of register * update to patched version of opencensus to proceed for now TODO switch to a release * meh fix imports * println debug the bad boys * lace it with the tags * update deps again * fix all inconsistent cardinality errors * add our own logger * fix init * fix oom measure * remove bugged removal code * fix s3 measures * fix prom handler nil
This commit is contained in:
@@ -4,6 +4,8 @@ import (
|
||||
"context"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
"go.opencensus.io/tag"
|
||||
"go.opencensus.io/trace"
|
||||
)
|
||||
|
||||
type contextKey string
|
||||
@@ -22,11 +24,35 @@ func Logger(ctx context.Context) logrus.FieldLogger {
|
||||
return l
|
||||
}
|
||||
|
||||
// Attempt at simplifying this whole logger in the context thing
|
||||
// Could even make this take a generic map, then the logger that gets returned could be used just like the stdlib too, since it's compatible
|
||||
// LoggerWithFields returns a child context of the provided parent that
|
||||
// contains a logger with additional fields from the parent's logger, it
|
||||
// returns the new child logger, as well.
|
||||
func LoggerWithFields(ctx context.Context, fields logrus.Fields) (context.Context, logrus.FieldLogger) {
|
||||
l := Logger(ctx)
|
||||
l = l.WithFields(fields)
|
||||
ctx = WithLogger(ctx, l)
|
||||
return ctx, l
|
||||
}
|
||||
|
||||
// BackgroundContext returns a context that is specifically not a child of the
|
||||
// provided parent context wrt any cancellation or deadline of the parent,
|
||||
// returning a context that contains all values only. At present, this is a
|
||||
// best effort as there is not a great way to extract all values, known values:
|
||||
// * logger
|
||||
// * span
|
||||
// * tags
|
||||
// (TODO(reed): we could have our own context.Context implementer that stores
|
||||
// all values from WithValue in a bucket we could extract more easily?)
|
||||
func BackgroundContext(ctx context.Context) context.Context {
|
||||
logger := Logger(ctx)
|
||||
span := trace.FromContext(ctx)
|
||||
tagMap := tag.FromContext(ctx)
|
||||
|
||||
// fresh context
|
||||
ctx = context.Background()
|
||||
|
||||
ctx = tag.NewContext(ctx, tagMap)
|
||||
ctx = trace.WithSpan(ctx, span)
|
||||
ctx = WithLogger(ctx, logger)
|
||||
return ctx
|
||||
}
|
||||
|
||||
@@ -1,140 +0,0 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/opentracing/opentracing-go"
|
||||
"github.com/opentracing/opentracing-go/log"
|
||||
)
|
||||
|
||||
// IncrementGauge increments the specified gauge metric
|
||||
// It does this by logging an appropriate field value to a tracing span.
|
||||
func IncrementGauge(ctx context.Context, metric string) {
|
||||
// The field name we use is the specified metric name prepended with FieldnamePrefixGauge to designate that it is a Prometheus gauge metric
|
||||
// The collector will replace that prefix with "fn_" and use the result as the Prometheus metric name.
|
||||
fieldname := FieldnamePrefixGauge + metric
|
||||
|
||||
// Spans are not processed by the collector until the span ends, so to prevent any delay
|
||||
// in processing the stats when the current span is long-lived we create a new span for every call
|
||||
// suffix the span name with SpannameSuffixDummy to denote that it is used only to hold a metric and isn't itself of any interest
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, fieldname+SpannameSuffixDummy)
|
||||
defer span.Finish()
|
||||
|
||||
// gauge metrics are actually float64; here we log that it should be increased by +1
|
||||
span.LogFields(log.Float64(fieldname, 1.))
|
||||
}
|
||||
|
||||
// DecrementGauge decrements the specified gauge metric
|
||||
// It does this by logging an appropriate field value to a tracing span.
|
||||
func DecrementGauge(ctx context.Context, metric string) {
|
||||
// The field name we use is the specified metric name prepended with FieldnamePrefixGauge to designate that it is a Prometheus gauge metric
|
||||
// The collector will replace that prefix with "fn_" and use the result as the Prometheus metric name.
|
||||
fieldname := FieldnamePrefixGauge + metric
|
||||
|
||||
// Spans are not processed by the collector until the span ends, so to prevent any delay
|
||||
// in processing the stats when the current span is long-lived we create a new span for every call.
|
||||
// suffix the span name with SpannameSuffixDummy to denote that it is used only to hold a metric and isn't itself of any interest
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, fieldname+SpannameSuffixDummy)
|
||||
defer span.Finish()
|
||||
|
||||
// gauge metrics are actually float64; here we log that it should be increased by -1
|
||||
span.LogFields(log.Float64(fieldname, -1.))
|
||||
}
|
||||
|
||||
// IncrementCounter increments the specified counter metric
|
||||
// It does this by logging an appropriate field value to a tracing span.
|
||||
func IncrementCounter(ctx context.Context, metric string) {
|
||||
// The field name we use is the specified metric name prepended with FieldnamePrefixCounter to designate that it is a Prometheus counter metric
|
||||
// The collector will replace that prefix with "fn_" and use the result as the Prometheus metric name.
|
||||
fieldname := FieldnamePrefixCounter + metric
|
||||
|
||||
// Spans are not processed by the collector until the span ends, so to prevent any delay
|
||||
// in processing the stats when the current span is long-lived we create a new span for every call.
|
||||
// suffix the span name with SpannameSuffixDummy to denote that it is used only to hold a metric and isn't itself of any interest
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, fieldname+SpannameSuffixDummy)
|
||||
defer span.Finish()
|
||||
|
||||
// counter metrics are actually float64; here we log that it should be increased by +1
|
||||
span.LogFields(log.Float64(fieldname, 1.))
|
||||
}
|
||||
|
||||
// If required, create a scalar version of PublishHistograms that publishes a single histogram metric
|
||||
|
||||
// PublishHistograms publishes the specifed histogram metrics
|
||||
// It does this by logging appropriate field values to a tracing span
|
||||
// Use this when the current tracing span is long-lived and you want the metric to be visible before it ends
|
||||
func PublishHistograms(ctx context.Context, metrics map[string]float64) {
|
||||
|
||||
// Spans are not processed by the collector until the span ends, so to prevent any delay
|
||||
// in processing the stats when the current span is long-lived we create a new span for every call.
|
||||
// suffix the span name with SpannameSuffixDummy to denote that it is used only to hold a metric and isn't itself of any interest
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "histogram_metrics"+SpannameSuffixDummy)
|
||||
defer span.Finish()
|
||||
|
||||
for key, value := range metrics {
|
||||
// The field name we use is the metric name prepended with FieldnamePrefixHistogram to designate that it is a Prometheus histogram metric
|
||||
// The collector will replace that prefix with "fn_" and use the result as the Prometheus metric name.
|
||||
fieldname := FieldnamePrefixHistogram + key
|
||||
span.LogFields(log.Float64(fieldname, value))
|
||||
}
|
||||
}
|
||||
|
||||
// PublishHistogram publishes the specifed histogram metric
|
||||
// It does this by logging an appropriate field value to a tracing span
|
||||
// Use this when the current tracing span is long-lived and you want the metric to be visible before it ends
|
||||
func PublishHistogram(ctx context.Context, key string, value float64) {
|
||||
|
||||
// Spans are not processed by the collector until the span ends, so to prevent any delay
|
||||
// in processing the stats when the current span is long-lived we create a new span for every call.
|
||||
// suffix the span name with SpannameSuffixDummy to denote that it is used only to hold a metric and isn't itself of any interest
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "histogram_metrics"+SpannameSuffixDummy)
|
||||
defer span.Finish()
|
||||
|
||||
// The field name we use is the metric name prepended with FieldnamePrefixHistogram to designate that it is a Prometheus histogram metric
|
||||
// The collector will replace that prefix with "fn_" and use the result as the Prometheus metric name.
|
||||
fieldname := FieldnamePrefixHistogram + key
|
||||
span.LogFields(log.Float64(fieldname, value))
|
||||
}
|
||||
|
||||
// PublishHistogramToSpan publishes the specifed histogram metric
|
||||
// It does this by logging an appropriate field value to the specified tracing span
|
||||
// Use this when you don't need to create a new tracing span
|
||||
func PublishHistogramToSpan(span opentracing.Span, key string, value float64) {
|
||||
|
||||
// The field name we use is the metric name prepended with FieldnamePrefixHistogram to designate that it is a Prometheus histogram metric
|
||||
// The collector will replace that prefix with "fn_" and use the result as the Prometheus metric name.
|
||||
fieldname := FieldnamePrefixHistogram + key
|
||||
span.LogFields(log.Float64(fieldname, value))
|
||||
}
|
||||
|
||||
// PublishElapsedTimeToSpan publishes the specifed histogram elapsed time since start
|
||||
// It does this by logging an appropriate field value to a tracing span
|
||||
// Use this when the current tracing span is long-lived and you want the metric to be visible before it ends
|
||||
func PublishElapsedTimeHistogram(ctx context.Context, key string, start, end time.Time) {
|
||||
elapsed := float64(end.Sub(start).Seconds())
|
||||
PublishHistogram(ctx, key, elapsed)
|
||||
}
|
||||
|
||||
const (
|
||||
|
||||
// FnPrefix is a constant for "fn_", used as a prefix for span names, field names, Prometheus metric names and Prometheus label names
|
||||
FnPrefix = "fn_"
|
||||
|
||||
// FieldnamePrefixHistogram is prefixed to the name of a logged field
|
||||
// to denote that it corresponds to a histogram metric
|
||||
FieldnamePrefixHistogram = FnPrefix + "histogram_"
|
||||
|
||||
// FieldnamePrefixCounter is prefixed to the name of a logged field
|
||||
// to denote that it corresponds to a counter metric
|
||||
FieldnamePrefixCounter = FnPrefix + "counter_"
|
||||
|
||||
// FieldnamePrefixGauge is prefixed to the name of a logged field
|
||||
// to denote that it corresponds to a gauge metric
|
||||
FieldnamePrefixGauge = FnPrefix + "gauge_"
|
||||
|
||||
// SpannameSuffixDummy is suffixed to the name of a tracing span
|
||||
// to denote that it has been created solely for the purpose of carrying metric values
|
||||
// and is not itself of any interest and should not be converted to a Prometheus duration metric
|
||||
SpannameSuffixDummy = "_dummy"
|
||||
)
|
||||
Reference in New Issue
Block a user