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:
Robert Lin 2023-07-20 13:35:16 -07:00 committed by GitHub
parent 617136548a
commit 294fe3df22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 337 additions and 130 deletions

View File

@ -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",
],
)

View File

@ -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()
})
}

View File

@ -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",
],
)

View File

@ -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.")

View File

@ -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()),
),
)
}

View 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
}

View File

@ -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)))

View File

@ -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(

View File

@ -73,3 +73,8 @@
targets:
# embeddings
- host.docker.internal:6099
- labels:
job: cody-gateway
targets:
# cody gateway
- host.docker.internal:6098

View File

@ -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
View File

@ -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
View File

@ -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=

View File

@ -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()

View File

@ -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",
],
)

View File

@ -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 ""

View 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))
}

View File

@ -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