diff --git a/cmd/frontend/internal/telemetry/resolvers/BUILD.bazel b/cmd/frontend/internal/telemetry/resolvers/BUILD.bazel index a8f72d24c59..974c3f5af0a 100644 --- a/cmd/frontend/internal/telemetry/resolvers/BUILD.bazel +++ b/cmd/frontend/internal/telemetry/resolvers/BUILD.bazel @@ -17,10 +17,11 @@ go_library( "//internal/database", "//internal/gqlutil", "//internal/telemetry/teestore", - "//internal/telemetrygateway/v1:telemetrygateway", + "//internal/telemetrygateway/event", "//internal/version", "//lib/errors", "//lib/pointers", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_graph_gophers_graphql_go//:graphql-go", "@com_github_graph_gophers_graphql_go//relay", "@com_github_sourcegraph_log//:log", @@ -49,8 +50,8 @@ go_test( "//internal/database/dbtest", "//internal/database/fakedb", "//internal/gqlutil", - "//internal/telemetrygateway/v1:telemetrygateway", "//internal/types", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_hexops_autogold_v2//:autogold", "@com_github_sourcegraph_log//logtest", "@com_github_stretchr_testify//assert", diff --git a/cmd/frontend/internal/telemetry/resolvers/resolvers.go b/cmd/frontend/internal/telemetry/resolvers/resolvers.go index e07c067935a..24d84ff90aa 100644 --- a/cmd/frontend/internal/telemetry/resolvers/resolvers.go +++ b/cmd/frontend/internal/telemetry/resolvers/resolvers.go @@ -11,8 +11,8 @@ import ( "github.com/sourcegraph/sourcegraph/internal/auth" "github.com/sourcegraph/sourcegraph/internal/database" "github.com/sourcegraph/sourcegraph/internal/telemetry/teestore" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/lib/errors" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) // Resolver is the GraphQL resolver of all things related to telemetry V2. diff --git a/cmd/frontend/internal/telemetry/resolvers/resolvers_test.go b/cmd/frontend/internal/telemetry/resolvers/resolvers_test.go index c3b30def513..88af1826a57 100644 --- a/cmd/frontend/internal/telemetry/resolvers/resolvers_test.go +++ b/cmd/frontend/internal/telemetry/resolvers/resolvers_test.go @@ -17,8 +17,8 @@ import ( "github.com/sourcegraph/sourcegraph/internal/database/dbmocks" "github.com/sourcegraph/sourcegraph/internal/database/dbtest" "github.com/sourcegraph/sourcegraph/internal/database/fakedb" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/internal/types" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func TestExportedEvents(t *testing.T) { diff --git a/cmd/frontend/internal/telemetry/resolvers/telemetrygateway.go b/cmd/frontend/internal/telemetry/resolvers/telemetrygateway.go index 34c4de8d89c..a6be2361fd8 100644 --- a/cmd/frontend/internal/telemetry/resolvers/telemetrygateway.go +++ b/cmd/frontend/internal/telemetry/resolvers/telemetrygateway.go @@ -8,9 +8,11 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" "github.com/sourcegraph/sourcegraph/cmd/frontend/graphqlbackend" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/internal/version" "github.com/sourcegraph/sourcegraph/lib/errors" + + telemetrygatewayevent "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/event" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) // newTelemetryGatewayEvents converts GraphQL telemetry input to the Telemetry @@ -30,7 +32,7 @@ func newTelemetryGatewayEvents( return nil, errors.Newf("action is required for event %d", i) } - event := telemetrygatewayv1.NewEventWithDefaults(ctx, now, newUUID) + event := telemetrygatewayevent.New(ctx, now, newUUID) if gqlEvent.Timestamp != nil { event.Timestamp = timestamppb.New(gqlEvent.Timestamp.Time) diff --git a/cmd/telemetry-gateway/internal/events/BUILD.bazel b/cmd/telemetry-gateway/internal/events/BUILD.bazel index df0af3981ba..ec3bdb2b68a 100644 --- a/cmd/telemetry-gateway/internal/events/BUILD.bazel +++ b/cmd/telemetry-gateway/internal/events/BUILD.bazel @@ -11,9 +11,9 @@ go_library( visibility = ["//cmd/telemetry-gateway:__subpackages__"], deps = [ "//internal/pubsub", - "//internal/telemetrygateway/v1:telemetrygateway", "//internal/trace", "//lib/errors", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_cockroachdb_redact//:redact", "@com_github_sourcegraph_conc//pool", "@com_github_sourcegraph_log//:log", @@ -32,7 +32,7 @@ go_test( embed = [":events"], deps = [ "//internal/pubsub/pubsubtest", - "//internal/telemetrygateway/v1:telemetrygateway", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_hexops_autogold_v2//:autogold", "@com_github_sourcegraph_log//logtest", "@com_github_stretchr_testify//assert", diff --git a/cmd/telemetry-gateway/internal/events/attributes.go b/cmd/telemetry-gateway/internal/events/attributes.go index 2a1233f8eca..fb416b89ebc 100644 --- a/cmd/telemetry-gateway/internal/events/attributes.go +++ b/cmd/telemetry-gateway/internal/events/attributes.go @@ -4,7 +4,7 @@ import ( "strconv" "strings" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) // extractPubSubAttributes extracts attributes from the event for use in the diff --git a/cmd/telemetry-gateway/internal/events/attributes_test.go b/cmd/telemetry-gateway/internal/events/attributes_test.go index d4ca1e3b285..6cf6036b089 100644 --- a/cmd/telemetry-gateway/internal/events/attributes_test.go +++ b/cmd/telemetry-gateway/internal/events/attributes_test.go @@ -6,7 +6,7 @@ import ( "github.com/hexops/autogold/v2" "google.golang.org/protobuf/types/known/structpb" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func TestExtractPubSubAttributes(t *testing.T) { diff --git a/cmd/telemetry-gateway/internal/events/events.go b/cmd/telemetry-gateway/internal/events/events.go index 8bd9f565e61..79b9c79b69e 100644 --- a/cmd/telemetry-gateway/internal/events/events.go +++ b/cmd/telemetry-gateway/internal/events/events.go @@ -14,9 +14,9 @@ import ( "github.com/sourcegraph/log" "github.com/sourcegraph/sourcegraph/internal/pubsub" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/internal/trace" "github.com/sourcegraph/sourcegraph/lib/errors" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) type Publisher struct { diff --git a/cmd/telemetry-gateway/internal/events/events_test.go b/cmd/telemetry-gateway/internal/events/events_test.go index e18b24beecf..38464b18dda 100644 --- a/cmd/telemetry-gateway/internal/events/events_test.go +++ b/cmd/telemetry-gateway/internal/events/events_test.go @@ -16,7 +16,7 @@ import ( "github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/events" "github.com/sourcegraph/sourcegraph/internal/pubsub/pubsubtest" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func TestPublish(t *testing.T) { diff --git a/cmd/telemetry-gateway/internal/server/BUILD.bazel b/cmd/telemetry-gateway/internal/server/BUILD.bazel index ef3109c30ab..494a86f906b 100644 --- a/cmd/telemetry-gateway/internal/server/BUILD.bazel +++ b/cmd/telemetry-gateway/internal/server/BUILD.bazel @@ -17,9 +17,9 @@ go_library( "//internal/licensing", "//internal/pubsub", "//internal/sams", - "//internal/telemetrygateway/v1:telemetrygateway", "//internal/trace", "//lib/errors", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_cockroachdb_redact//:redact", "@com_github_sourcegraph_log//:log", "@io_opentelemetry_go_otel//:otel", @@ -39,8 +39,8 @@ go_test( embed = [":server"], deps = [ "//cmd/telemetry-gateway/internal/events", - "//internal/telemetrygateway/v1:telemetrygateway", "//lib/errors", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_hexops_autogold_v2//:autogold", "@com_github_stretchr_testify//assert", "@com_github_stretchr_testify//require", diff --git a/cmd/telemetry-gateway/internal/server/migrate_events.go b/cmd/telemetry-gateway/internal/server/migrate_events.go index d5eeb58cf6b..3ac0843fcff 100644 --- a/cmd/telemetry-gateway/internal/server/migrate_events.go +++ b/cmd/telemetry-gateway/internal/server/migrate_events.go @@ -1,6 +1,6 @@ package server -import telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" +import telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" // migrateEvents does an in-place migration of any legacy field usages to support // older exporters. diff --git a/cmd/telemetry-gateway/internal/server/migrate_events_test.go b/cmd/telemetry-gateway/internal/server/migrate_events_test.go index 0eeb3553b3e..450a3bb7aeb 100644 --- a/cmd/telemetry-gateway/internal/server/migrate_events_test.go +++ b/cmd/telemetry-gateway/internal/server/migrate_events_test.go @@ -5,7 +5,7 @@ import ( "github.com/stretchr/testify/assert" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func TestMigrateEvents(t *testing.T) { diff --git a/cmd/telemetry-gateway/internal/server/publish_events.go b/cmd/telemetry-gateway/internal/server/publish_events.go index 57e8cd17032..ef3802d1315 100644 --- a/cmd/telemetry-gateway/internal/server/publish_events.go +++ b/cmd/telemetry-gateway/internal/server/publish_events.go @@ -10,9 +10,9 @@ import ( "go.opentelemetry.io/otel/metric" "github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/events" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" sgtrace "github.com/sourcegraph/sourcegraph/internal/trace" "github.com/sourcegraph/sourcegraph/lib/errors" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func handlePublishEvents( diff --git a/cmd/telemetry-gateway/internal/server/publish_events_test.go b/cmd/telemetry-gateway/internal/server/publish_events_test.go index 6f8fe903aa5..eac2b95eae6 100644 --- a/cmd/telemetry-gateway/internal/server/publish_events_test.go +++ b/cmd/telemetry-gateway/internal/server/publish_events_test.go @@ -10,8 +10,8 @@ import ( "github.com/stretchr/testify/require" "github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/events" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/lib/errors" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func TestSummarizeFailedEvents(t *testing.T) { diff --git a/cmd/telemetry-gateway/internal/server/server.go b/cmd/telemetry-gateway/internal/server/server.go index 17f0d7ab83d..6ea5f429f5b 100644 --- a/cmd/telemetry-gateway/internal/server/server.go +++ b/cmd/telemetry-gateway/internal/server/server.go @@ -20,7 +20,7 @@ import ( "github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/events" "github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server/samsm2m" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) type Server struct { diff --git a/cmd/telemetry-gateway/service/BUILD.bazel b/cmd/telemetry-gateway/service/BUILD.bazel index b3c077d4057..f966a52d8e6 100644 --- a/cmd/telemetry-gateway/service/BUILD.bazel +++ b/cmd/telemetry-gateway/service/BUILD.bazel @@ -17,13 +17,13 @@ go_library( "//internal/httpserver", "//internal/pubsub", "//internal/sams", - "//internal/telemetrygateway/v1:telemetrygateway", "//internal/trace/policy", "//internal/version", "//lib/background", "//lib/errors", "//lib/managedservicesplatform/runtime", "//lib/managedservicesplatform/runtime/contract", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_sourcegraph_log//:log", "@io_opentelemetry_go_otel//:otel", "@io_opentelemetry_go_otel_metric//:metric", diff --git a/cmd/telemetry-gateway/service/service.go b/cmd/telemetry-gateway/service/service.go index 8e3db7c4688..167bbcb6b41 100644 --- a/cmd/telemetry-gateway/service/service.go +++ b/cmd/telemetry-gateway/service/service.go @@ -28,7 +28,7 @@ import ( "github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/events" "github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) var meter = otel.GetMeterProvider().Meter("cmd/telemetry-gateway/service") diff --git a/deps.bzl b/deps.bzl index 49024155de9..5c8421d3aa9 100644 --- a/deps.bzl +++ b/deps.bzl @@ -2595,8 +2595,8 @@ def go_dependencies(): name = "com_github_google_uuid", build_file_proto_mode = "disable_global", importpath = "github.com/google/uuid", - sum = "h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=", - version = "v1.5.0", + sum = "h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=", + version = "v1.6.0", ) go_repository( name = "com_github_googleapis_enterprise_certificate_proxy", diff --git a/doc/dev/background-information/telemetry/BUILD.bazel b/doc/dev/background-information/telemetry/BUILD.bazel index 5655ebda147..a9fd724809d 100644 --- a/doc/dev/background-information/telemetry/BUILD.bazel +++ b/doc/dev/background-information/telemetry/BUILD.bazel @@ -13,7 +13,7 @@ filegroup( write_generated_to_source_files( name = "write_telemetrygateway_doc", - output_files = {"protocol.md": "internal/telemetrygateway/v1/protocol.md/protocol.md"}, + output_files = {"protocol.md": "lib/telemetrygateway/v1/protocol.md/protocol.md"}, tags = ["go_generate"], - target = "//internal/telemetrygateway/v1:protocol.md", + target = "//lib/telemetrygateway/v1:protocol.md", ) diff --git a/go.mod b/go.mod index 8174082c1da..3a36d9ec2f7 100644 --- a/go.mod +++ b/go.mod @@ -116,7 +116,7 @@ require ( github.com/gomodule/redigo v2.0.0+incompatible github.com/google/go-cmp v0.6.0 github.com/google/go-querystring v1.1.0 - github.com/google/uuid v1.5.0 + github.com/google/uuid v1.6.0 github.com/gorilla/context v1.1.1 github.com/gorilla/mux v1.8.0 github.com/gorilla/schema v1.2.0 diff --git a/go.sum b/go.sum index 47769f84c72..46dcb810788 100644 --- a/go.sum +++ b/go.sum @@ -941,8 +941,8 @@ github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= diff --git a/internal/database/BUILD.bazel b/internal/database/BUILD.bazel index 14661cba51b..954cd570062 100644 --- a/internal/database/BUILD.bazel +++ b/internal/database/BUILD.bazel @@ -138,7 +138,6 @@ go_library( "//internal/search/result", "//internal/security", "//internal/telemetry/sensitivemetadataallowlist", - "//internal/telemetrygateway/v1:telemetrygateway", "//internal/temporarysettings", "//internal/timeutil", "//internal/trace", @@ -146,6 +145,7 @@ go_library( "//internal/version", "//lib/errors", "//lib/pointers", + "//lib/telemetrygateway/v1:telemetrygateway", "//schema", "@com_github_gofrs_uuid//:uuid", "@com_github_google_uuid//:uuid", @@ -292,7 +292,6 @@ go_test( "//internal/perforce", "//internal/rbac/types", "//internal/search/result", - "//internal/telemetrygateway/v1:telemetrygateway", "//internal/temporarysettings", "//internal/timeutil", "//internal/trace", @@ -302,6 +301,7 @@ go_test( "//internal/version", "//lib/errors", "//lib/pointers", + "//lib/telemetrygateway/v1:telemetrygateway", "//schema", "@com_github_cockroachdb_errors//errbase", "@com_github_gitchander_permutation//:permutation", diff --git a/internal/database/dbmocks/BUILD.bazel b/internal/database/dbmocks/BUILD.bazel index f3cbae91dfd..485c265c365 100644 --- a/internal/database/dbmocks/BUILD.bazel +++ b/internal/database/dbmocks/BUILD.bazel @@ -19,9 +19,9 @@ go_library( "//internal/github_apps/store", "//internal/own/types", "//internal/search/result", - "//internal/telemetrygateway/v1:telemetrygateway", "//internal/temporarysettings", "//internal/types", + "//lib/telemetrygateway/v1:telemetrygateway", "//schema", "@com_github_google_uuid//:uuid", "@com_github_keegancsmith_sqlf//:sqlf", diff --git a/internal/database/dbmocks/mocks_temp.go b/internal/database/dbmocks/mocks_temp.go index d752d13814b..079fa41f1ba 100644 --- a/internal/database/dbmocks/mocks_temp.go +++ b/internal/database/dbmocks/mocks_temp.go @@ -27,9 +27,9 @@ import ( store "github.com/sourcegraph/sourcegraph/internal/github_apps/store" types1 "github.com/sourcegraph/sourcegraph/internal/own/types" result "github.com/sourcegraph/sourcegraph/internal/search/result" - v1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" temporarysettings "github.com/sourcegraph/sourcegraph/internal/temporarysettings" types "github.com/sourcegraph/sourcegraph/internal/types" + v1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" schema "github.com/sourcegraph/sourcegraph/schema" zoekt "github.com/sourcegraph/zoekt" ) diff --git a/internal/database/telemetry_export_store.go b/internal/database/telemetry_export_store.go index 0d6c667864b..244f8882412 100644 --- a/internal/database/telemetry_export_store.go +++ b/internal/database/telemetry_export_store.go @@ -21,9 +21,9 @@ import ( "github.com/sourcegraph/sourcegraph/internal/database/batch" "github.com/sourcegraph/sourcegraph/internal/licensing" "github.com/sourcegraph/sourcegraph/internal/telemetry/sensitivemetadataallowlist" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/internal/trace" "github.com/sourcegraph/sourcegraph/lib/errors" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) var counterQueuedEvents = promauto.NewCounterVec(prometheus.CounterOpts{ diff --git a/internal/database/telemetry_export_store_test.go b/internal/database/telemetry_export_store_test.go index c2081395c04..4ff8e616c70 100644 --- a/internal/database/telemetry_export_store_test.go +++ b/internal/database/telemetry_export_store_test.go @@ -15,7 +15,7 @@ import ( "github.com/sourcegraph/sourcegraph/internal/database/dbtest" "github.com/sourcegraph/sourcegraph/internal/licensing" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func TestTelemetryEventsExportQueue_QueueForExport(t *testing.T) { diff --git a/internal/telemetry/BUILD.bazel b/internal/telemetry/BUILD.bazel index 2388d030b6a..49d58f02628 100644 --- a/internal/telemetry/BUILD.bazel +++ b/internal/telemetry/BUILD.bazel @@ -14,10 +14,11 @@ go_library( importpath = "github.com/sourcegraph/sourcegraph/internal/telemetry", visibility = ["//:__subpackages__"], deps = [ - "//internal/telemetrygateway/v1:telemetrygateway", + "//internal/telemetrygateway/event", "//internal/trace", "//internal/version", "//lib/errors", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_sourcegraph_log//:log", "@org_golang_google_protobuf//types/known/structpb", ], diff --git a/internal/telemetry/sensitivemetadataallowlist/BUILD.bazel b/internal/telemetry/sensitivemetadataallowlist/BUILD.bazel index 228551c722b..3f161e183ec 100644 --- a/internal/telemetry/sensitivemetadataallowlist/BUILD.bazel +++ b/internal/telemetry/sensitivemetadataallowlist/BUILD.bazel @@ -13,8 +13,8 @@ go_library( "//internal/dotcom", "//internal/env", "//internal/telemetry", - "//internal/telemetrygateway/v1:telemetrygateway", "//lib/errors", + "//lib/telemetrygateway/v1:telemetrygateway", ], ) @@ -27,8 +27,8 @@ go_test( embed = [":sensitivemetadataallowlist"], deps = [ "//internal/telemetry", - "//internal/telemetrygateway/v1:telemetrygateway", "//lib/pointers", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_hexops_autogold_v2//:autogold", "@com_github_stretchr_testify//assert", "@com_github_stretchr_testify//require", diff --git a/internal/telemetry/sensitivemetadataallowlist/redact.go b/internal/telemetry/sensitivemetadataallowlist/redact.go index 0760ed2a65b..c33e095061e 100644 --- a/internal/telemetry/sensitivemetadataallowlist/redact.go +++ b/internal/telemetry/sensitivemetadataallowlist/redact.go @@ -1,7 +1,7 @@ package sensitivemetadataallowlist import ( - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) // redactMode dictates how much to redact. The lowest value indicates our diff --git a/internal/telemetry/sensitivemetadataallowlist/redact_test.go b/internal/telemetry/sensitivemetadataallowlist/redact_test.go index 6996008c9f5..827bd4f32f4 100644 --- a/internal/telemetry/sensitivemetadataallowlist/redact_test.go +++ b/internal/telemetry/sensitivemetadataallowlist/redact_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/assert" "google.golang.org/protobuf/types/known/structpb" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/lib/pointers" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func TestRedactEvent(t *testing.T) { diff --git a/internal/telemetry/sensitivemetadataallowlist/sensitivemetadataallowlist.go b/internal/telemetry/sensitivemetadataallowlist/sensitivemetadataallowlist.go index 25290a04fcf..4394c3b7e27 100644 --- a/internal/telemetry/sensitivemetadataallowlist/sensitivemetadataallowlist.go +++ b/internal/telemetry/sensitivemetadataallowlist/sensitivemetadataallowlist.go @@ -9,7 +9,7 @@ import ( "github.com/sourcegraph/sourcegraph/internal/dotcom" "github.com/sourcegraph/sourcegraph/internal/env" "github.com/sourcegraph/sourcegraph/internal/telemetry" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) var rawAdditionalAllowedEventTypes = env.Get("SRC_TELEMETRY_SENSITIVEMETADATA_ADDITIONAL_ALLOWED_EVENT_TYPES", "", diff --git a/internal/telemetry/sensitivemetadataallowlist/sensitivemetadataallowlist_test.go b/internal/telemetry/sensitivemetadataallowlist/sensitivemetadataallowlist_test.go index 83ffdaf00e7..b6107bb50aa 100644 --- a/internal/telemetry/sensitivemetadataallowlist/sensitivemetadataallowlist_test.go +++ b/internal/telemetry/sensitivemetadataallowlist/sensitivemetadataallowlist_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" "github.com/sourcegraph/sourcegraph/internal/telemetry" - v1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + v1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func TestIsAllowed(t *testing.T) { diff --git a/internal/telemetry/teestore/BUILD.bazel b/internal/telemetry/teestore/BUILD.bazel index 39faa43936b..ae2b206ab96 100644 --- a/internal/telemetry/teestore/BUILD.bazel +++ b/internal/telemetry/teestore/BUILD.bazel @@ -13,9 +13,9 @@ go_library( "//internal/database", "//internal/featureflag", "//internal/telemetry/sensitivemetadataallowlist", - "//internal/telemetrygateway/v1:telemetrygateway", "//lib/errors", "//lib/pointers", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_prometheus_client_golang//prometheus", "@com_github_prometheus_client_golang//prometheus/promauto", "@com_github_sourcegraph_conc//pool", @@ -33,8 +33,8 @@ go_test( deps = [ "//internal/database", "//internal/database/dbtest", - "//internal/telemetrygateway/v1:telemetrygateway", "//lib/pointers", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_hexops_autogold_v2//:autogold", "@com_github_sourcegraph_log//logtest", "@com_github_stretchr_testify//assert", diff --git a/internal/telemetry/teestore/teestore.go b/internal/telemetry/teestore/teestore.go index b0f5bc4a736..9b95d137d46 100644 --- a/internal/telemetry/teestore/teestore.go +++ b/internal/telemetry/teestore/teestore.go @@ -14,9 +14,9 @@ import ( "github.com/sourcegraph/sourcegraph/internal/database" "github.com/sourcegraph/sourcegraph/internal/featureflag" "github.com/sourcegraph/sourcegraph/internal/telemetry/sensitivemetadataallowlist" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/lib/errors" "github.com/sourcegraph/sourcegraph/lib/pointers" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) var counterV1Events = promauto.NewCounterVec(prometheus.CounterOpts{ diff --git a/internal/telemetry/teestore/teestore_test.go b/internal/telemetry/teestore/teestore_test.go index 6b108a03f1d..1a6abf03a03 100644 --- a/internal/telemetry/teestore/teestore_test.go +++ b/internal/telemetry/teestore/teestore_test.go @@ -15,8 +15,8 @@ import ( "github.com/sourcegraph/sourcegraph/internal/database" "github.com/sourcegraph/sourcegraph/internal/database/dbtest" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/lib/pointers" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) // see TestRecorderEndToEnd for tests that include teestore.Store and the database diff --git a/internal/telemetry/telemetry.go b/internal/telemetry/telemetry.go index 555dec463d3..0395a80d928 100644 --- a/internal/telemetry/telemetry.go +++ b/internal/telemetry/telemetry.go @@ -7,8 +7,8 @@ import ( "context" "time" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/lib/errors" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) // constString effectively requires strings to be statically defined constants. diff --git a/internal/telemetry/telemetrygateway.go b/internal/telemetry/telemetrygateway.go index 2aa8b9d2403..a65c1a4fb2f 100644 --- a/internal/telemetry/telemetrygateway.go +++ b/internal/telemetry/telemetrygateway.go @@ -6,8 +6,10 @@ import ( "google.golang.org/protobuf/types/known/structpb" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/internal/version" + + telemetrygatewayevent "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/event" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) // newTelemetryGatewayEvent translates recording to raw events for storage and @@ -26,7 +28,7 @@ func newTelemetryGatewayEvent( parameters = &EventParameters{} } - event := telemetrygatewayv1.NewEventWithDefaults(ctx, now, newUUID) + event := telemetrygatewayevent.New(ctx, now, newUUID) event.Feature = string(feature) event.Action = string(action) event.Source = &telemetrygatewayv1.EventSource{ diff --git a/internal/telemetry/telemetrytest/BUILD.bazel b/internal/telemetry/telemetrytest/BUILD.bazel index 76f9ee3451e..d7cf3788c36 100644 --- a/internal/telemetry/telemetrytest/BUILD.bazel +++ b/internal/telemetry/telemetrytest/BUILD.bazel @@ -14,7 +14,7 @@ go_library( "//internal/database", "//internal/database/dbmocks", "//internal/telemetry", - "//internal/telemetrygateway/v1:telemetrygateway", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_sourcegraph_log//logtest", ], ) @@ -25,7 +25,7 @@ go_test( embed = [":telemetrytest"], deps = [ "//internal/telemetry", - "//internal/telemetrygateway/v1:telemetrygateway", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_hexops_autogold_v2//:autogold", "@com_github_sourcegraph_log//logtest", "@com_github_stretchr_testify//require", diff --git a/internal/telemetry/telemetrytest/mocks.go b/internal/telemetry/telemetrytest/mocks.go index f0c892dfa34..4d4adad0348 100644 --- a/internal/telemetry/telemetrytest/mocks.go +++ b/internal/telemetry/telemetrytest/mocks.go @@ -11,7 +11,7 @@ import ( "sync" telemetry "github.com/sourcegraph/sourcegraph/internal/telemetry" - v1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + v1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) // MockEventsStore is a mock implementation of the EventsStore interface diff --git a/internal/telemetry/telemetrytest/telemetrytest.go b/internal/telemetry/telemetrytest/telemetrytest.go index fbddc9391a7..4adbf76e512 100644 --- a/internal/telemetry/telemetrytest/telemetrytest.go +++ b/internal/telemetry/telemetrytest/telemetrytest.go @@ -11,8 +11,8 @@ import ( "github.com/sourcegraph/sourcegraph/internal/database/dbmocks" "github.com/sourcegraph/sourcegraph/internal/telemetry" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" - v1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" + v1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) // NewRecorder is an simple alias that provides a *telemetry.EventRecorder and diff --git a/internal/telemetry/telemetrytest/telemetrytest_test.go b/internal/telemetry/telemetrytest/telemetrytest_test.go index a7538a9931b..63f5d481dfe 100644 --- a/internal/telemetry/telemetrytest/telemetrytest_test.go +++ b/internal/telemetry/telemetrytest/telemetrytest_test.go @@ -9,8 +9,9 @@ import ( "github.com/stretchr/testify/require" "github.com/sourcegraph/log/logtest" + "github.com/sourcegraph/sourcegraph/internal/telemetry" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func TestFakeTelemetryEventsExportQueueStore(t *testing.T) { diff --git a/internal/telemetrygateway/BUILD.bazel b/internal/telemetrygateway/BUILD.bazel index fcfbdaaaddc..f3eb7ed1b49 100644 --- a/internal/telemetrygateway/BUILD.bazel +++ b/internal/telemetrygateway/BUILD.bazel @@ -15,9 +15,9 @@ go_library( "//internal/env", "//internal/grpc/chunk", "//internal/grpc/defaults", - "//internal/telemetrygateway/v1:telemetrygateway", "//internal/trace", "//lib/errors", + "//lib/telemetrygateway/v1:telemetrygateway", "@com_github_google_uuid//:uuid", "@com_github_sourcegraph_log//:log", "@io_opentelemetry_go_otel//attribute", @@ -27,16 +27,28 @@ go_library( go_test( name = "telemetrygateway_test", - srcs = ["identifier_test.go"], + srcs = [ + "backcompat_test.go", + "identifier_test.go", + "main_test.go", + ], + data = glob(["testdata/**"]), embed = [":telemetrygateway"], deps = [ "//internal/conf", "//internal/conf/conftypes", "//internal/database", "//internal/database/dbmocks", + "//internal/trace/tracetest", + "//lib/pointers", + "//lib/telemetrygateway/v1:telemetrygateway", "//schema", "@com_github_hexops_autogold_v2//:autogold", + "@com_github_stretchr_testify//assert", "@com_github_stretchr_testify//require", "@org_golang_google_protobuf//encoding/protojson", + "@org_golang_google_protobuf//proto", + "@org_golang_google_protobuf//types/known/structpb", + "@org_golang_google_protobuf//types/known/timestamppb", ], ) diff --git a/internal/telemetrygateway/v1/backcompat_test.go b/internal/telemetrygateway/backcompat_test.go similarity index 97% rename from internal/telemetrygateway/v1/backcompat_test.go rename to internal/telemetrygateway/backcompat_test.go index b560272eb34..8930938e46c 100644 --- a/internal/telemetrygateway/v1/backcompat_test.go +++ b/internal/telemetrygateway/backcompat_test.go @@ -1,4 +1,4 @@ -package v1_test +package telemetrygateway_test import ( "context" @@ -18,8 +18,8 @@ import ( "github.com/sourcegraph/sourcegraph/lib/pointers" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/internal/trace/tracetest" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) var ( diff --git a/internal/telemetrygateway/event/BUILD.bazel b/internal/telemetrygateway/event/BUILD.bazel new file mode 100644 index 00000000000..2ecbf88abf8 --- /dev/null +++ b/internal/telemetrygateway/event/BUILD.bazel @@ -0,0 +1,36 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("//dev:go_defs.bzl", "go_test") + +go_library( + name = "event", + srcs = ["event.go"], + importpath = "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/event", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/actor", + "//internal/featureflag", + "//internal/requestclient", + "//internal/requestinteraction", + "//internal/trace", + "//lib/pointers", + "//lib/telemetrygateway/v1:telemetrygateway", + "@org_golang_google_protobuf//types/known/timestamppb", + ], +) + +go_test( + name = "event_test", + srcs = ["event_test.go"], + embed = [":event"], + deps = [ + "//internal/actor", + "//internal/requestclient", + "//internal/trace", + "//internal/trace/tracetest", + "//lib/telemetrygateway/v1:telemetrygateway", + "@com_github_hexops_autogold_v2//:autogold", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + "@org_golang_google_protobuf//encoding/protojson", + ], +) diff --git a/internal/telemetrygateway/v1/event.go b/internal/telemetrygateway/event/event.go similarity index 70% rename from internal/telemetrygateway/v1/event.go rename to internal/telemetrygateway/event/event.go index 878cd37b2de..c9d8b73f9c2 100644 --- a/internal/telemetrygateway/v1/event.go +++ b/internal/telemetrygateway/event/event.go @@ -1,11 +1,10 @@ -package v1 +package telemetrygatewayevent import ( "context" "strconv" "time" - "github.com/google/uuid" "google.golang.org/protobuf/types/known/timestamppb" "github.com/sourcegraph/sourcegraph/internal/actor" @@ -14,23 +13,23 @@ import ( "github.com/sourcegraph/sourcegraph/internal/requestinteraction" "github.com/sourcegraph/sourcegraph/internal/trace" "github.com/sourcegraph/sourcegraph/lib/pointers" + + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) // DefaultEventIDFunc is the default generator for telemetry event IDs. // We currently use V7, which is time-ordered, making them useful for event IDs. // https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-03#name-uuid-version-7 -var DefaultEventIDFunc = func() string { - return uuid.Must(uuid.NewV7()).String() -} +var DefaultEventIDFunc = telemetrygatewayv1.DefaultEventIDFunc -// NewEventWithDefaults creates a uniform event with defaults filled in. All -// constructors making raw events should start with this. In particular, this -// adds any relevant data required from context. -func NewEventWithDefaults(ctx context.Context, now time.Time, newEventID func() string) *Event { - return &Event{ +// New creates a uniform event with defaults filled in, including any relevant +// data required from context. All constructors making raw events for Sourcegraph +// instances to export MUST start with this. +func New(ctx context.Context, now time.Time, newEventID func() string) *telemetrygatewayv1.Event { + return &telemetrygatewayv1.Event{ Id: newEventID(), Timestamp: timestamppb.New(now), - Interaction: func() *EventInteraction { + Interaction: func() *telemetrygatewayv1.EventInteraction { // Trace associated with event is the same trace on the event recording // request where the event is being created, as they should all happen // within the interaction, even when recording a set of events e.g. from @@ -47,10 +46,10 @@ func NewEventWithDefaults(ctx context.Context, now time.Time, newEventID func() } // Get geolocation of request client, if there is one. - var geolocation *EventInteraction_Geolocation + var geolocation *telemetrygatewayv1.EventInteraction_Geolocation if rc := requestclient.FromContext(ctx); rc != nil { if cc, err := rc.OriginCountryCode(); err == nil { - geolocation = &EventInteraction_Geolocation{ + geolocation = &telemetrygatewayv1.EventInteraction_Geolocation{ CountryCode: cc, } } @@ -62,23 +61,23 @@ func NewEventWithDefaults(ctx context.Context, now time.Time, newEventID func() return nil } - return &EventInteraction{ + return &telemetrygatewayv1.EventInteraction{ TraceId: traceID, InteractionId: interactionID, Geolocation: geolocation, } }(), - User: func() *EventUser { + User: func() *telemetrygatewayv1.EventUser { act := actor.FromContext(ctx) if !act.IsAuthenticated() && act.AnonymousUID == "" { return nil } - return &EventUser{ + return &telemetrygatewayv1.EventUser{ UserId: pointers.NonZeroPtr(int64(act.UID)), AnonymousUserId: pointers.NonZeroPtr(act.AnonymousUID), } }(), - FeatureFlags: func() *EventFeatureFlags { + FeatureFlags: func() *telemetrygatewayv1.EventFeatureFlags { flags := featureflag.GetEvaluatedFlagSet(ctx) if len(flags) == 0 { return nil @@ -87,7 +86,7 @@ func NewEventWithDefaults(ctx context.Context, now time.Time, newEventID func() for k, v := range flags { data[k] = strconv.FormatBool(v) } - return &EventFeatureFlags{ + return &telemetrygatewayv1.EventFeatureFlags{ Flags: data, } }(), diff --git a/internal/telemetrygateway/v1/event_test.go b/internal/telemetrygateway/event/event_test.go similarity index 88% rename from internal/telemetrygateway/v1/event_test.go rename to internal/telemetrygateway/event/event_test.go index a66acd76985..a46ef9aafa9 100644 --- a/internal/telemetrygateway/v1/event_test.go +++ b/internal/telemetrygateway/event/event_test.go @@ -1,4 +1,4 @@ -package v1_test +package telemetrygatewayevent import ( "context" @@ -16,7 +16,7 @@ import ( "github.com/sourcegraph/sourcegraph/internal/trace" "github.com/sourcegraph/sourcegraph/internal/trace/tracetest" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func TestDefaultEventIDFunc(t *testing.T) { @@ -25,13 +25,13 @@ func TestDefaultEventIDFunc(t *testing.T) { assert.NotEmpty(t, id) } -func TestNewEventWithDefaults(t *testing.T) { +func TestNew(t *testing.T) { staticTime, err := time.Parse(time.RFC3339, "2023-02-24T14:48:30Z") require.NoError(t, err) t.Run("empty context", func(t *testing.T) { ctx := context.Background() - got := telemetrygatewayv1.NewEventWithDefaults(ctx, staticTime, func() string { return "id" }) + got := New(ctx, staticTime, func() string { return "id" }) assert.Nil(t, got.User) assert.Nil(t, got.Interaction) assert.Nil(t, got.FeatureFlags) @@ -51,7 +51,7 @@ func TestNewEventWithDefaults(t *testing.T) { // is not designed for it to easily be stubbed out for testing. // Since it's used for existing telemetry, we trust it works. - got := telemetrygatewayv1.NewEventWithDefaults(ctx, staticTime, func() string { return "id" }) + got := New(ctx, staticTime, func() string { return "id" }) assert.NotNil(t, got.User) protodata, err := protojson.Marshal(got) @@ -87,7 +87,7 @@ func TestNewEventWithDefaults(t *testing.T) { // is not designed for it to easily be stubbed out for testing. // Since it's used for existing telemetry, we trust it works. - got := telemetrygatewayv1.NewEventWithDefaults(ctx, staticTime, func() string { return "id" }) + got := New(ctx, staticTime, func() string { return "id" }) assert.NotNil(t, got.Interaction) protodata, err := protojson.Marshal(got) diff --git a/internal/telemetrygateway/exporter.go b/internal/telemetrygateway/exporter.go index 3b2e5ec708f..981c8140435 100644 --- a/internal/telemetrygateway/exporter.go +++ b/internal/telemetrygateway/exporter.go @@ -16,9 +16,9 @@ import ( "github.com/sourcegraph/sourcegraph/internal/env" "github.com/sourcegraph/sourcegraph/internal/grpc/chunk" "github.com/sourcegraph/sourcegraph/internal/grpc/defaults" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/internal/trace" "github.com/sourcegraph/sourcegraph/lib/errors" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) type Exporter interface { diff --git a/internal/telemetrygateway/identifier.go b/internal/telemetrygateway/identifier.go index 1c002b639c8..960f5b665b4 100644 --- a/internal/telemetrygateway/identifier.go +++ b/internal/telemetrygateway/identifier.go @@ -5,8 +5,8 @@ import ( "github.com/sourcegraph/sourcegraph/internal/conf/conftypes" "github.com/sourcegraph/sourcegraph/internal/database" - telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1" "github.com/sourcegraph/sourcegraph/lib/errors" + telemetrygatewayv1 "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1" ) func newIdentifier(ctx context.Context, c conftypes.SiteConfigQuerier, g database.GlobalStateStore) (*telemetrygatewayv1.Identifier, error) { diff --git a/internal/telemetrygateway/v1/main_test.go b/internal/telemetrygateway/main_test.go similarity index 80% rename from internal/telemetrygateway/v1/main_test.go rename to internal/telemetrygateway/main_test.go index b98d6682c9e..14756754156 100644 --- a/internal/telemetrygateway/v1/main_test.go +++ b/internal/telemetrygateway/main_test.go @@ -1,4 +1,4 @@ -package v1 +package telemetrygateway import ( "flag" diff --git a/internal/telemetrygateway/v1/testdata/snapshots/2023-09-15.pb b/internal/telemetrygateway/testdata/snapshots/2023-09-15.pb similarity index 100% rename from internal/telemetrygateway/v1/testdata/snapshots/2023-09-15.pb rename to internal/telemetrygateway/testdata/snapshots/2023-09-15.pb diff --git a/internal/telemetrygateway/v1/testdata/snapshots/2023-10-25.pb b/internal/telemetrygateway/testdata/snapshots/2023-10-25.pb similarity index 100% rename from internal/telemetrygateway/v1/testdata/snapshots/2023-10-25.pb rename to internal/telemetrygateway/testdata/snapshots/2023-10-25.pb diff --git a/internal/telemetrygateway/v1/testdata/snapshots/2023-11-16.pb b/internal/telemetrygateway/testdata/snapshots/2023-11-16.pb similarity index 100% rename from internal/telemetrygateway/v1/testdata/snapshots/2023-11-16.pb rename to internal/telemetrygateway/testdata/snapshots/2023-11-16.pb diff --git a/internal/telemetrygateway/v1/testdata/snapshots/2023-11-28.pb b/internal/telemetrygateway/testdata/snapshots/2023-11-28.pb similarity index 100% rename from internal/telemetrygateway/v1/testdata/snapshots/2023-11-28.pb rename to internal/telemetrygateway/testdata/snapshots/2023-11-28.pb diff --git a/internal/telemetrygateway/v1/README.md b/internal/telemetrygateway/v1/README.md new file mode 100644 index 00000000000..e0a8a152d4b --- /dev/null +++ b/internal/telemetrygateway/v1/README.md @@ -0,0 +1,3 @@ +# THIS SERVICE SPECIFICATION HAS MOVED TO [`lib/telemetrygateway/v1`](../../../lib/telemetrygateway/v1/telemetrygateway.proto) + +A symlink to the service specification is maintained here to preserve existing documentation links. diff --git a/internal/telemetrygateway/v1/telemetrygateway.proto b/internal/telemetrygateway/v1/telemetrygateway.proto deleted file mode 100644 index 581f64e9e89..00000000000 --- a/internal/telemetrygateway/v1/telemetrygateway.proto +++ /dev/null @@ -1,285 +0,0 @@ -// 🔔 IMPORTANT: Be VERY careful not to introduce breaking changes to this -// spec - raw protocol buffer wire format messages are persisted to database -// as a cache, and Sourcegraph instances rely on this format to emit telemetry -// to the managed Sourcegraph Telemetry Gateway service. -// -// Tests in ./internal/telemetrygateway/v1/backcompat_test.go can be used to -// assert compatibility with snapshots created by older versions of this spec. - -syntax = "proto3"; - -package telemetrygateway.v1; - -import "google/protobuf/struct.proto"; -import "google/protobuf/timestamp.proto"; - -option go_package = "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1"; - -service TelemeteryGatewayService { - // RecordEvents streams telemetry events in batches to the Telemetry Gateway - // service. Events should only be considered delivered if recording is - // acknowledged in RecordEventsResponse. - // - // This is the preferred mechanism for exporting large volumes of events in - // bulk. - // - // 🚨 SECURITY: Callers exporting for single-tenant Sourcegraph should check - // the attributes of the Event type to ensure that only the appropriate fields - // are exported, as some fields should only be exported on an allowlist basis. - rpc RecordEvents(stream RecordEventsRequest) returns (stream RecordEventsResponse) {} - - // RecordEvent records a single telemetry event to the Telemetry Gateway service. - // If the RPC succeeds, then the event was successfully published. - // - // This RPC currently ONLY accepts events published by ManagedServiceIdentifier, - // as this mechanism is intended for low-volume managed services. Higher-volume - // use cases should implement a batching mechanism and use the RecordEvents - // RPC instead. - // - // 🚨 SECURITY: Callers exporting for single-tenant Sourcegraph should check - // the attributes of the Event type to ensure that only the appropriate fields - // are exported, as some fields should only be exported on an allowlist basis. - rpc RecordEvent(RecordEventRequest) returns (RecordEventResponse) {} -} - -message Identifier { - message LicensedInstanceIdentifier { - // License key configured in the Sourcegraph instance emitting the event. - string license_key = 1; - // Self-reported Sourcegraph instance identifier. - string instance_id = 2; - // Instance external URL defined in the instance site configuration. - string external_url = 3; - } - - message UnlicensedInstanceIdentifier { - // Self-reported Sourcegraph instance identifier. - string instance_id = 1; - // Instance external URL defined in the instance site configuration. - string external_url = 2; - } - - message ManagedServiceIdentifier { - // Self-reported service identifier, for example 'my-service'. - string service_id = 1; - // Self-reported service environment, for example 'prod' or 'dev'. - optional string service_environment = 2; - } - - oneof identifier { - // A licensed Sourcegraph instance. - LicensedInstanceIdentifier licensed_instance = 1; - // An unlicensed Sourcegraph instance. - UnlicensedInstanceIdentifier unlicensed_instance = 2; - // A service operated and managed by the Sourcegraph team, for example - // a service deployed by MSP: https://handbook.sourcegraph.com/departments/engineering/teams/core-services/managed-services/platform/ - // - // Valid SAMS client credentials are required to publish events under a - // managed service identifier. The required scope is - // 'telemetry_gateway::events::publish'. See go/sams-client-credentials and - // go/sams-token-scopes for more information. - ManagedServiceIdentifier managed_service = 3; - } -} - -message RecordEventsRequestMetadata { - // Client-provided request identifier for diagnostics purposes. - string request_id = 1; - // Telemetry publisher self-identification - for example, a Sourcegraph - // instance of some other kind of service. - Identifier identifier = 2; -} - -message RecordEventsRequest { - message EventsPayload { - repeated Event events = 1; - } - - oneof payload { - // Metadata about the events being recorded. - RecordEventsRequestMetadata metadata = 1; - // Batch of events to record in a single request. Clients should aim to - // batch large event backlogs into a series of smaller requests in the - // RecordEvents stream, being mindful of common limits in individual message - // sizes: https://protobuf.dev/programming-guides/api/#bound-req-res-sizes - EventsPayload events = 2; - } -} - -message RecordEventsResponse { - // IDs of all events that were successfully recorded in the request. - // - // Note that if succeeded_events is a subset of events that were submitted, - // then some events failed to record and should be retried. - repeated string succeeded_events = 1; -} - -message RecordEventRequest { - // Metadata about the events being recorded. - RecordEventsRequestMetadata metadata = 1; - // Event to record. - Event event = 2; -} - -message RecordEventResponse {} - -message Event { - // Generated ID of the event, currently expected to be UUID v4. - string id = 1; - // Timestamp of when the original event was recorded. - google.protobuf.Timestamp timestamp = 2; - // Feature associated with the event in camelCase, e.g. 'myFeature'. - string feature = 3; - // Action associated with the event in camelCase, e.g. 'pageView'. - string action = 4; - // Source of the event. - EventSource source = 5; - // Parameters of the event. - EventParameters parameters = 6; - // Optional user associated with the event. - // - // This field should be hydrated by the Sourcegraph server, and not provided - // by clients. - optional EventUser user = 7; - // Optional feature flags configured in the context of the event. - optional EventFeatureFlags feature_flags = 8; - // Optional marketing campaign tracking parameters. - // - // 🚨 SECURITY: This metadata is NEVER exported from single-tenant Sourcegraph - // instances, and is only exported for events tracked in the public - // Sourcegraph.com instance and managed services. - optional EventMarketingTracking marketing_tracking = 9; - // Optional metadata identifying the interaction that generated the event. - optional EventInteraction interaction = 10; -} - -message EventSource { - message Server { - // Version of the server emitting the event, corresponding to - // RecordEventsRequestMetadata.Identifier. For example, if the Identifier - // indicates the publisher is a Sourcegraph instance, the version represents - // the version of the Sourcegraph server. - string version = 1; - } - message Client { - // Source client of the event. - string name = 1; - // Version of the client. - optional string version = 2; - } - - // Information about the server that is publishing the event, based on - // RecordEventsRequestMetadata.Identifier. - Server server = 1; - // Information about the client that generated the event. - optional Client client = 2; -} - -message EventParameters { - // Version of the event parameters, used for indicating the "shape" of this - // event's metadata, beginning at 0. Useful for denoting if the shape of - // metadata has changed in any way. - int32 version = 1; - - // DEPRECATED, legacy metadata format that only accepted int64 - use the new - // 'metadata' field instead, which accepts float values. Values sent through - // this proto field will be merged into the new metadata attributes. - // - // We don't use a [deprecated = true] tag because we use this field to handle - // accepting exporters sending metadata in this format. - map legacy_metadata = 2; - // Strictly typed metadata, restricted to integer values to avoid accidentally - // exporting sensitive or private data. - map metadata = 5; - - // Additional potentially sensitive metadata - i.e. not restricted to integer - // values. - // - // 🚨 SECURITY: This metadata is NOT exported from instances by default, as it - // can contain arbitrarily-shaped data that may accidentally contain sensitive - // or private contents. - // - // This metadata is only exported on an allowlist basis based on terms of - // use agreements and combinations of event feature and action, alongside - // careful audit of callsites. - optional google.protobuf.Struct private_metadata = 3; - // Optional billing-related metadata. - optional EventBillingMetadata billing_metadata = 4; -} - -message EventBillingMetadata { - // Billing product ID associated with the event. - string product = 1; - // Billing category ID the event falls into. - string category = 2; -} - -message EventUser { - // Sourcegraph instance database user ID of the user. User IDs are specific to - // a Sourcegraph instance, and are not universal across Sourcegraph instances. - // - // We use an int64 as an ID because in Sourcegraph, database user IDs are - // always integers. - optional int64 user_id = 1; - // Randomized unique identifier representing the user (typically stored in - // localstorage in web clients, or similar mechanisms elsewhere). This is - // often used for unauthenticated users, but can persist to authenticated - // users as well. - optional string anonymous_user_id = 2; - // Sourcegraph Accounts Management System (SAMS) account associated with the - // user, represented by a SAMS external user ID in a UUID format. This is only - // valid for services leveraging SAMS as an identity provider - in other words, - // traditional Sourcegraph instances will not provide this. - // - // Learn more about SAMS: https://handbook.sourcegraph.com/departments/engineering/teams/core-services/sams - optional string sams_external_id = 3; -} - -message EventFeatureFlags { - // Evaluated feature flags. In Soucegraph we currently only support boolean - // feature flags, but in the API we allow arbitrary string values for future - // extensibility. - // - // This field should be hydrated by the Sourcegraph server, and not provided - // by clients. - map flags = 1; -} - -// Marketing campaign tracking metadata. -// -// 🚨 SECURITY: This metadata is NEVER exported from single-tenant Sourcegraph -// instances, and is only exported for events tracked in the public -// Sourcegraph.com instance and managed services. -message EventMarketingTracking { - // URL the event occurred on. - optional string url = 1; - // Initial URL the user landed on. - optional string first_source_url = 2; - // Cohort ID to identify the user as part of a specific A/B test. - optional string cohort_id = 3; - // Referrer URL that refers the user to Sourcegraph. - optional string referrer = 4; - // Last source URL visited by the user. - optional string last_source_url = 5; - // Device session ID to identify the user's session. - optional string device_session_id = 6; - // Session referrer URL for the user. - optional string session_referrer = 7; - // First URL the user visited in their current session. - optional string session_first_url = 8; -} - -message EventInteraction { - // OpenTelemetry trace ID representing the interaction associated with the event. - optional string trace_id = 1; - // Custom interaction ID representing the interaction associated with the event. - optional string interaction_id = 2; - - message Geolocation { - // Inferred ISO 3166-1 alpha-2 or alpha-3 country code - string country_code = 1; - } - // Geolocation associated with the interaction, typically inferred from the - // originating client's IP address (which we do not collect). - optional Geolocation geolocation = 3; -} diff --git a/internal/telemetrygateway/v1/telemetrygateway.proto b/internal/telemetrygateway/v1/telemetrygateway.proto new file mode 120000 index 00000000000..63eb1359d7e --- /dev/null +++ b/internal/telemetrygateway/v1/telemetrygateway.proto @@ -0,0 +1 @@ +../../../lib/telemetrygateway/v1/telemetrygateway.proto \ No newline at end of file diff --git a/lib/go.mod b/lib/go.mod index 65c908e029e..d0891162511 100644 --- a/lib/go.mod +++ b/lib/go.mod @@ -15,6 +15,7 @@ require ( github.com/go-enry/go-enry/v2 v2.8.4 github.com/gobwas/glob v0.2.3 github.com/google/go-cmp v0.6.0 + github.com/google/uuid v1.6.0 github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db github.com/hexops/autogold/v2 v2.0.3 github.com/jackc/pgconn v1.14.0 @@ -35,6 +36,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 golang.org/x/sys v0.17.0 golang.org/x/term v0.17.0 + google.golang.org/grpc v1.59.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 @@ -69,7 +71,6 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/uuid v1.4.0 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect github.com/hexops/valast v1.4.3 // indirect @@ -125,7 +126,6 @@ require ( golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.18.0 // indirect google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect - google.golang.org/grpc v1.59.0 // indirect gotest.tools/v3 v3.0.3 // indirect mvdan.cc/gofumpt v0.4.0 // indirect ) diff --git a/lib/go.sum b/lib/go.sum index 67ec3adfba9..7647fef8954 100644 --- a/lib/go.sum +++ b/lib/go.sum @@ -128,8 +128,8 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db h1:7aN5cccjIqCLTzedH7MZzRZt5/lsAHch6Z3L2ZGn5FA= diff --git a/lib/managedservicesplatform/go.mod b/lib/managedservicesplatform/go.mod index 8b6d974a93d..830564be7a0 100644 --- a/lib/managedservicesplatform/go.mod +++ b/lib/managedservicesplatform/go.mod @@ -64,7 +64,7 @@ require ( github.com/google/go-cmp v0.6.0 // indirect github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.5.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect diff --git a/lib/managedservicesplatform/go.sum b/lib/managedservicesplatform/go.sum index 84136ae4ec6..aa8c2387e2a 100644 --- a/lib/managedservicesplatform/go.sum +++ b/lib/managedservicesplatform/go.sum @@ -142,8 +142,8 @@ github.com/google/pprof v0.0.0-20230602150820-91b7bce49751/go.mod h1:Jh3hGz2jkYa github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= diff --git a/lib/telemetrygateway/CODENOTIFY b/lib/telemetrygateway/CODENOTIFY new file mode 100644 index 00000000000..735b821e5d9 --- /dev/null +++ b/lib/telemetrygateway/CODENOTIFY @@ -0,0 +1,2 @@ +**/* @sourcegraph/core-services +**/* @sourcegraph/data-team diff --git a/internal/telemetrygateway/v1/BUILD.bazel b/lib/telemetrygateway/v1/BUILD.bazel similarity index 63% rename from internal/telemetrygateway/v1/BUILD.bazel rename to lib/telemetrygateway/v1/BUILD.bazel index f6385796188..9d9cea73338 100644 --- a/internal/telemetrygateway/v1/BUILD.bazel +++ b/lib/telemetrygateway/v1/BUILD.bazel @@ -1,4 +1,3 @@ -load("//dev:go_defs.bzl", "go_test") load("@io_bazel_rules_go//go:def.bzl", "go_library") load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") load("@rules_buf//buf:defs.bzl", "buf_lint_test") @@ -8,7 +7,7 @@ load("@rules_proto_grpc//doc:defs.bzl", "doc_template_compile") proto_library( name = "v1_proto", srcs = ["telemetrygateway.proto"], - strip_import_prefix = "/internal", # keep + strip_import_prefix = "/lib", # keep visibility = ["//visibility:private"], deps = [ "@com_google_protobuf//:struct_proto", @@ -22,16 +21,16 @@ go_proto_library( "//:gen-go-grpc", "@io_bazel_rules_go//proto:go_proto", ], - importpath = "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1", + importpath = "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1", proto = ":v1_proto", visibility = ["//visibility:private"], ) go_library( name = "telemetrygateway", - srcs = ["event.go"], + srcs = ["v1.go"], embed = [":v1_go_proto"], - importpath = "github.com/sourcegraph/sourcegraph/internal/telemetrygateway/v1", + importpath = "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1", visibility = [ "//cmd/frontend/internal/telemetry/resolvers:__pkg__", "//cmd/telemetry-gateway/internal/events:__pkg__", @@ -49,20 +48,12 @@ go_library( "//internal/telemetry/teestore:__pkg__", "//internal/telemetry/telemetrytest:__pkg__", "//internal/telemetrygateway:__pkg__", + "//internal/telemetrygateway/event:__pkg__", "//internal/telemetrygateway/gitdomain:__pkg__", "//internal/telemetrygateway/integration_tests:__pkg__", "//internal/telemetrygateway/protocol:__pkg__", ], - deps = [ - "//internal/actor", - "//internal/featureflag", - "//internal/requestclient", - "//internal/requestinteraction", - "//internal/trace", - "//lib/pointers", - "@com_github_google_uuid//:uuid", - "@org_golang_google_protobuf//types/known/timestamppb", - ], + deps = ["@com_github_google_uuid//:uuid"], ) # See https://github.com/sourcegraph/sourcegraph/issues/50032 @@ -79,31 +70,6 @@ buf_lint_test( targets = [":v1_proto"], ) -go_test( - name = "telemetrygateway_test", - srcs = [ - "backcompat_test.go", - "event_test.go", - "main_test.go", - ], - data = glob(["testdata/**"]), - embed = [":telemetrygateway"], - deps = [ - "//internal/actor", - "//internal/requestclient", - "//internal/trace", - "//internal/trace/tracetest", - "//lib/pointers", - "@com_github_hexops_autogold_v2//:autogold", - "@com_github_stretchr_testify//assert", - "@com_github_stretchr_testify//require", - "@org_golang_google_protobuf//encoding/protojson", - "@org_golang_google_protobuf//proto", - "@org_golang_google_protobuf//types/known/structpb", - "@org_golang_google_protobuf//types/known/timestamppb", - ], -) - doc_template_compile( name = "protocol.md", protos = [":v1_proto"], diff --git a/internal/telemetrygateway/v1/buf.gen.yaml b/lib/telemetrygateway/v1/buf.gen.yaml similarity index 100% rename from internal/telemetrygateway/v1/buf.gen.yaml rename to lib/telemetrygateway/v1/buf.gen.yaml diff --git a/internal/telemetrygateway/v1/protoc-gen-doc.tmpl b/lib/telemetrygateway/v1/protoc-gen-doc.tmpl similarity index 100% rename from internal/telemetrygateway/v1/protoc-gen-doc.tmpl rename to lib/telemetrygateway/v1/protoc-gen-doc.tmpl diff --git a/internal/telemetrygateway/v1/telemetrygateway.pb.go b/lib/telemetrygateway/v1/telemetrygateway.pb.go similarity index 99% rename from internal/telemetrygateway/v1/telemetrygateway.pb.go rename to lib/telemetrygateway/v1/telemetrygateway.pb.go index 7213fb96c48..9319ecf7c6a 100644 --- a/internal/telemetrygateway/v1/telemetrygateway.pb.go +++ b/lib/telemetrygateway/v1/telemetrygateway.pb.go @@ -3,7 +3,7 @@ // as a cache, and Sourcegraph instances rely on this format to emit telemetry // to the managed Sourcegraph Telemetry Gateway service. // -// Tests in ./internal/telemetrygateway/v1/backcompat_test.go can be used to +// Tests in ./internal/telemetrygateway/backcompat_test.go can be used to // assert compatibility with snapshots created by older versions of this spec. // Code generated by protoc-gen-go. DO NOT EDIT. @@ -1749,12 +1749,11 @@ var file_telemetrygateway_proto_rawDesc = []byte{ 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, - 0x72, 0x79, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x69, 0x62, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/lib/telemetrygateway/v1/telemetrygateway.proto b/lib/telemetrygateway/v1/telemetrygateway.proto new file mode 100644 index 00000000000..7294ca20cce --- /dev/null +++ b/lib/telemetrygateway/v1/telemetrygateway.proto @@ -0,0 +1,285 @@ +// 🔔 IMPORTANT: Be VERY careful not to introduce breaking changes to this +// spec - raw protocol buffer wire format messages are persisted to database +// as a cache, and Sourcegraph instances rely on this format to emit telemetry +// to the managed Sourcegraph Telemetry Gateway service. +// +// Tests in ./internal/telemetrygateway/backcompat_test.go can be used to +// assert compatibility with snapshots created by older versions of this spec. + +syntax = "proto3"; + +package telemetrygateway.v1; + +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/sourcegraph/sourcegraph/lib/telemetrygateway/v1"; + +service TelemeteryGatewayService { + // RecordEvents streams telemetry events in batches to the Telemetry Gateway + // service. Events should only be considered delivered if recording is + // acknowledged in RecordEventsResponse. + // + // This is the preferred mechanism for exporting large volumes of events in + // bulk. + // + // 🚨 SECURITY: Callers exporting for single-tenant Sourcegraph should check + // the attributes of the Event type to ensure that only the appropriate fields + // are exported, as some fields should only be exported on an allowlist basis. + rpc RecordEvents(stream RecordEventsRequest) returns (stream RecordEventsResponse) {} + + // RecordEvent records a single telemetry event to the Telemetry Gateway service. + // If the RPC succeeds, then the event was successfully published. + // + // This RPC currently ONLY accepts events published by ManagedServiceIdentifier, + // as this mechanism is intended for low-volume managed services. Higher-volume + // use cases should implement a batching mechanism and use the RecordEvents + // RPC instead. + // + // 🚨 SECURITY: Callers exporting for single-tenant Sourcegraph should check + // the attributes of the Event type to ensure that only the appropriate fields + // are exported, as some fields should only be exported on an allowlist basis. + rpc RecordEvent(RecordEventRequest) returns (RecordEventResponse) {} +} + +message Identifier { + message LicensedInstanceIdentifier { + // License key configured in the Sourcegraph instance emitting the event. + string license_key = 1; + // Self-reported Sourcegraph instance identifier. + string instance_id = 2; + // Instance external URL defined in the instance site configuration. + string external_url = 3; + } + + message UnlicensedInstanceIdentifier { + // Self-reported Sourcegraph instance identifier. + string instance_id = 1; + // Instance external URL defined in the instance site configuration. + string external_url = 2; + } + + message ManagedServiceIdentifier { + // Self-reported service identifier, for example 'my-service'. + string service_id = 1; + // Self-reported service environment, for example 'prod' or 'dev'. + optional string service_environment = 2; + } + + oneof identifier { + // A licensed Sourcegraph instance. + LicensedInstanceIdentifier licensed_instance = 1; + // An unlicensed Sourcegraph instance. + UnlicensedInstanceIdentifier unlicensed_instance = 2; + // A service operated and managed by the Sourcegraph team, for example + // a service deployed by MSP: https://handbook.sourcegraph.com/departments/engineering/teams/core-services/managed-services/platform/ + // + // Valid SAMS client credentials are required to publish events under a + // managed service identifier. The required scope is + // 'telemetry_gateway::events::publish'. See go/sams-client-credentials and + // go/sams-token-scopes for more information. + ManagedServiceIdentifier managed_service = 3; + } +} + +message RecordEventsRequestMetadata { + // Client-provided request identifier for diagnostics purposes. + string request_id = 1; + // Telemetry publisher self-identification - for example, a Sourcegraph + // instance of some other kind of service. + Identifier identifier = 2; +} + +message RecordEventsRequest { + message EventsPayload { + repeated Event events = 1; + } + + oneof payload { + // Metadata about the events being recorded. + RecordEventsRequestMetadata metadata = 1; + // Batch of events to record in a single request. Clients should aim to + // batch large event backlogs into a series of smaller requests in the + // RecordEvents stream, being mindful of common limits in individual message + // sizes: https://protobuf.dev/programming-guides/api/#bound-req-res-sizes + EventsPayload events = 2; + } +} + +message RecordEventsResponse { + // IDs of all events that were successfully recorded in the request. + // + // Note that if succeeded_events is a subset of events that were submitted, + // then some events failed to record and should be retried. + repeated string succeeded_events = 1; +} + +message RecordEventRequest { + // Metadata about the events being recorded. + RecordEventsRequestMetadata metadata = 1; + // Event to record. + Event event = 2; +} + +message RecordEventResponse {} + +message Event { + // Generated ID of the event, currently expected to be UUID v4. + string id = 1; + // Timestamp of when the original event was recorded. + google.protobuf.Timestamp timestamp = 2; + // Feature associated with the event in camelCase, e.g. 'myFeature'. + string feature = 3; + // Action associated with the event in camelCase, e.g. 'pageView'. + string action = 4; + // Source of the event. + EventSource source = 5; + // Parameters of the event. + EventParameters parameters = 6; + // Optional user associated with the event. + // + // This field should be hydrated by the Sourcegraph server, and not provided + // by clients. + optional EventUser user = 7; + // Optional feature flags configured in the context of the event. + optional EventFeatureFlags feature_flags = 8; + // Optional marketing campaign tracking parameters. + // + // 🚨 SECURITY: This metadata is NEVER exported from single-tenant Sourcegraph + // instances, and is only exported for events tracked in the public + // Sourcegraph.com instance and managed services. + optional EventMarketingTracking marketing_tracking = 9; + // Optional metadata identifying the interaction that generated the event. + optional EventInteraction interaction = 10; +} + +message EventSource { + message Server { + // Version of the server emitting the event, corresponding to + // RecordEventsRequestMetadata.Identifier. For example, if the Identifier + // indicates the publisher is a Sourcegraph instance, the version represents + // the version of the Sourcegraph server. + string version = 1; + } + message Client { + // Source client of the event. + string name = 1; + // Version of the client. + optional string version = 2; + } + + // Information about the server that is publishing the event, based on + // RecordEventsRequestMetadata.Identifier. + Server server = 1; + // Information about the client that generated the event. + optional Client client = 2; +} + +message EventParameters { + // Version of the event parameters, used for indicating the "shape" of this + // event's metadata, beginning at 0. Useful for denoting if the shape of + // metadata has changed in any way. + int32 version = 1; + + // DEPRECATED, legacy metadata format that only accepted int64 - use the new + // 'metadata' field instead, which accepts float values. Values sent through + // this proto field will be merged into the new metadata attributes. + // + // We don't use a [deprecated = true] tag because we use this field to handle + // accepting exporters sending metadata in this format. + map legacy_metadata = 2; + // Strictly typed metadata, restricted to integer values to avoid accidentally + // exporting sensitive or private data. + map metadata = 5; + + // Additional potentially sensitive metadata - i.e. not restricted to integer + // values. + // + // 🚨 SECURITY: This metadata is NOT exported from instances by default, as it + // can contain arbitrarily-shaped data that may accidentally contain sensitive + // or private contents. + // + // This metadata is only exported on an allowlist basis based on terms of + // use agreements and combinations of event feature and action, alongside + // careful audit of callsites. + optional google.protobuf.Struct private_metadata = 3; + // Optional billing-related metadata. + optional EventBillingMetadata billing_metadata = 4; +} + +message EventBillingMetadata { + // Billing product ID associated with the event. + string product = 1; + // Billing category ID the event falls into. + string category = 2; +} + +message EventUser { + // Sourcegraph instance database user ID of the user. User IDs are specific to + // a Sourcegraph instance, and are not universal across Sourcegraph instances. + // + // We use an int64 as an ID because in Sourcegraph, database user IDs are + // always integers. + optional int64 user_id = 1; + // Randomized unique identifier representing the user (typically stored in + // localstorage in web clients, or similar mechanisms elsewhere). This is + // often used for unauthenticated users, but can persist to authenticated + // users as well. + optional string anonymous_user_id = 2; + // Sourcegraph Accounts Management System (SAMS) account associated with the + // user, represented by a SAMS external user ID in a UUID format. This is only + // valid for services leveraging SAMS as an identity provider - in other words, + // traditional Sourcegraph instances will not provide this. + // + // Learn more about SAMS: https://handbook.sourcegraph.com/departments/engineering/teams/core-services/sams + optional string sams_external_id = 3; +} + +message EventFeatureFlags { + // Evaluated feature flags. In Soucegraph we currently only support boolean + // feature flags, but in the API we allow arbitrary string values for future + // extensibility. + // + // This field should be hydrated by the Sourcegraph server, and not provided + // by clients. + map flags = 1; +} + +// Marketing campaign tracking metadata. +// +// 🚨 SECURITY: This metadata is NEVER exported from single-tenant Sourcegraph +// instances, and is only exported for events tracked in the public +// Sourcegraph.com instance and managed services. +message EventMarketingTracking { + // URL the event occurred on. + optional string url = 1; + // Initial URL the user landed on. + optional string first_source_url = 2; + // Cohort ID to identify the user as part of a specific A/B test. + optional string cohort_id = 3; + // Referrer URL that refers the user to Sourcegraph. + optional string referrer = 4; + // Last source URL visited by the user. + optional string last_source_url = 5; + // Device session ID to identify the user's session. + optional string device_session_id = 6; + // Session referrer URL for the user. + optional string session_referrer = 7; + // First URL the user visited in their current session. + optional string session_first_url = 8; +} + +message EventInteraction { + // OpenTelemetry trace ID representing the interaction associated with the event. + optional string trace_id = 1; + // Custom interaction ID representing the interaction associated with the event. + optional string interaction_id = 2; + + message Geolocation { + // Inferred ISO 3166-1 alpha-2 or alpha-3 country code + string country_code = 1; + } + // Geolocation associated with the interaction, typically inferred from the + // originating client's IP address (which we do not collect). + optional Geolocation geolocation = 3; +} diff --git a/internal/telemetrygateway/v1/telemetrygateway_grpc.pb.go b/lib/telemetrygateway/v1/telemetrygateway_grpc.pb.go similarity index 99% rename from internal/telemetrygateway/v1/telemetrygateway_grpc.pb.go rename to lib/telemetrygateway/v1/telemetrygateway_grpc.pb.go index 05155265458..8b9b17a60cb 100644 --- a/internal/telemetrygateway/v1/telemetrygateway_grpc.pb.go +++ b/lib/telemetrygateway/v1/telemetrygateway_grpc.pb.go @@ -3,7 +3,7 @@ // as a cache, and Sourcegraph instances rely on this format to emit telemetry // to the managed Sourcegraph Telemetry Gateway service. // -// Tests in ./internal/telemetrygateway/v1/backcompat_test.go can be used to +// Tests in ./internal/telemetrygateway/backcompat_test.go can be used to // assert compatibility with snapshots created by older versions of this spec. // Code generated by protoc-gen-go-grpc. DO NOT EDIT. diff --git a/lib/telemetrygateway/v1/v1.go b/lib/telemetrygateway/v1/v1.go new file mode 100644 index 00000000000..2b628b4d05b --- /dev/null +++ b/lib/telemetrygateway/v1/v1.go @@ -0,0 +1,14 @@ +// Package v1 publishes telemetrygateway V1 bindings for both internal +// (single-tenant Sourcegraph) and external (standalone Sourcegraph-managed +// services) consumption. This package also includes standard defaults and +// helpers for Telemetry Gateway integrations. +package v1 + +import "github.com/google/uuid" + +// DefaultEventIDFunc is the default generator for telemetry event IDs. +// We currently use V7, which is time-ordered, making them useful for event IDs. +// https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-03#name-uuid-version-7 +var DefaultEventIDFunc = func() string { + return uuid.Must(uuid.NewV7()).String() +} diff --git a/monitoring/go.mod b/monitoring/go.mod index 47314b25a62..1ecfa3dbbe7 100644 --- a/monitoring/go.mod +++ b/monitoring/go.mod @@ -46,7 +46,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gosimple/slug v1.12.0 // indirect github.com/gosimple/unidecode v1.0.1 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect diff --git a/monitoring/go.sum b/monitoring/go.sum index 88922a9561f..2675148ed04 100644 --- a/monitoring/go.sum +++ b/monitoring/go.sum @@ -164,8 +164,8 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gosimple/slug v1.1.1/go.mod h1:ER78kgg1Mv0NQGlXiDe57DpCyfbNywXXZ9mIorhxAf0=