mirror of
https://github.com/sourcegraph/sourcegraph.git
synced 2026-02-06 17:31:43 +00:00
cody-gateway: push GCP metrics or publish Prometheus metrics via OpenTelemetry (#55134)
Our first usage of [the recently stabilized OpenTelemetry metrics](https://opentelemetry.io/docs/specs/otel/metrics/) 😁 Currently this is Cody-Gateway-specific, nothing is added for Sourcegraph as a whole. We add the following: - If a GCP project is configured, we set up a GCP exporter that pushes metrics periodically and on shutdown. It's important this is push-based as Cloud Run instances are ephemeral. - Otherwise, we set up a Prometheus exporter that works the same as using the Prometheus SDK, where metrics are exported in `/metrics` (set up by debugserver) and Prometheus scrapes periodically. To start off I've added a simple gauge that records concurrent ongoing requests to upstream Cody Gateway services - see test plan below. Closes https://github.com/sourcegraph/sourcegraph/issues/53775 ## Test plan I've only tested the Prometheus exporter. Hopefully the GCP one will "just work" - the configuration is very similar to the one used in the tracing equivalent, and that one "just worked". ``` sg start dotcom sg run prometheus ``` See target picked up: <img width="1145" alt="Screenshot 2023-07-19 at 7 09 31 PM" src="https://github.com/sourcegraph/sourcegraph/assets/23356519/c9aa4c06-c817-400e-9086-c8ed6997844e"> Talk to Cody aggressively: <img width="1705" alt="image" src="https://github.com/sourcegraph/sourcegraph/assets/23356519/fbda23c7-565f-4a11-ae1b-1bdd8fbceca1">
This commit is contained in:
parent
617136548a
commit
294fe3df22
@ -30,5 +30,9 @@ go_library(
|
||||
"@com_github_sourcegraph_log//hook",
|
||||
"@com_github_sourcegraph_log//output",
|
||||
"@io_opentelemetry_go_contrib_instrumentation_net_http_otelhttp//:otelhttp",
|
||||
"@io_opentelemetry_go_otel//:otel",
|
||||
"@io_opentelemetry_go_otel//attribute",
|
||||
"@io_opentelemetry_go_otel_metric//:metric",
|
||||
"@org_uber_go_atomic//:atomic",
|
||||
],
|
||||
)
|
||||
|
||||
@ -1,11 +1,16 @@
|
||||
package httpapi
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/sourcegraph/log"
|
||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/metric"
|
||||
"go.uber.org/atomic"
|
||||
|
||||
"github.com/sourcegraph/sourcegraph/cmd/cody-gateway/internal/auth"
|
||||
"github.com/sourcegraph/sourcegraph/cmd/cody-gateway/internal/events"
|
||||
@ -17,6 +22,7 @@ import (
|
||||
"github.com/sourcegraph/sourcegraph/cmd/cody-gateway/internal/notify"
|
||||
"github.com/sourcegraph/sourcegraph/internal/httpcli"
|
||||
"github.com/sourcegraph/sourcegraph/internal/instrumentation"
|
||||
"github.com/sourcegraph/sourcegraph/lib/errors"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
@ -30,6 +36,14 @@ type Config struct {
|
||||
EmbeddingsAllowedModels []string
|
||||
}
|
||||
|
||||
var meter = otel.GetMeterProvider().Meter("cody-gateway/internal/httpapi")
|
||||
|
||||
var (
|
||||
attributesAnthropicCompletions = newMetricAttributes("anthropic", "completions")
|
||||
attributesOpenAICompletions = newMetricAttributes("openai", "completions")
|
||||
attributesOpenAIEmbeddings = newMetricAttributes("openai", "embeddings")
|
||||
)
|
||||
|
||||
func NewHandler(
|
||||
logger log.Logger,
|
||||
eventLogger events.Logger,
|
||||
@ -37,7 +51,25 @@ func NewHandler(
|
||||
httpClient httpcli.Doer,
|
||||
authr *auth.Authenticator,
|
||||
config *Config,
|
||||
) http.Handler {
|
||||
) (http.Handler, error) {
|
||||
// Initialize metrics
|
||||
anthropicCompletionsRequests := atomic.NewInt64(0)
|
||||
openaiCompletionsRequests := atomic.NewInt64(0)
|
||||
openaiEmbeddingsRequests := atomic.NewInt64(0)
|
||||
if _, err := meter.Int64ObservableGauge("concurrent_upstream_requests",
|
||||
metric.WithDescription("number of concurrent active requests for upstream services"),
|
||||
metric.WithInt64Callback(func(_ context.Context, o metric.Int64Observer) error {
|
||||
o.Observe(anthropicCompletionsRequests.Load(),
|
||||
metric.WithAttributeSet(attributesAnthropicCompletions))
|
||||
o.Observe(openaiCompletionsRequests.Load(),
|
||||
metric.WithAttributeSet(attributesOpenAICompletions))
|
||||
o.Observe(openaiEmbeddingsRequests.Load(),
|
||||
metric.WithAttributeSet(attributesOpenAIEmbeddings))
|
||||
return nil
|
||||
})); err != nil {
|
||||
return nil, errors.Wrap(err, "init metric concurrent_upstream_requests")
|
||||
}
|
||||
|
||||
// Add a prefix to the store for globally unique keys and simpler pruning.
|
||||
rs = limiter.NewPrefixRedisStore("rate_limit:", rs)
|
||||
r := mux.NewRouter()
|
||||
@ -48,18 +80,21 @@ func NewHandler(
|
||||
if config.AnthropicAccessToken != "" {
|
||||
v1router.Path("/completions/anthropic").Methods(http.MethodPost).Handler(
|
||||
instrumentation.HTTPMiddleware("v1.completions.anthropic",
|
||||
authr.Middleware(
|
||||
requestlogger.Middleware(
|
||||
logger,
|
||||
completions.NewAnthropicHandler(
|
||||
gaugeHandler(
|
||||
anthropicCompletionsRequests,
|
||||
authr.Middleware(
|
||||
requestlogger.Middleware(
|
||||
logger,
|
||||
eventLogger,
|
||||
rs,
|
||||
config.RateLimitNotifier,
|
||||
httpClient,
|
||||
config.AnthropicAccessToken,
|
||||
config.AnthropicAllowedModels,
|
||||
config.AnthropicMaxTokensToSample,
|
||||
completions.NewAnthropicHandler(
|
||||
logger,
|
||||
eventLogger,
|
||||
rs,
|
||||
config.RateLimitNotifier,
|
||||
httpClient,
|
||||
config.AnthropicAccessToken,
|
||||
config.AnthropicAllowedModels,
|
||||
config.AnthropicMaxTokensToSample,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -70,18 +105,21 @@ func NewHandler(
|
||||
if config.OpenAIAccessToken != "" {
|
||||
v1router.Path("/completions/openai").Methods(http.MethodPost).Handler(
|
||||
instrumentation.HTTPMiddleware("v1.completions.openai",
|
||||
authr.Middleware(
|
||||
requestlogger.Middleware(
|
||||
logger,
|
||||
completions.NewOpenAIHandler(
|
||||
gaugeHandler(
|
||||
openaiCompletionsRequests,
|
||||
authr.Middleware(
|
||||
requestlogger.Middleware(
|
||||
logger,
|
||||
eventLogger,
|
||||
rs,
|
||||
config.RateLimitNotifier,
|
||||
httpClient,
|
||||
config.OpenAIAccessToken,
|
||||
config.OpenAIOrgID,
|
||||
config.OpenAIAllowedModels,
|
||||
completions.NewOpenAIHandler(
|
||||
logger,
|
||||
eventLogger,
|
||||
rs,
|
||||
config.RateLimitNotifier,
|
||||
httpClient,
|
||||
config.OpenAIAccessToken,
|
||||
config.OpenAIOrgID,
|
||||
config.OpenAIAllowedModels,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -103,18 +141,24 @@ func NewHandler(
|
||||
|
||||
v1router.Path("/embeddings").Methods(http.MethodPost).Handler(
|
||||
instrumentation.HTTPMiddleware("v1.embeddings",
|
||||
authr.Middleware(
|
||||
requestlogger.Middleware(
|
||||
logger,
|
||||
embeddings.NewHandler(
|
||||
gaugeHandler(
|
||||
// TODO - if embeddings.ModelFactoryMap includes more than
|
||||
// just OpenAI we might need to move how we count concurrent
|
||||
// requests into the handler
|
||||
openaiEmbeddingsRequests,
|
||||
authr.Middleware(
|
||||
requestlogger.Middleware(
|
||||
logger,
|
||||
eventLogger,
|
||||
rs,
|
||||
config.RateLimitNotifier,
|
||||
embeddings.ModelFactoryMap{
|
||||
embeddings.ModelNameOpenAIAda: embeddings.NewOpenAIClient(httpClient, config.OpenAIAccessToken),
|
||||
},
|
||||
config.EmbeddingsAllowedModels,
|
||||
embeddings.NewHandler(
|
||||
logger,
|
||||
eventLogger,
|
||||
rs,
|
||||
config.RateLimitNotifier,
|
||||
embeddings.ModelFactoryMap{
|
||||
embeddings.ModelNameOpenAIAda: embeddings.NewOpenAIClient(httpClient, config.OpenAIAccessToken),
|
||||
},
|
||||
config.EmbeddingsAllowedModels,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
@ -136,5 +180,21 @@ func NewHandler(
|
||||
),
|
||||
)
|
||||
|
||||
return r
|
||||
return r, nil
|
||||
}
|
||||
|
||||
func newMetricAttributes(provider string, feature string) attribute.Set {
|
||||
return attribute.NewSet(
|
||||
attribute.String("provider", provider),
|
||||
attribute.String("feature", feature))
|
||||
}
|
||||
|
||||
// gaugeHandler increments gauge when handling the request and decrements it
|
||||
// upon completion.
|
||||
func gaugeHandler(gauge *atomic.Int64, handler http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
gauge.Inc()
|
||||
handler.ServeHTTP(w, r)
|
||||
gauge.Dec()
|
||||
})
|
||||
}
|
||||
|
||||
@ -6,6 +6,7 @@ go_library(
|
||||
srcs = [
|
||||
"config.go",
|
||||
"main.go",
|
||||
"metrics.go",
|
||||
"service.go",
|
||||
"tracing.go",
|
||||
],
|
||||
@ -41,8 +42,10 @@ go_library(
|
||||
"@com_github_go_redsync_redsync_v4//:redsync",
|
||||
"@com_github_go_redsync_redsync_v4//redis/redigo",
|
||||
"@com_github_gomodule_redigo//redis",
|
||||
"@com_github_googlecloudplatform_opentelemetry_operations_go_exporter_metric//:metric",
|
||||
"@com_github_googlecloudplatform_opentelemetry_operations_go_exporter_trace//:trace",
|
||||
"@com_github_slack_go_slack//:slack",
|
||||
"@com_github_sourcegraph_conc//:conc",
|
||||
"@com_github_sourcegraph_log//:log",
|
||||
"@io_opentelemetry_go_contrib_detectors_gcp//:gcp",
|
||||
"@io_opentelemetry_go_contrib_instrumentation_net_http_otelhttp//:otelhttp",
|
||||
@ -50,5 +53,6 @@ go_library(
|
||||
"@io_opentelemetry_go_otel//semconv/v1.7.0:v1_7_0",
|
||||
"@io_opentelemetry_go_otel_sdk//resource",
|
||||
"@io_opentelemetry_go_otel_sdk//trace",
|
||||
"@io_opentelemetry_go_otel_sdk_metric//:metric",
|
||||
],
|
||||
)
|
||||
|
||||
@ -55,14 +55,14 @@ type Config struct {
|
||||
EventBufferWorkers int
|
||||
}
|
||||
|
||||
Trace TraceConfig
|
||||
OpenTelemetry OpenTelemetryConfig
|
||||
|
||||
ActorConcurrencyLimit codygateway.ActorConcurrencyLimitConfig
|
||||
ActorRateLimitNotify codygateway.ActorRateLimitNotifyConfig
|
||||
}
|
||||
|
||||
type TraceConfig struct {
|
||||
Policy policy.TracePolicy
|
||||
type OpenTelemetryConfig struct {
|
||||
TracePolicy policy.TracePolicy
|
||||
GCPProjectID string
|
||||
}
|
||||
|
||||
@ -120,8 +120,8 @@ func (c *Config) Load() {
|
||||
c.BigQuery.EventBufferWorkers = c.GetInt("CODY_GATEWAY_BIGQUERY_EVENT_BUFFER_WORKERS", "0",
|
||||
"The number of workers to process events - set to 0 to use a default that scales off buffer size.")
|
||||
|
||||
c.Trace.Policy = policy.TracePolicy(c.Get("CODY_GATEWAY_TRACE_POLICY", "all", "Trace policy, one of 'all', 'selective', 'none'."))
|
||||
c.Trace.GCPProjectID = c.Get("CODY_GATEWAY_TRACE_GCP_PROJECT_ID", os.Getenv("GOOGLE_CLOUD_PROJECT"), "Google Cloud Traces project ID.")
|
||||
c.OpenTelemetry.TracePolicy = policy.TracePolicy(c.Get("CODY_GATEWAY_TRACE_POLICY", "all", "Trace policy, one of 'all', 'selective', 'none'."))
|
||||
c.OpenTelemetry.GCPProjectID = c.Get("CODY_GATEWAY_OTEL_GCP_PROJECT_ID", os.Getenv("GOOGLE_CLOUD_PROJECT"), "Google Cloud Traces project ID.")
|
||||
|
||||
c.ActorConcurrencyLimit.Percentage = float32(c.GetPercent("CODY_GATEWAY_ACTOR_CONCURRENCY_LIMIT_PERCENTAGE", "50", "The percentage of daily rate limit to be allowed as concurrent requests limit from an actor.")) / 100
|
||||
c.ActorConcurrencyLimit.Interval = c.GetInterval("CODY_GATEWAY_ACTOR_CONCURRENCY_LIMIT_INTERVAL", "10s", "The interval at which to check the concurrent requests limit from an actor.")
|
||||
|
||||
@ -12,8 +12,12 @@ import (
|
||||
"github.com/go-redsync/redsync/v4/redis/redigo"
|
||||
"github.com/gomodule/redigo/redis"
|
||||
"github.com/slack-go/slack"
|
||||
"github.com/sourcegraph/conc"
|
||||
"github.com/sourcegraph/log"
|
||||
"go.opentelemetry.io/contrib/detectors/gcp"
|
||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||
"go.opentelemetry.io/otel/sdk/resource"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||
|
||||
"github.com/sourcegraph/sourcegraph/cmd/cody-gateway/internal/auth"
|
||||
"github.com/sourcegraph/sourcegraph/cmd/cody-gateway/internal/events"
|
||||
@ -28,6 +32,7 @@ import (
|
||||
"github.com/sourcegraph/sourcegraph/internal/redispool"
|
||||
"github.com/sourcegraph/sourcegraph/internal/requestclient"
|
||||
"github.com/sourcegraph/sourcegraph/internal/service"
|
||||
"github.com/sourcegraph/sourcegraph/internal/version"
|
||||
"github.com/sourcegraph/sourcegraph/lib/errors"
|
||||
|
||||
"github.com/sourcegraph/sourcegraph/cmd/cody-gateway/internal/actor"
|
||||
@ -39,15 +44,11 @@ import (
|
||||
)
|
||||
|
||||
func Main(ctx context.Context, obctx *observation.Context, ready service.ReadyFunc, config *Config) error {
|
||||
// Enable tracing, at this point tracing wouldn't have been enabled yet because
|
||||
// we run Cody Gateway without conf which means Sourcegraph tracing is not enabled.
|
||||
shutdownTracing, err := maybeEnableTracing(ctx,
|
||||
obctx.Logger.Scoped("tracing", "tracing configuration"),
|
||||
config.Trace)
|
||||
shutdownOtel, err := initOpenTelemetry(ctx, obctx.Logger, config.OpenTelemetry)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "maybeEnableTracing")
|
||||
return errors.Wrap(err, "initOpenTelemetry")
|
||||
}
|
||||
defer shutdownTracing()
|
||||
defer shutdownOtel()
|
||||
|
||||
var eventLogger events.Logger
|
||||
if config.BigQuery.ProjectID != "" {
|
||||
@ -138,7 +139,7 @@ func Main(ctx context.Context, obctx *observation.Context, ready service.ReadyFu
|
||||
|
||||
// Set up our handler chain, which is run from the bottom up. Application handlers
|
||||
// come last.
|
||||
handler := httpapi.NewHandler(obctx.Logger, eventLogger, rs, httpClient, authr, &httpapi.Config{
|
||||
handler, err := httpapi.NewHandler(obctx.Logger, eventLogger, rs, httpClient, authr, &httpapi.Config{
|
||||
RateLimitNotifier: rateLimitNotifier,
|
||||
AnthropicAccessToken: config.Anthropic.AccessToken,
|
||||
AnthropicAllowedModels: config.Anthropic.AllowedModels,
|
||||
@ -148,6 +149,9 @@ func Main(ctx context.Context, obctx *observation.Context, ready service.ReadyFu
|
||||
OpenAIAllowedModels: config.OpenAI.AllowedModels,
|
||||
EmbeddingsAllowedModels: config.AllowedEmbeddingsModels,
|
||||
})
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "httpapi.NewHandler")
|
||||
}
|
||||
|
||||
// Diagnostic layers
|
||||
handler = httpapi.NewDiagnosticsHandler(obctx.Logger, handler, config.DiagnosticsSecret, sources)
|
||||
@ -229,3 +233,48 @@ func (s *redisStore) TTL(key string) (int, error) {
|
||||
func (s *redisStore) Expire(key string, ttlSeconds int) error {
|
||||
return s.store.Expire(key, ttlSeconds)
|
||||
}
|
||||
|
||||
func initOpenTelemetry(ctx context.Context, logger log.Logger, config OpenTelemetryConfig) (func(), error) {
|
||||
res, err := getOpenTelemetryResource(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Enable tracing, at this point tracing wouldn't have been enabled yet because
|
||||
// we run Cody Gateway without conf which means Sourcegraph tracing is not enabled.
|
||||
shutdownTracing, err := maybeEnableTracing(ctx,
|
||||
logger.Scoped("tracing", "OpenTelemetry tracing"),
|
||||
config, res)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "maybeEnableTracing")
|
||||
}
|
||||
|
||||
shutdownMetrics, err := maybeEnableMetrics(ctx,
|
||||
logger.Scoped("metrics", "OpenTelemetry metrics"),
|
||||
config, res)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "maybeEnableMetrics")
|
||||
}
|
||||
|
||||
return func() {
|
||||
var wg conc.WaitGroup
|
||||
wg.Go(shutdownTracing)
|
||||
wg.Go(shutdownMetrics)
|
||||
wg.Wait()
|
||||
}, nil
|
||||
}
|
||||
|
||||
func getOpenTelemetryResource(ctx context.Context) (*resource.Resource, error) {
|
||||
// Identify your application using resource detection
|
||||
return resource.New(ctx,
|
||||
// Use the GCP resource detector to detect information about the GCP platform
|
||||
resource.WithDetectors(gcp.NewDetector()),
|
||||
// Keep the default detectors
|
||||
resource.WithTelemetrySDK(),
|
||||
// Add your own custom attributes to identify your application
|
||||
resource.WithAttributes(
|
||||
semconv.ServiceNameKey.String("cody-gateway"),
|
||||
semconv.ServiceVersionKey.String(version.Version()),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
58
cmd/cody-gateway/shared/metrics.go
Normal file
58
cmd/cody-gateway/shared/metrics.go
Normal file
@ -0,0 +1,58 @@
|
||||
package shared
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
gcpmetricexporter "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric"
|
||||
"github.com/sourcegraph/log"
|
||||
"go.opentelemetry.io/otel"
|
||||
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
|
||||
"go.opentelemetry.io/otel/sdk/resource"
|
||||
|
||||
"github.com/sourcegraph/sourcegraph/internal/tracer/oteldefaults/exporters"
|
||||
"github.com/sourcegraph/sourcegraph/lib/errors"
|
||||
)
|
||||
|
||||
func maybeEnableMetrics(_ context.Context, logger log.Logger, config OpenTelemetryConfig, otelResource *resource.Resource) (func(), error) {
|
||||
var reader sdkmetric.Reader
|
||||
if config.GCPProjectID != "" {
|
||||
logger.Info("initializing GCP trace exporter", log.String("projectID", config.GCPProjectID))
|
||||
exporter, err := gcpmetricexporter.New(
|
||||
gcpmetricexporter.WithProjectID(config.GCPProjectID))
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "gcpmetricexporter.New")
|
||||
}
|
||||
reader = sdkmetric.NewPeriodicReader(exporter,
|
||||
sdkmetric.WithInterval(30*time.Second))
|
||||
} else {
|
||||
logger.Info("initializing Prometheus exporter")
|
||||
var err error
|
||||
reader, err = exporters.NewPrometheusExporter()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "exporters.NewPrometheusExporter")
|
||||
}
|
||||
}
|
||||
|
||||
// Create and set global tracer
|
||||
provider := sdkmetric.NewMeterProvider(
|
||||
sdkmetric.WithReader(reader),
|
||||
sdkmetric.WithResource(otelResource))
|
||||
otel.SetMeterProvider(provider)
|
||||
|
||||
logger.Info("metrics configured")
|
||||
return func() {
|
||||
shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
|
||||
start := time.Now()
|
||||
logger.Info("Shutting down metrics")
|
||||
if err := provider.ForceFlush(shutdownCtx); err != nil {
|
||||
logger.Warn("error occurred force-flushing metrics", log.Error(err))
|
||||
}
|
||||
if err := provider.Shutdown(shutdownCtx); err != nil {
|
||||
logger.Warn("error occured shutting down metrics", log.Error(err))
|
||||
}
|
||||
logger.Info("metrics shut down", log.Duration("elapsed", time.Since(start)))
|
||||
}, nil
|
||||
}
|
||||
@ -7,16 +7,13 @@ import (
|
||||
"github.com/sourcegraph/log"
|
||||
|
||||
gcptraceexporter "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace"
|
||||
"go.opentelemetry.io/contrib/detectors/gcp"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/sdk/resource"
|
||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||
|
||||
"github.com/sourcegraph/sourcegraph/internal/trace/policy"
|
||||
"github.com/sourcegraph/sourcegraph/internal/tracer/oteldefaults"
|
||||
"github.com/sourcegraph/sourcegraph/internal/tracer/oteldefaults/exporters"
|
||||
"github.com/sourcegraph/sourcegraph/internal/version"
|
||||
"github.com/sourcegraph/sourcegraph/lib/errors"
|
||||
)
|
||||
|
||||
@ -25,9 +22,9 @@ import (
|
||||
// and the use case is more niche as a standalone service.
|
||||
//
|
||||
// Based on https://cloud.google.com/trace/docs/setup/go-ot
|
||||
func maybeEnableTracing(ctx context.Context, logger log.Logger, config TraceConfig) (func(), error) {
|
||||
func maybeEnableTracing(ctx context.Context, logger log.Logger, config OpenTelemetryConfig, otelResource *resource.Resource) (func(), error) {
|
||||
// Set globals
|
||||
policy.SetTracePolicy(config.Policy)
|
||||
policy.SetTracePolicy(config.TracePolicy)
|
||||
otel.SetTextMapPropagator(oteldefaults.Propagator())
|
||||
otel.SetErrorHandler(otel.ErrorHandlerFunc(func(err error) {
|
||||
logger.Debug("OpenTelemetry error", log.Error(err))
|
||||
@ -50,34 +47,17 @@ func maybeEnableTracing(ctx context.Context, logger log.Logger, config TraceConf
|
||||
} else {
|
||||
logger.Info("initializing OTLP exporter")
|
||||
var err error
|
||||
exporter, err = exporters.NewOTLPExporter(ctx, logger)
|
||||
exporter, err = exporters.NewOTLPTraceExporter(ctx, logger)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "exporters.NewOTLPExporter")
|
||||
}
|
||||
}
|
||||
|
||||
// Identify your application using resource detection
|
||||
res, err := resource.New(ctx,
|
||||
// Use the GCP resource detector to detect information about the GCP platform
|
||||
resource.WithDetectors(gcp.NewDetector()),
|
||||
// Keep the default detectors
|
||||
resource.WithTelemetrySDK(),
|
||||
// Add your own custom attributes to identify your application
|
||||
resource.WithAttributes(
|
||||
semconv.ServiceNameKey.String("cody-gateway"),
|
||||
semconv.ServiceVersionKey.String(version.Version()),
|
||||
),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "resource.New")
|
||||
}
|
||||
|
||||
// Create and set global tracer
|
||||
tp := sdktrace.NewTracerProvider(
|
||||
provider := sdktrace.NewTracerProvider(
|
||||
sdktrace.WithBatcher(exporter),
|
||||
sdktrace.WithResource(res),
|
||||
)
|
||||
otel.SetTracerProvider(tp)
|
||||
sdktrace.WithResource(otelResource))
|
||||
otel.SetTracerProvider(provider)
|
||||
|
||||
logger.Info("tracing configured")
|
||||
return func() {
|
||||
@ -86,10 +66,10 @@ func maybeEnableTracing(ctx context.Context, logger log.Logger, config TraceConf
|
||||
|
||||
start := time.Now()
|
||||
logger.Info("Shutting down tracing")
|
||||
if err := tp.ForceFlush(shutdownCtx); err != nil {
|
||||
if err := provider.ForceFlush(shutdownCtx); err != nil {
|
||||
logger.Warn("error occurred force-flushing traces", log.Error(err))
|
||||
}
|
||||
if err := tp.Shutdown(shutdownCtx); err != nil {
|
||||
if err := provider.Shutdown(shutdownCtx); err != nil {
|
||||
logger.Warn("error occured shutting down tracing", log.Error(err))
|
||||
}
|
||||
logger.Info("Tracing shut down", log.Duration("elapsed", time.Since(start)))
|
||||
|
||||
73
deps.bzl
73
deps.bzl
@ -3209,26 +3209,43 @@ def go_dependencies():
|
||||
sum = "h1:/o9L4jKKshKO6U4q6e5oo0SkVtF5DDNLGK+liqsDt+w=",
|
||||
version = "v1.16.1",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_googlecloudplatform_opentelemetry_operations_go_exporter_metric",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric",
|
||||
sum = "h1:VahL5SjDdCas8mMKARolw2vvBsuLc5oV7XNSbxeMQP8=",
|
||||
version = "v0.41.0",
|
||||
build_directives = [
|
||||
# @go_googleapis is the modern version of @org_golang_google_genproto
|
||||
# use @go_googleapis to avoid dependency conflicts between the two
|
||||
"gazelle:resolve go google.golang.org/genproto/googleapis/api/metric @go_googleapis//google/api:metric_go_proto", # keep
|
||||
"gazelle:resolve go google.golang.org/genproto/googleapis/api @go_googleapis//google/api:api_go_proto", # keep
|
||||
"gazelle:resolve go google.golang.org/genproto/googleapis/api/annotations @go_googleapis//google/api:annotations_go_proto", # keep
|
||||
"gazelle:resolve go google.golang.org/genproto/googleapis/api/label @go_googleapis//google/api:label_go_proto", # keep
|
||||
"gazelle:resolve go google.golang.org/genproto/googleapis/api/monitoredres @go_googleapis//google/api:monitoredres_go_proto", # keep
|
||||
],
|
||||
)
|
||||
|
||||
go_repository(
|
||||
name = "com_github_googlecloudplatform_opentelemetry_operations_go_exporter_trace",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace",
|
||||
sum = "h1:dkIyFw11w878MSG5kegjr9Oept42iCjNvhO2BVRrr60=",
|
||||
version = "v1.16.1",
|
||||
sum = "h1:DwGeS/9k9xdpnvVQuJF+L9bYNFvBCmCWlDA8d8opoZY=",
|
||||
version = "v1.17.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_googlecloudplatform_opentelemetry_operations_go_internal_cloudmock",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock",
|
||||
sum = "h1:Mkm1EDj1blE1U31XI4GOwhMrTK0czB2HouHKxzr2ORo=",
|
||||
version = "v0.40.1",
|
||||
sum = "h1:ZJwvlTjB8GycSRpysdcRv3FztommLDUfgii0VUUp5ys=",
|
||||
version = "v0.41.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_googlecloudplatform_opentelemetry_operations_go_internal_resourcemapping",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping",
|
||||
sum = "h1:FFGWjWC0sCZgJziVe/yP39XjlQlf+MIEYXoRPJq8YX0=",
|
||||
version = "v0.40.1",
|
||||
sum = "h1:MWQ81b2TkSLbDpLINiKdZdoht1VMEHCKr4BSZpb/KQ8=",
|
||||
version = "v0.41.0",
|
||||
)
|
||||
|
||||
go_repository(
|
||||
@ -7145,15 +7162,15 @@ def go_dependencies():
|
||||
name = "com_google_cloud_go_baremetalsolution",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "cloud.google.com/go/baremetalsolution",
|
||||
sum = "h1:2AipdYXL0VxMboelTTw8c1UJ7gYu35LZYUbuRv9Q28s=",
|
||||
version = "v0.5.0",
|
||||
sum = "h1:0Ge9PQAy6cZ1tRrkc44UVgYV15nw2TVnzJzYsMHXF+E=",
|
||||
version = "v1.1.1",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_google_cloud_go_batch",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "cloud.google.com/go/batch",
|
||||
sum = "h1:YbMt0E6BtqeD5FvSv1d56jbVsWEzlGm55lYte+M6Mzs=",
|
||||
version = "v0.7.0",
|
||||
sum = "h1:uE0Q//W7FOGPjf7nuPiP0zoE8wOT3ngoIO2HIet0ilY=",
|
||||
version = "v1.3.1",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_google_cloud_go_beyondcorp",
|
||||
@ -7225,8 +7242,8 @@ def go_dependencies():
|
||||
name = "com_google_cloud_go_compute",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "cloud.google.com/go/compute",
|
||||
sum = "h1:JNBsyXVoOoNJtTQcnEY5uYpZIbeCTYIeDe0Xh1bySMk=",
|
||||
version = "v1.21.0",
|
||||
sum = "h1:cB8R6FtUtT1TYGl5R3xuxnW6OUIc/DrT2aiR16TTG7Y=",
|
||||
version = "v1.22.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_google_cloud_go_compute_metadata",
|
||||
@ -7417,8 +7434,8 @@ def go_dependencies():
|
||||
name = "com_google_cloud_go_gkebackup",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "cloud.google.com/go/gkebackup",
|
||||
sum = "h1:za3QZvw6ujR0uyqkhomKKKNoXDyqYGPJies3voUK8DA=",
|
||||
version = "v0.4.0",
|
||||
sum = "h1:lgyrpdhtJKV7l1GM15YFt+OCyHMxsQZuSydyNmS0Pxo=",
|
||||
version = "v1.3.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_google_cloud_go_gkeconnect",
|
||||
@ -7530,8 +7547,8 @@ def go_dependencies():
|
||||
name = "com_google_cloud_go_maps",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "cloud.google.com/go/maps",
|
||||
sum = "h1:mv9YaczD4oZBZkM5XJl6fXQ984IkJNHPwkc8MUsdkBo=",
|
||||
version = "v0.7.0",
|
||||
sum = "h1:m4BlGu0qnPwuq5aToT3atcVckS+hf40jsRXveJhusJI=",
|
||||
version = "v1.3.0",
|
||||
)
|
||||
|
||||
go_repository(
|
||||
@ -7734,8 +7751,8 @@ def go_dependencies():
|
||||
name = "com_google_cloud_go_run",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "cloud.google.com/go/run",
|
||||
sum = "h1:ydJQo+k+MShYnBfhaRHSZYeD/SQKZzZLAROyfpeD9zw=",
|
||||
version = "v0.9.0",
|
||||
sum = "h1:kHeIG8q+N6Zv0nDkBjSOYfK2eWqa5FnaiDPH/7/HirE=",
|
||||
version = "v1.2.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_google_cloud_go_scheduler",
|
||||
@ -8928,8 +8945,8 @@ def go_dependencies():
|
||||
name = "org_golang_google_api",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "google.golang.org/api",
|
||||
sum = "h1:AcgWS2edQ4chVEt/SxgDKubVu/9/idCJy00tBGuGB4M=",
|
||||
version = "v0.131.0",
|
||||
sum = "h1:8t2/+qZ26kAOGSmOiHwVycqVaDg7q3JDILrNi/Z6rvc=",
|
||||
version = "v0.132.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "org_golang_google_appengine",
|
||||
@ -8956,29 +8973,29 @@ def go_dependencies():
|
||||
],
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "google.golang.org/genproto",
|
||||
sum = "h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g=",
|
||||
version = "v0.0.0-20230711160842-782d3b101e98",
|
||||
sum = "h1:+VoAg+OKmWaommL56xmZSE2sUK8A7m6SUO7X89F2tbw=",
|
||||
version = "v0.0.0-20230717213848-3f92550aa753",
|
||||
)
|
||||
go_repository(
|
||||
name = "org_golang_google_genproto_googleapis_api",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "google.golang.org/genproto/googleapis/api",
|
||||
sum = "h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw=",
|
||||
version = "v0.0.0-20230711160842-782d3b101e98",
|
||||
sum = "h1:lCbbUxUDD+DiXx9Q6F/ttL0aAu7N2pz8XnmMm8ZW4NE=",
|
||||
version = "v0.0.0-20230717213848-3f92550aa753",
|
||||
)
|
||||
go_repository(
|
||||
name = "org_golang_google_genproto_googleapis_bytestream",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "google.golang.org/genproto/googleapis/bytestream",
|
||||
sum = "h1:rtjH4h36xaR/s6eK9qT0kvx/yPU1jlh4b1q2782p5XE=",
|
||||
version = "v0.0.0-20230706204954-ccb25ca9f130",
|
||||
sum = "h1:Hm7pO7oy28D47G/nht5kL85gWK/270UoRu7tx7rU0xg=",
|
||||
version = "v0.0.0-20230711160842-782d3b101e98",
|
||||
)
|
||||
go_repository(
|
||||
name = "org_golang_google_genproto_googleapis_rpc",
|
||||
build_file_proto_mode = "disable_global",
|
||||
importpath = "google.golang.org/genproto/googleapis/rpc",
|
||||
sum = "h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U=",
|
||||
version = "v0.0.0-20230711160842-782d3b101e98",
|
||||
sum = "h1:XUODHrpzJEUeWmVo/jfNTLj0YyVveOo28oE6vkFbkO4=",
|
||||
version = "v0.0.0-20230717213848-3f92550aa753",
|
||||
)
|
||||
|
||||
go_repository(
|
||||
|
||||
@ -73,3 +73,8 @@
|
||||
targets:
|
||||
# embeddings
|
||||
- host.docker.internal:6099
|
||||
- labels:
|
||||
job: cody-gateway
|
||||
targets:
|
||||
# cody gateway
|
||||
- host.docker.internal:6098
|
||||
|
||||
@ -73,3 +73,8 @@
|
||||
targets:
|
||||
# embeddings
|
||||
- 127.0.0.1:6099
|
||||
- labels:
|
||||
job: cody-gateway
|
||||
targets:
|
||||
# cody gateway
|
||||
- 127.0.0.1:6098
|
||||
|
||||
16
go.mod
16
go.mod
@ -71,7 +71,8 @@ require (
|
||||
cloud.google.com/go/pubsub v1.32.0
|
||||
cloud.google.com/go/secretmanager v1.11.1
|
||||
cloud.google.com/go/storage v1.30.1
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.16.1
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.41.0
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.17.0
|
||||
github.com/Khan/genqlient v0.5.0
|
||||
github.com/Masterminds/semver v1.5.0
|
||||
github.com/NYTimes/gziphandler v1.1.1
|
||||
@ -248,8 +249,8 @@ require (
|
||||
golang.org/x/time v0.3.0
|
||||
golang.org/x/tools v0.10.0
|
||||
gonum.org/v1/gonum v0.13.0
|
||||
google.golang.org/api v0.131.0
|
||||
google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect
|
||||
google.golang.org/api v0.132.0
|
||||
google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753 // indirect
|
||||
google.golang.org/protobuf v1.31.0
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
@ -276,14 +277,15 @@ require (
|
||||
go.opentelemetry.io/collector/config/confighttp v0.81.0
|
||||
go.opentelemetry.io/collector/config/configtelemetry v0.81.0
|
||||
go.opentelemetry.io/collector/config/configtls v0.81.0
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98
|
||||
go.opentelemetry.io/otel/exporters/prometheus v0.39.0
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753
|
||||
)
|
||||
|
||||
require (
|
||||
cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 // indirect
|
||||
cloud.google.com/go/trace v1.10.1 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.16.1 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.40.1 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.41.0 // indirect
|
||||
github.com/agnivade/levenshtein v1.1.1 // indirect
|
||||
github.com/alexflint/go-arg v1.4.2 // indirect
|
||||
github.com/alexflint/go-scalar v1.0.0 // indirect
|
||||
@ -352,13 +354,13 @@ require (
|
||||
go.opentelemetry.io/collector/featuregate v1.0.0-rcv0013 // indirect
|
||||
go.opentelemetry.io/collector/processor v0.81.0 // indirect
|
||||
go.uber.org/goleak v1.2.1 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 // indirect
|
||||
)
|
||||
|
||||
require (
|
||||
bitbucket.org/creachadair/shell v0.0.7 // indirect
|
||||
cloud.google.com/go v0.110.4 // indirect
|
||||
cloud.google.com/go/compute v1.21.0 // indirect
|
||||
cloud.google.com/go/compute v1.22.0 // indirect
|
||||
cloud.google.com/go/iam v1.1.1 // indirect
|
||||
code.gitea.io/gitea v1.18.0
|
||||
cuelang.org/go v0.4.3
|
||||
|
||||
33
go.sum
33
go.sum
@ -50,8 +50,8 @@ cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6m
|
||||
cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
|
||||
cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
|
||||
cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
|
||||
cloud.google.com/go/compute v1.21.0 h1:JNBsyXVoOoNJtTQcnEY5uYpZIbeCTYIeDe0Xh1bySMk=
|
||||
cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
|
||||
cloud.google.com/go/compute v1.22.0 h1:cB8R6FtUtT1TYGl5R3xuxnW6OUIc/DrT2aiR16TTG7Y=
|
||||
cloud.google.com/go/compute v1.22.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
|
||||
cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68 h1:aRVqY1p2IJaBGStWMsQMpkAa83cPkCDLl80eOj0Rbz4=
|
||||
cloud.google.com/go/compute/metadata v0.2.4-0.20230617002413-005d2dfb6b68/go.mod h1:1a3eRNYX12fs5UABBIXS8HXVvQbX9hRB/RkEBPORpe8=
|
||||
cloud.google.com/go/datacatalog v1.14.1 h1:cFPBt8V5V2T3mu/96tc4nhcMB+5cYcpwjBfn79bZDI8=
|
||||
@ -134,11 +134,13 @@ github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo=
|
||||
github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.16.1 h1:/o9L4jKKshKO6U4q6e5oo0SkVtF5DDNLGK+liqsDt+w=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.16.1/go.mod h1:Xx0VKh7GJ4si3rmElbh19Mejxz68ibWg/J30ZOMrqzU=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.16.1 h1:dkIyFw11w878MSG5kegjr9Oept42iCjNvhO2BVRrr60=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.16.1/go.mod h1:iyJ7cfLP5PVMo/55aIBBndyeFcMDXKUfbfZxaMM5GeU=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.40.1 h1:Mkm1EDj1blE1U31XI4GOwhMrTK0czB2HouHKxzr2ORo=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.40.1 h1:FFGWjWC0sCZgJziVe/yP39XjlQlf+MIEYXoRPJq8YX0=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.40.1/go.mod h1:lz6DEePTxmjvYMtusOoS3qDAErC0STi/wmvqJucKY28=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.41.0 h1:VahL5SjDdCas8mMKARolw2vvBsuLc5oV7XNSbxeMQP8=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.41.0/go.mod h1:T8qLlq6KznHWwp8FEbfw+p7mX/+dezSvUy3PXfTnp4c=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.17.0 h1:DwGeS/9k9xdpnvVQuJF+L9bYNFvBCmCWlDA8d8opoZY=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.17.0/go.mod h1:SUVNJAkkyRKeM3L46/NhFGIz+Kx1zetN09qUs1XbMx8=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.41.0 h1:ZJwvlTjB8GycSRpysdcRv3FztommLDUfgii0VUUp5ys=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.41.0 h1:MWQ81b2TkSLbDpLINiKdZdoht1VMEHCKr4BSZpb/KQ8=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.41.0/go.mod h1:lz6DEePTxmjvYMtusOoS3qDAErC0STi/wmvqJucKY28=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM=
|
||||
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU=
|
||||
github.com/Khan/genqlient v0.5.0 h1:TMZJ+tl/BpbmGyIBiXzKzUftDhw4ZWxQZ+1ydn0gyII=
|
||||
@ -2348,6 +2350,7 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9LAB8aK++sKVcELezzn655JnBNdsDhghU4G/So8=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw=
|
||||
go.opentelemetry.io/otel/exporters/prometheus v0.39.0 h1:whAaiHxOatgtKd+w0dOi//1KUxj3KoPINZdtDaDj3IA=
|
||||
go.opentelemetry.io/otel/exporters/prometheus v0.39.0/go.mod h1:4jo5Q4CROlCpSPsXLhymi+LYrDXd2ObU5wbKayfZs7Y=
|
||||
go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
|
||||
go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo=
|
||||
go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4=
|
||||
@ -2980,8 +2983,8 @@ google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6r
|
||||
google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=
|
||||
google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o=
|
||||
google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g=
|
||||
google.golang.org/api v0.131.0 h1:AcgWS2edQ4chVEt/SxgDKubVu/9/idCJy00tBGuGB4M=
|
||||
google.golang.org/api v0.131.0/go.mod h1:7vtkbKv2REjJbxmHSkBTBQ5LUGvPdAqjjvt84XAfhpA=
|
||||
google.golang.org/api v0.132.0 h1:8t2/+qZ26kAOGSmOiHwVycqVaDg7q3JDILrNi/Z6rvc=
|
||||
google.golang.org/api v0.132.0/go.mod h1:AeTBC6GpJnJSRJjktDcPX0QwtS8pGYZOV6MSuSCusw0=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
@ -3080,12 +3083,12 @@ google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP
|
||||
google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
|
||||
google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
|
||||
google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
|
||||
google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g=
|
||||
google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM=
|
||||
google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753 h1:+VoAg+OKmWaommL56xmZSE2sUK8A7m6SUO7X89F2tbw=
|
||||
google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753/go.mod h1:iqkVr8IRpZ53gx1dEnWlCUIEwDWqWARWrbzpasaTNYM=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753 h1:lCbbUxUDD+DiXx9Q6F/ttL0aAu7N2pz8XnmMm8ZW4NE=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 h1:XUODHrpzJEUeWmVo/jfNTLj0YyVveOo28oE6vkFbkO4=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM=
|
||||
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
google.golang.org/grpc v1.2.1-0.20170921194603-d4b75ebd4f9f/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
|
||||
@ -42,7 +42,7 @@ func newOtelSpanProcessor(logger log.Logger, opts options, debug bool) (oteltrac
|
||||
var err error
|
||||
switch opts.TracerType {
|
||||
case OpenTelemetry:
|
||||
exporter, err = exporters.NewOTLPExporter(context.Background(), logger)
|
||||
exporter, err = exporters.NewOTLPTraceExporter(context.Background(), logger)
|
||||
|
||||
case Jaeger:
|
||||
exporter, err = exporters.NewJaegerExporter()
|
||||
|
||||
@ -5,6 +5,7 @@ go_library(
|
||||
srcs = [
|
||||
"jaeger.go",
|
||||
"otlp.go",
|
||||
"prometheus.go",
|
||||
],
|
||||
importpath = "github.com/sourcegraph/sourcegraph/internal/tracer/oteldefaults/exporters",
|
||||
visibility = ["//:__subpackages__"],
|
||||
@ -12,12 +13,15 @@ go_library(
|
||||
"//internal/otlpenv",
|
||||
"//lib/errors",
|
||||
"@com_github_grafana_regexp//:regexp",
|
||||
"@com_github_prometheus_client_golang//prometheus",
|
||||
"@com_github_sourcegraph_log//:log",
|
||||
"@com_github_uber_jaeger_client_go//config",
|
||||
"@io_opentelemetry_go_otel_exporters_jaeger//:jaeger",
|
||||
"@io_opentelemetry_go_otel_exporters_otlp_otlptrace//:otlptrace",
|
||||
"@io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracegrpc//:otlptracegrpc",
|
||||
"@io_opentelemetry_go_otel_exporters_otlp_otlptrace_otlptracehttp//:otlptracehttp",
|
||||
"@io_opentelemetry_go_otel_exporters_prometheus//:prometheus",
|
||||
"@io_opentelemetry_go_otel_sdk//trace",
|
||||
"@io_opentelemetry_go_otel_sdk_metric//:metric",
|
||||
],
|
||||
)
|
||||
|
||||
@ -14,12 +14,12 @@ import (
|
||||
"github.com/sourcegraph/sourcegraph/lib/errors"
|
||||
)
|
||||
|
||||
// NewOTLPExporter exports spans to an OpenTelemetry collector via the OpenTelemetry
|
||||
// protocol (OTLP) based environment configuration.
|
||||
// NewOTLPTraceExporter exports trace spans to an OpenTelemetry collector via the
|
||||
// OpenTelemetry protocol (OTLP) based on environment configuration.
|
||||
//
|
||||
// By default, prefer to use internal/tracer.Init to set up a global OpenTelemetry
|
||||
// tracer and use that instead.
|
||||
func NewOTLPExporter(ctx context.Context, logger log.Logger) (oteltracesdk.SpanExporter, error) {
|
||||
func NewOTLPTraceExporter(ctx context.Context, logger log.Logger) (oteltracesdk.SpanExporter, error) {
|
||||
endpoint := otlpenv.GetEndpoint()
|
||||
if endpoint == "" {
|
||||
// OTEL_EXPORTER_OTLP_ENDPOINT has been explicitly set to ""
|
||||
|
||||
14
internal/tracer/oteldefaults/exporters/prometheus.go
Normal file
14
internal/tracer/oteldefaults/exporters/prometheus.go
Normal file
@ -0,0 +1,14 @@
|
||||
package exporters
|
||||
|
||||
import (
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
otelprometheus "go.opentelemetry.io/otel/exporters/prometheus"
|
||||
metricsdk "go.opentelemetry.io/otel/sdk/metric"
|
||||
)
|
||||
|
||||
// NewPrometheusExporter sets up a metrics Reader for interacting with a
|
||||
// Prometheus exporter based on prometheus.DefaultRegisterer
|
||||
func NewPrometheusExporter() (metricsdk.Reader, error) {
|
||||
return otelprometheus.New(
|
||||
otelprometheus.WithRegisterer(prometheus.DefaultRegisterer))
|
||||
}
|
||||
@ -304,6 +304,8 @@ commands:
|
||||
CODY_GATEWAY_ALLOW_ANONYMOUS: true
|
||||
CODY_GATEWAY_DIAGNOSTICS_SECRET: sekret
|
||||
SRC_LOG_LEVEL: info
|
||||
# Enables metrics in dev via debugserver
|
||||
SRC_PROF_HTTP: "127.0.0.1:6098"
|
||||
watch:
|
||||
- lib
|
||||
- internal
|
||||
|
||||
Loading…
Reference in New Issue
Block a user