Showing preview only (5,315K chars total). Download the full file or copy to clipboard to get everything.
Repository: jaegertracing/jaeger
Branch: main
Commit: 733146d827b4
Files: 1166
Total size: 4.9 MB
Directory structure:
gitextract_8w1ucnwf/
├── .codecov.yml
├── .fossa.yml
├── .github/
│ ├── CODEOWNERS
│ ├── actions/
│ │ ├── block-pr-from-main-branch/
│ │ │ └── action.yml
│ │ ├── setup-branch/
│ │ │ └── action.yml
│ │ ├── setup-go-tip/
│ │ │ └── action.yml
│ │ ├── setup-node.js/
│ │ │ └── action.yml
│ │ ├── upload-codecov/
│ │ │ └── action.yml
│ │ └── verify-metrics-snapshot/
│ │ └── action.yaml
│ ├── scripts/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── ci-summary-report-publish.js
│ │ ├── ci-summary-report-publish.test.js
│ │ ├── list-open-prs-by-author.js
│ │ ├── package.json
│ │ ├── pr-quota-manager.js
│ │ ├── pr-quota-manager.test.js
│ │ └── waiting-for-author.js
│ └── workflows/
│ ├── README.md
│ ├── ci-build-binaries.yml
│ ├── ci-deploy-demo.yml
│ ├── ci-docker-all-in-one.yml
│ ├── ci-docker-build.yml
│ ├── ci-docker-hotrod.yml
│ ├── ci-e2e-all.yml
│ ├── ci-e2e-badger.yaml
│ ├── ci-e2e-cassandra.yml
│ ├── ci-e2e-clickhouse.yml
│ ├── ci-e2e-elasticsearch.yml
│ ├── ci-e2e-grpc.yml
│ ├── ci-e2e-kafka.yml
│ ├── ci-e2e-memory.yaml
│ ├── ci-e2e-opensearch.yml
│ ├── ci-e2e-query.yml
│ ├── ci-e2e-spm.yml
│ ├── ci-e2e-tailsampling.yml
│ ├── ci-lint-checks.yaml
│ ├── ci-orchestrator-stage1.yml
│ ├── ci-orchestrator-stage2.yml
│ ├── ci-orchestrator-stage3.yml
│ ├── ci-orchestrator.yml
│ ├── ci-release.yml
│ ├── ci-summary-report-publish.yml
│ ├── ci-summary-report.yml
│ ├── ci-unit-tests-go-tip.yml
│ ├── ci-unit-tests.yml
│ ├── codeql.yml
│ ├── dco_merge_group.yml
│ ├── dependency-review.yml
│ ├── fossa.yml
│ ├── label-check.yml
│ ├── pr-quota-manager.yml
│ ├── scorecard.yml
│ ├── stale.yml
│ └── waiting-for-author.yml
├── .gitignore
├── .gitmodules
├── .golangci.yml
├── .mockery.header.txt
├── .mockery.yaml
├── ADOPTERS.md
├── AGENTS.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CONTRIBUTING_GUIDELINES.md
├── DCO
├── GOVERNANCE.md
├── LICENSE
├── MAINTAINERS.md
├── Makefile
├── NOTICE
├── README.md
├── RELEASE.md
├── SECURITY-INSIGHTS.yml
├── SECURITY.md
├── THREAT-MODEL.md
├── _To_People_of_Russia.md
├── cmd/
│ ├── anonymizer/
│ │ ├── Dockerfile
│ │ ├── app/
│ │ │ ├── anonymizer/
│ │ │ │ ├── anonymizer.go
│ │ │ │ ├── anonymizer_test.go
│ │ │ │ └── package_test.go
│ │ │ ├── flags.go
│ │ │ ├── flags_test.go
│ │ │ ├── query/
│ │ │ │ ├── package_test.go
│ │ │ │ ├── query.go
│ │ │ │ └── query_test.go
│ │ │ ├── uiconv/
│ │ │ │ ├── extractor.go
│ │ │ │ ├── extractor_test.go
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── trace_empty.json
│ │ │ │ │ ├── trace_invalid_json.json
│ │ │ │ │ ├── trace_scan_error.json
│ │ │ │ │ ├── trace_success.json
│ │ │ │ │ └── trace_wrong_format.json
│ │ │ │ ├── module.go
│ │ │ │ ├── module_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ └── reader_test.go
│ │ │ └── writer/
│ │ │ ├── package_test.go
│ │ │ ├── writer.go
│ │ │ └── writer_test.go
│ │ └── main.go
│ ├── es-index-cleaner/
│ │ ├── .gitignore
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── app/
│ │ │ ├── cutoff_time.go
│ │ │ ├── cutoff_time_test.go
│ │ │ ├── flags.go
│ │ │ ├── flags_test.go
│ │ │ ├── index_filter.go
│ │ │ ├── index_filter_test.go
│ │ │ └── package_test.go
│ │ └── main.go
│ ├── es-rollover/
│ │ ├── Dockerfile
│ │ ├── app/
│ │ │ ├── actions.go
│ │ │ ├── actions_test.go
│ │ │ ├── flags.go
│ │ │ ├── flags_test.go
│ │ │ ├── index_options.go
│ │ │ ├── index_options_test.go
│ │ │ ├── init/
│ │ │ │ ├── action.go
│ │ │ │ ├── action_test.go
│ │ │ │ ├── flags.go
│ │ │ │ ├── flags_test.go
│ │ │ │ └── package_test.go
│ │ │ ├── lookback/
│ │ │ │ ├── action.go
│ │ │ │ ├── action_test.go
│ │ │ │ ├── flags.go
│ │ │ │ ├── flags_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── time_reference.go
│ │ │ │ └── time_reference_test.go
│ │ │ ├── package_test.go
│ │ │ └── rollover/
│ │ │ ├── action.go
│ │ │ ├── action_test.go
│ │ │ ├── flags.go
│ │ │ ├── flags_test.go
│ │ │ └── package_test.go
│ │ └── main.go
│ ├── esmapping-generator/
│ │ └── main.go
│ ├── internal/
│ │ ├── docs/
│ │ │ ├── .gitignore
│ │ │ ├── command.go
│ │ │ └── command_test.go
│ │ ├── featuregate/
│ │ │ ├── command.go
│ │ │ ├── command_test.go
│ │ │ └── package_test.go
│ │ ├── flags/
│ │ │ ├── admin.go
│ │ │ ├── admin_test.go
│ │ │ ├── doc.go
│ │ │ ├── flags.go
│ │ │ ├── flags_test.go
│ │ │ ├── healthhost.go
│ │ │ ├── healthhost_test.go
│ │ │ ├── package_test.go
│ │ │ ├── service.go
│ │ │ └── service_test.go
│ │ ├── printconfig/
│ │ │ ├── command.go
│ │ │ └── command_test.go
│ │ ├── status/
│ │ │ ├── command.go
│ │ │ └── command_test.go
│ │ └── storageconfig/
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── factory.go
│ │ ├── factory_test.go
│ │ └── package_test.go
│ ├── remote-storage/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── app/
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── package_test.go
│ │ │ ├── server.go
│ │ │ └── server_test.go
│ │ ├── config-badger.yaml
│ │ ├── config.yaml
│ │ └── main.go
│ └── tracegen/
│ ├── Dockerfile
│ ├── README.md
│ ├── docker-compose.yml
│ └── main.go
├── doc.go
├── docker-compose/
│ ├── cassandra/
│ │ ├── v4/
│ │ │ └── docker-compose.yaml
│ │ └── v5/
│ │ └── docker-compose.yaml
│ ├── clickhouse/
│ │ └── docker-compose.yml
│ ├── elasticsearch/
│ │ ├── v6/
│ │ │ └── docker-compose.yml
│ │ ├── v7/
│ │ │ └── docker-compose.yml
│ │ ├── v8/
│ │ │ └── docker-compose.yml
│ │ └── v9/
│ │ └── docker-compose.yml
│ ├── kafka/
│ │ ├── README.md
│ │ ├── docker-compose.yml
│ │ ├── jaeger-ingester-remote-storage.yaml
│ │ └── v3/
│ │ └── docker-compose.yml
│ ├── monitor/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── datasource.yml
│ │ ├── docker-compose-elasticsearch.yml
│ │ ├── docker-compose-opensearch.yml
│ │ ├── docker-compose.yml
│ │ ├── jaeger-ui.json
│ │ ├── otel-collector-config-connector.yml
│ │ └── prometheus.yml
│ ├── opensearch/
│ │ ├── v1/
│ │ │ └── docker-compose.yml
│ │ ├── v2/
│ │ │ └── docker-compose.yml
│ │ └── v3/
│ │ └── docker-compose.yml
│ ├── scylladb/
│ │ ├── README.md
│ │ └── docker-compose.yml
│ └── tail-sampling/
│ ├── Makefile
│ ├── README.md
│ ├── docker-compose.yml
│ ├── jaeger-v2-config.yml
│ └── otel-collector-config-connector.yml
├── docs/
│ ├── SCARF.md
│ ├── adr/
│ │ ├── 001-cassandra-find-traces-duration.md
│ │ ├── 002-mcp-server.md
│ │ ├── 003-lazy-storage-factory-initialization.md
│ │ ├── 004-migrating-coverage-gating-to-github-actions.md
│ │ ├── 005-badger-storage-record-layouts.md
│ │ ├── 006-internal-tracing-via-otelcol-telemetry-factory.md
│ │ └── README.md
│ ├── release/
│ │ └── remove-v1-checklist.md
│ └── security/
│ ├── architecture.md
│ ├── assurance-case.md
│ ├── self-assessment.md
│ ├── threat-model.md
│ └── verifying-releases.md
├── empty_test.go
├── examples/
│ ├── grafana-integration/
│ │ ├── README.md
│ │ ├── docker-compose.yaml
│ │ ├── grafana/
│ │ │ ├── dashboard.yml
│ │ │ ├── datasources.yaml
│ │ │ └── hotrod_metrics_logs.json
│ │ └── prometheus/
│ │ └── prometheus.yml
│ ├── hotrod/
│ │ ├── .gitignore
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── cmd/
│ │ │ ├── all.go
│ │ │ ├── customer.go
│ │ │ ├── driver.go
│ │ │ ├── empty_test.go
│ │ │ ├── flags.go
│ │ │ ├── frontend.go
│ │ │ ├── root.go
│ │ │ └── route.go
│ │ ├── docker-compose.yml
│ │ ├── kubernetes/
│ │ │ └── README.md
│ │ ├── main.go
│ │ ├── pkg/
│ │ │ ├── delay/
│ │ │ │ ├── delay.go
│ │ │ │ └── empty_test.go
│ │ │ ├── httperr/
│ │ │ │ ├── empty_test.go
│ │ │ │ └── httperr.go
│ │ │ ├── log/
│ │ │ │ ├── empty_test.go
│ │ │ │ ├── factory.go
│ │ │ │ ├── logger.go
│ │ │ │ └── spanlogger.go
│ │ │ ├── pool/
│ │ │ │ ├── empty_test.go
│ │ │ │ └── pool.go
│ │ │ └── tracing/
│ │ │ ├── baggage.go
│ │ │ ├── empty_test.go
│ │ │ ├── http.go
│ │ │ ├── init.go
│ │ │ ├── mutex.go
│ │ │ ├── mux.go
│ │ │ └── rpcmetrics/
│ │ │ ├── README.md
│ │ │ ├── endpoints.go
│ │ │ ├── endpoints_test.go
│ │ │ ├── metrics.go
│ │ │ ├── metrics_test.go
│ │ │ ├── normalizer.go
│ │ │ ├── normalizer_test.go
│ │ │ ├── observer.go
│ │ │ ├── observer_test.go
│ │ │ └── package_test.go
│ │ └── services/
│ │ ├── config/
│ │ │ ├── config.go
│ │ │ └── empty_test.go
│ │ ├── customer/
│ │ │ ├── client.go
│ │ │ ├── database.go
│ │ │ ├── empty_test.go
│ │ │ ├── interface.go
│ │ │ └── server.go
│ │ ├── driver/
│ │ │ ├── client.go
│ │ │ ├── driver.pb.go
│ │ │ ├── driver.proto
│ │ │ ├── empty_test.go
│ │ │ ├── interface.go
│ │ │ ├── redis.go
│ │ │ └── server.go
│ │ ├── frontend/
│ │ │ ├── best_eta.go
│ │ │ ├── empty_test.go
│ │ │ ├── server.go
│ │ │ └── web_assets/
│ │ │ └── index.html
│ │ └── route/
│ │ ├── client.go
│ │ ├── empty_test.go
│ │ ├── interface.go
│ │ ├── server.go
│ │ └── stats.go
│ ├── oci/
│ │ ├── README.md
│ │ ├── config.yaml
│ │ ├── deploy-all.sh
│ │ ├── ingress.yaml
│ │ ├── jaeger-values.yaml
│ │ ├── load-generator/
│ │ │ ├── generate_traces.py
│ │ │ └── load-generator.yaml
│ │ ├── monitoring-values.yaml
│ │ ├── prometheus-svc.yaml
│ │ ├── tls-cert/
│ │ │ └── issuer.yaml
│ │ └── ui-config.json
│ ├── opentracing-tutorial/
│ │ └── README.md
│ ├── otel-demo/
│ │ ├── README.md
│ │ ├── cleanup.sh
│ │ ├── deploy-all.sh
│ │ ├── generate_traces.py
│ │ ├── ingress/
│ │ │ ├── README.md
│ │ │ ├── clusterissuer-letsencrypt-prod.yaml
│ │ │ ├── ingress-jaeger.yaml
│ │ │ ├── ingress-opensearch.yaml
│ │ │ └── ingress-otel-demo.yaml
│ │ ├── jaeger-config.yaml
│ │ ├── jaeger-query-service.yaml
│ │ ├── jaeger-values.yaml
│ │ ├── load-generator.yaml
│ │ ├── opensearch-dashboard-values.yaml
│ │ ├── opensearch-values.yaml
│ │ ├── otel-demo-values.yaml
│ │ └── start-port-forward.sh
│ ├── reverse-proxy/
│ │ ├── README.md
│ │ ├── docker-compose.yml
│ │ └── httpd.conf
│ └── service-performance-monitoring/
│ └── README.md
├── go.mod
├── go.sum
├── internal/
│ ├── auth/
│ │ ├── apikey/
│ │ │ ├── apikey-context.go
│ │ │ ├── apikey-context_test.go
│ │ │ └── package_test.go
│ │ ├── bearertoken/
│ │ │ ├── context.go
│ │ │ ├── context_test.go
│ │ │ ├── grpc.go
│ │ │ ├── grpc_test.go
│ │ │ ├── http.go
│ │ │ ├── http_test.go
│ │ │ └── package_test.go
│ │ ├── package_test.go
│ │ ├── tokenloader.go
│ │ ├── tokenloader_test.go
│ │ ├── transport.go
│ │ └── transport_test.go
│ ├── cache/
│ │ ├── cache.go
│ │ ├── lru.go
│ │ └── lru_test.go
│ ├── config/
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── package_test.go
│ │ ├── promcfg/
│ │ │ ├── config.go
│ │ │ └── config_test.go
│ │ ├── string_slice.go
│ │ ├── string_slice_test.go
│ │ └── tlscfg/
│ │ ├── flags.go
│ │ ├── flags_test.go
│ │ ├── options.go
│ │ ├── options_test.go
│ │ ├── package_test.go
│ │ └── testdata/
│ │ ├── README.md
│ │ ├── bad-CA-cert.txt
│ │ ├── example-CA-cert.pem
│ │ ├── example-client-cert.pem
│ │ ├── example-client-key.pem
│ │ ├── example-server-cert.pem
│ │ ├── example-server-key.pem
│ │ ├── gen-certs.sh
│ │ └── wrong-CA-cert.pem
│ ├── converter/
│ │ ├── doc.go
│ │ ├── empty_test.go
│ │ └── thrift/
│ │ ├── doc.go
│ │ ├── empty_test.go
│ │ └── jaeger/
│ │ ├── doc.go
│ │ ├── fixtures/
│ │ │ ├── domain_01.json
│ │ │ ├── domain_02.json
│ │ │ ├── domain_03.json
│ │ │ ├── thrift_batch_01.json
│ │ │ └── thrift_batch_02.json
│ │ ├── package_test.go
│ │ ├── sampling_from_domain.go
│ │ ├── sampling_from_domain_test.go
│ │ ├── sampling_to_domain.go
│ │ ├── sampling_to_domain_test.go
│ │ ├── to_domain.go
│ │ └── to_domain_test.go
│ ├── distributedlock/
│ │ ├── empty_test.go
│ │ ├── interface.go
│ │ └── mocks/
│ │ └── mocks.go
│ ├── fswatcher/
│ │ ├── fswatcher.go
│ │ └── fswatcher_test.go
│ ├── gogocodec/
│ │ ├── codec.go
│ │ └── codec_test.go
│ ├── grpctest/
│ │ ├── reflection.go
│ │ └── reflection_test.go
│ ├── gzipfs/
│ │ ├── gzip.go
│ │ ├── gzip_test.go
│ │ └── testdata/
│ │ └── foobar
│ ├── hostname/
│ │ ├── hostname.go
│ │ └── hostname_test.go
│ ├── httpfs/
│ │ ├── prefixed.go
│ │ ├── prefixed_test.go
│ │ └── test_assets/
│ │ └── somefile.txt
│ ├── jaegerclientenv2otel/
│ │ ├── envvars.go
│ │ └── envvars_test.go
│ ├── jiter/
│ │ ├── iter.go
│ │ ├── iter_test.go
│ │ └── package_test.go
│ ├── jptrace/
│ │ ├── aggregator.go
│ │ ├── aggregator_test.go
│ │ ├── attributes.go
│ │ ├── attributes_test.go
│ │ ├── package_test.go
│ │ ├── sanitizer/
│ │ │ ├── emptyservicename.go
│ │ │ ├── emptyservicename_test.go
│ │ │ ├── emptyspanname.go
│ │ │ ├── emptyspanname_test.go
│ │ │ ├── negative_duration_santizer.go
│ │ │ ├── negative_duration_santizer_test.go
│ │ │ ├── package_test.go
│ │ │ ├── readonly_test.go
│ │ │ ├── sanitizer.go
│ │ │ ├── sanitizer_test.go
│ │ │ ├── utf8.go
│ │ │ └── utf8_test.go
│ │ ├── spaniter.go
│ │ ├── spaniter_test.go
│ │ ├── spankind.go
│ │ ├── spankind_test.go
│ │ ├── spanmap.go
│ │ ├── spanmap_test.go
│ │ ├── statuscode.go
│ │ ├── statuscode_test.go
│ │ ├── traces.go
│ │ ├── traces_test.go
│ │ ├── valuetype.go
│ │ ├── valuetype_test.go
│ │ ├── warning.go
│ │ └── warning_test.go
│ ├── jtracer/
│ │ ├── jtracer.go
│ │ └── jtracer_test.go
│ ├── leaderelection/
│ │ ├── leader_election.go
│ │ ├── leader_election_test.go
│ │ └── mocks/
│ │ └── mocks.go
│ ├── metrics/
│ │ ├── benchmark/
│ │ │ └── benchmark_test.go
│ │ ├── counter.go
│ │ ├── factory.go
│ │ ├── gauge.go
│ │ ├── histogram.go
│ │ ├── metrics.go
│ │ ├── metrics_test.go
│ │ ├── metricsbuilder/
│ │ │ ├── builder.go
│ │ │ └── builder_test.go
│ │ ├── otelmetrics/
│ │ │ ├── counter.go
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── gauge.go
│ │ │ ├── histogram.go
│ │ │ └── timer.go
│ │ ├── package.go
│ │ ├── prometheus/
│ │ │ ├── cache.go
│ │ │ ├── factory.go
│ │ │ └── factory_test.go
│ │ ├── stopwatch.go
│ │ └── timer.go
│ ├── metricstest/
│ │ ├── keys.go
│ │ ├── local.go
│ │ ├── local_test.go
│ │ ├── metricstest.go
│ │ ├── metricstest_test.go
│ │ └── package_test.go
│ ├── proto/
│ │ ├── api_v3/
│ │ │ └── query_service.pb.go
│ │ └── metrics/
│ │ ├── README.md
│ │ ├── openmetrics.proto
│ │ └── otelspankind.proto
│ ├── proto-gen/
│ │ ├── .gitignore
│ │ ├── api_v2/
│ │ │ └── metrics/
│ │ │ ├── openmetrics.pb.go
│ │ │ └── otelspankind.pb.go
│ │ ├── patch.sed
│ │ ├── storage/
│ │ │ └── v2/
│ │ │ ├── dependency_storage.pb.go
│ │ │ └── trace_storage.pb.go
│ │ ├── storage_v1/
│ │ │ ├── mocks/
│ │ │ │ └── mocks.go
│ │ │ └── storage.pb.go
│ │ └── zipkin/
│ │ └── zipkin.pb.go
│ ├── recoveryhandler/
│ │ ├── zap.go
│ │ └── zap_test.go
│ ├── safeexpvar/
│ │ ├── safeexpvar.go
│ │ └── safeexpvar_test.go
│ ├── sampling/
│ │ ├── grpc/
│ │ │ ├── grpc_handler.go
│ │ │ └── grpc_handler_test.go
│ │ ├── http/
│ │ │ ├── cfgmgr.go
│ │ │ ├── cfgmgr_test.go
│ │ │ ├── handler.go
│ │ │ ├── handler_test.go
│ │ │ └── package_test.go
│ │ └── samplingstrategy/
│ │ ├── adaptive/
│ │ │ ├── README.md
│ │ │ ├── aggregator.go
│ │ │ ├── aggregator_test.go
│ │ │ ├── cache.go
│ │ │ ├── cache_test.go
│ │ │ ├── calculationstrategy/
│ │ │ │ ├── interface.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── percentage_increase_capped_calculator.go
│ │ │ │ └── percentage_increase_capped_calculator_test.go
│ │ │ ├── floatutils.go
│ │ │ ├── floatutils_test.go
│ │ │ ├── options.go
│ │ │ ├── options_test.go
│ │ │ ├── package_test.go
│ │ │ ├── post_aggregator.go
│ │ │ ├── post_aggregator_test.go
│ │ │ ├── provider.go
│ │ │ ├── provider_test.go
│ │ │ ├── weightvectorcache.go
│ │ │ └── weightvectorcache_test.go
│ │ ├── aggregator.go
│ │ ├── empty_test.go
│ │ ├── factory.go
│ │ ├── file/
│ │ │ ├── constants.go
│ │ │ ├── fixtures/
│ │ │ │ ├── TestServiceNoPerOperationStrategiesDeprecatedBehavior_ServiceA.json
│ │ │ │ ├── TestServiceNoPerOperationStrategiesDeprecatedBehavior_ServiceB.json
│ │ │ │ ├── TestServiceNoPerOperationStrategies_ServiceA.json
│ │ │ │ ├── TestServiceNoPerOperationStrategies_ServiceB.json
│ │ │ │ ├── bad_strategies.json
│ │ │ │ ├── missing-service-types.json
│ │ │ │ ├── operation_strategies.json
│ │ │ │ ├── service_no_per_operation.json
│ │ │ │ └── strategies.json
│ │ │ ├── options.go
│ │ │ ├── package_test.go
│ │ │ ├── provider.go
│ │ │ ├── provider_test.go
│ │ │ └── strategy.go
│ │ └── provider.go
│ ├── storage/
│ │ ├── cassandra/
│ │ │ ├── config/
│ │ │ │ ├── config.go
│ │ │ │ ├── config_test.go
│ │ │ │ └── package_test.go
│ │ │ ├── empty_test.go
│ │ │ ├── gocql/
│ │ │ │ ├── empty_test.go
│ │ │ │ ├── gocql.go
│ │ │ │ └── testutils/
│ │ │ │ ├── udt.go
│ │ │ │ └── udt_test.go
│ │ │ ├── metrics/
│ │ │ │ ├── table.go
│ │ │ │ └── table_test.go
│ │ │ ├── mocks/
│ │ │ │ └── mocks.go
│ │ │ └── session.go
│ │ ├── distributedlock/
│ │ │ └── cassandra/
│ │ │ ├── lock.go
│ │ │ └── lock_test.go
│ │ ├── elasticsearch/
│ │ │ ├── client/
│ │ │ │ ├── basic_auth.go
│ │ │ │ ├── basic_auth_test.go
│ │ │ │ ├── client.go
│ │ │ │ ├── cluster_client.go
│ │ │ │ ├── cluster_client_test.go
│ │ │ │ ├── ilm_client.go
│ │ │ │ ├── ilm_client_test.go
│ │ │ │ ├── index_client.go
│ │ │ │ ├── index_client_test.go
│ │ │ │ ├── interfaces.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ └── package_test.go
│ │ │ ├── client.go
│ │ │ ├── config/
│ │ │ │ ├── auth_helper.go
│ │ │ │ ├── auth_helper_test.go
│ │ │ │ ├── config.go
│ │ │ │ └── config_test.go
│ │ │ ├── dbmodel/
│ │ │ │ ├── dot_replacer.go
│ │ │ │ ├── dot_replacer_test.go
│ │ │ │ ├── model.go
│ │ │ │ └── package_test.go
│ │ │ ├── empty_test.go
│ │ │ ├── errors.go
│ │ │ ├── errors_test.go
│ │ │ ├── filter/
│ │ │ │ ├── alias.go
│ │ │ │ ├── alias_test.go
│ │ │ │ ├── date.go
│ │ │ │ ├── date_test.go
│ │ │ │ └── package_test.go
│ │ │ ├── mocks/
│ │ │ │ └── mocks.go
│ │ │ ├── query/
│ │ │ │ ├── range_query.go
│ │ │ │ └── range_query_test.go
│ │ │ ├── textTemplate.go
│ │ │ ├── textTemplate_test.go
│ │ │ └── wrapper/
│ │ │ ├── empty_test.go
│ │ │ ├── wrapper.go
│ │ │ └── wrapper_nolint.go
│ │ ├── integration/
│ │ │ ├── badgerstore_test.go
│ │ │ ├── cassandra_test.go
│ │ │ ├── dates.go
│ │ │ ├── dates_test.go
│ │ │ ├── elasticsearch_test.go
│ │ │ ├── es_index_cleaner_test.go
│ │ │ ├── es_index_rollover_test.go
│ │ │ ├── fixtures/
│ │ │ │ ├── grpc_plugin_conf.yaml
│ │ │ │ ├── queries.json
│ │ │ │ ├── queries_es.json
│ │ │ │ └── traces/
│ │ │ │ ├── default.json
│ │ │ │ ├── dur_trace.json
│ │ │ │ ├── example_trace.json
│ │ │ │ ├── log_tags_trace.json
│ │ │ │ ├── max_dur_trace.json
│ │ │ │ ├── multi_index_trace.json
│ │ │ │ ├── multi_spot_tags_trace.json
│ │ │ │ ├── multiple1_trace.json
│ │ │ │ ├── multiple2_trace.json
│ │ │ │ ├── multiple3_trace.json
│ │ │ │ ├── multispottag_dur_trace.json
│ │ │ │ ├── multispottag_maxdur_trace.json
│ │ │ │ ├── multispottag_opname_dur_trace.json
│ │ │ │ ├── multispottag_opname_maxdur_trace.json
│ │ │ │ ├── multispottag_opname_trace.json
│ │ │ │ ├── opname_dur_trace.json
│ │ │ │ ├── opname_maxdur_trace.json
│ │ │ │ ├── opname_trace.json
│ │ │ │ ├── process_tags_trace.json
│ │ │ │ ├── scope_name_version_trace.json
│ │ │ │ ├── span_tags_trace.json
│ │ │ │ ├── tags_dur_trace.json
│ │ │ │ ├── tags_escaped_operator_trace_1.json
│ │ │ │ ├── tags_escaped_operator_trace_2.json
│ │ │ │ ├── tags_maxdur_trace.json
│ │ │ │ ├── tags_opname_dur_trace.json
│ │ │ │ ├── tags_opname_maxdur_trace.json
│ │ │ │ ├── tags_opname_trace.json
│ │ │ │ ├── tags_wildcard_regex_1.json
│ │ │ │ └── tags_wildcard_regex_2.json
│ │ │ ├── grpc_test.go
│ │ │ ├── integration.go
│ │ │ ├── memstore_test.go
│ │ │ ├── package_test.go
│ │ │ ├── remote_memory_storage.go
│ │ │ ├── trace_compare.go
│ │ │ └── trace_compare_test.go
│ │ ├── metricstore/
│ │ │ ├── disabled/
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ └── reader_test.go
│ │ │ ├── elasticsearch/
│ │ │ │ ├── README.md
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── processor.go
│ │ │ │ ├── processor_test.go
│ │ │ │ ├── query_builder.go
│ │ │ │ ├── query_builder_test.go
│ │ │ │ ├── query_logger.go
│ │ │ │ ├── query_logger_test.go
│ │ │ │ ├── reader.go
│ │ │ │ ├── reader_test.go
│ │ │ │ ├── testdata/
│ │ │ │ │ ├── output_call_rate.json
│ │ │ │ │ ├── output_call_rate_operation.json
│ │ │ │ │ ├── output_empty.json
│ │ │ │ │ ├── output_error_es.json
│ │ │ │ │ ├── output_error_latencies.json
│ │ │ │ │ ├── output_errors_rate.json
│ │ │ │ │ ├── output_errors_rate_operation.json
│ │ │ │ │ ├── output_latencies.json
│ │ │ │ │ ├── output_latencies_50.json
│ │ │ │ │ ├── output_latencies_75.json
│ │ │ │ │ ├── output_latencies_95.json
│ │ │ │ │ ├── output_latencies_operation.json
│ │ │ │ │ └── output_valid_es.json
│ │ │ │ ├── to_domain.go
│ │ │ │ └── to_domain_test.go
│ │ │ ├── factory.go
│ │ │ ├── factory_config.go
│ │ │ ├── factory_config_test.go
│ │ │ ├── factory_test.go
│ │ │ ├── package_test.go
│ │ │ └── prometheus/
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── metricstore/
│ │ │ │ ├── dbmodel/
│ │ │ │ │ ├── to_domain.go
│ │ │ │ │ └── to_domain_test.go
│ │ │ │ ├── reader.go
│ │ │ │ ├── reader_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── empty_response.json
│ │ │ │ ├── service_datapoint_response.json
│ │ │ │ ├── service_span_name_datapoint_response.json
│ │ │ │ └── warning_response.json
│ │ │ ├── options.go
│ │ │ └── options_test.go
│ │ ├── v1/
│ │ │ ├── api/
│ │ │ │ ├── README.md
│ │ │ │ ├── dependencystore/
│ │ │ │ │ ├── empty_test.go
│ │ │ │ │ ├── interface.go
│ │ │ │ │ └── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── empty_test.go
│ │ │ │ ├── metricstore/
│ │ │ │ │ ├── empty_test.go
│ │ │ │ │ ├── interface.go
│ │ │ │ │ ├── metricstoremetrics/
│ │ │ │ │ │ ├── decorator.go
│ │ │ │ │ │ └── decorator_test.go
│ │ │ │ │ └── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── samplingstore/
│ │ │ │ │ ├── empty_test.go
│ │ │ │ │ ├── interface.go
│ │ │ │ │ ├── mocks/
│ │ │ │ │ │ └── mocks.go
│ │ │ │ │ └── model/
│ │ │ │ │ ├── empty_test.go
│ │ │ │ │ └── sampling.go
│ │ │ │ └── spanstore/
│ │ │ │ ├── interface.go
│ │ │ │ ├── interface_test.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ └── spanstoremetrics/
│ │ │ │ ├── package_test.go
│ │ │ │ ├── read_metrics.go
│ │ │ │ ├── read_metrics_test.go
│ │ │ │ ├── write_metrics.go
│ │ │ │ └── write_metrics_test.go
│ │ │ ├── badger/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.go
│ │ │ │ ├── config_test.go
│ │ │ │ ├── dependencystore/
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── storage.go
│ │ │ │ │ ├── storage_internal_test.go
│ │ │ │ │ └── storage_test.go
│ │ │ │ ├── docs/
│ │ │ │ │ ├── storage-file-non-root-permission.md
│ │ │ │ │ └── upgrade-v1-to-v3.md
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ ├── lock.go
│ │ │ │ ├── lock_test.go
│ │ │ │ ├── options.go
│ │ │ │ ├── options_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── samplingstore/
│ │ │ │ │ ├── storage.go
│ │ │ │ │ └── storage_test.go
│ │ │ │ ├── spanstore/
│ │ │ │ │ ├── cache.go
│ │ │ │ │ ├── cache_test.go
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── read_write_test.go
│ │ │ │ │ ├── reader.go
│ │ │ │ │ ├── rw_internal_test.go
│ │ │ │ │ └── writer.go
│ │ │ │ ├── stats.go
│ │ │ │ ├── stats_linux.go
│ │ │ │ ├── stats_linux_test.go
│ │ │ │ └── stats_test.go
│ │ │ ├── blackhole/
│ │ │ │ ├── blackhole.go
│ │ │ │ ├── blackhole_test.go
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ └── package_test.go
│ │ │ ├── cassandra/
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── dependencystore/
│ │ │ │ │ ├── bootstrap.go
│ │ │ │ │ ├── bootstrap_test.go
│ │ │ │ │ ├── model.go
│ │ │ │ │ ├── model_test.go
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── storage.go
│ │ │ │ │ └── storage_test.go
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ ├── helper.go
│ │ │ │ ├── options.go
│ │ │ │ ├── options_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── samplingstore/
│ │ │ │ │ ├── storage.go
│ │ │ │ │ └── storage_test.go
│ │ │ │ ├── savetracetest/
│ │ │ │ │ └── main.go
│ │ │ │ ├── schema/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── create.sh
│ │ │ │ │ ├── create.test.sh
│ │ │ │ │ ├── docker.sh
│ │ │ │ │ ├── migration/
│ │ │ │ │ │ ├── V002toV003.sh
│ │ │ │ │ │ ├── v001tov002part1.sh
│ │ │ │ │ │ └── v001tov002part2.sh
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── schema.go
│ │ │ │ │ ├── schema_test.go
│ │ │ │ │ ├── v001.cql.tmpl
│ │ │ │ │ ├── v002.cql.tmpl
│ │ │ │ │ ├── v003.cql.tmpl
│ │ │ │ │ ├── v004-go-tmpl.cql.tmpl
│ │ │ │ │ └── v004.cql.tmpl
│ │ │ │ └── spanstore/
│ │ │ │ ├── dbmodel/
│ │ │ │ │ ├── converter.go
│ │ │ │ │ ├── converter_test.go
│ │ │ │ │ ├── cql_udt.go
│ │ │ │ │ ├── cql_udt_test.go
│ │ │ │ │ ├── ids.go
│ │ │ │ │ ├── ids_test.go
│ │ │ │ │ ├── index_filter.go
│ │ │ │ │ ├── index_filter_test.go
│ │ │ │ │ ├── model.go
│ │ │ │ │ ├── model_test.go
│ │ │ │ │ ├── operation.go
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── tag_filter.go
│ │ │ │ │ ├── tag_filter_drop_all.go
│ │ │ │ │ ├── tag_filter_drop_all_test.go
│ │ │ │ │ ├── tag_filter_exact_match.go
│ │ │ │ │ ├── tag_filter_exact_match_test.go
│ │ │ │ │ ├── tag_filter_test.go
│ │ │ │ │ ├── unique_ids.go
│ │ │ │ │ ├── unique_ids_test.go
│ │ │ │ │ ├── unique_tags.go
│ │ │ │ │ └── unique_tags_test.go
│ │ │ │ ├── matchers_test.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── operation_names.go
│ │ │ │ ├── operation_names_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ ├── reader_test.go
│ │ │ │ ├── service_names.go
│ │ │ │ ├── service_names_test.go
│ │ │ │ ├── writer.go
│ │ │ │ ├── writer_options.go
│ │ │ │ ├── writer_options_test.go
│ │ │ │ └── writer_test.go
│ │ │ ├── configurable.go
│ │ │ ├── elasticsearch/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── README.md
│ │ │ │ ├── dependencystore/
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── storagev1.go
│ │ │ │ │ └── storagev1_test.go
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── tags_01.txt
│ │ │ │ │ └── tags_02.txt
│ │ │ │ ├── mappings/
│ │ │ │ │ ├── command.go
│ │ │ │ │ ├── command_test.go
│ │ │ │ │ ├── fixtures/
│ │ │ │ │ │ ├── jaeger-dependencies-6.json
│ │ │ │ │ │ ├── jaeger-dependencies-7.json
│ │ │ │ │ │ ├── jaeger-dependencies-8.json
│ │ │ │ │ │ ├── jaeger-sampling-6.json
│ │ │ │ │ │ ├── jaeger-sampling-7.json
│ │ │ │ │ │ ├── jaeger-sampling-8.json
│ │ │ │ │ │ ├── jaeger-service-6.json
│ │ │ │ │ │ ├── jaeger-service-7.json
│ │ │ │ │ │ ├── jaeger-service-8.json
│ │ │ │ │ │ ├── jaeger-span-6.json
│ │ │ │ │ │ ├── jaeger-span-7.json
│ │ │ │ │ │ └── jaeger-span-8.json
│ │ │ │ │ ├── flags.go
│ │ │ │ │ ├── flags_test.go
│ │ │ │ │ ├── jaeger-dependencies-6.json
│ │ │ │ │ ├── jaeger-dependencies-7.json
│ │ │ │ │ ├── jaeger-dependencies-8.json
│ │ │ │ │ ├── jaeger-sampling-6.json
│ │ │ │ │ ├── jaeger-sampling-7.json
│ │ │ │ │ ├── jaeger-sampling-8.json
│ │ │ │ │ ├── jaeger-service-6.json
│ │ │ │ │ ├── jaeger-service-7.json
│ │ │ │ │ ├── jaeger-service-8.json
│ │ │ │ │ ├── jaeger-span-6.json
│ │ │ │ │ ├── jaeger-span-7.json
│ │ │ │ │ ├── jaeger-span-8.json
│ │ │ │ │ ├── mapping.go
│ │ │ │ │ └── mapping_test.go
│ │ │ │ ├── options.go
│ │ │ │ ├── options_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── samplingstore/
│ │ │ │ │ ├── dbmodel/
│ │ │ │ │ │ ├── converter.go
│ │ │ │ │ │ ├── converter_test.go
│ │ │ │ │ │ └── model.go
│ │ │ │ │ ├── storage.go
│ │ │ │ │ └── storage_test.go
│ │ │ │ └── spanstore/
│ │ │ │ ├── core_span_reader.go
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── domain_01.json
│ │ │ │ │ ├── es_01.json
│ │ │ │ │ ├── query_01.json
│ │ │ │ │ ├── query_02.json
│ │ │ │ │ └── query_03.json
│ │ │ │ ├── from_domain.go
│ │ │ │ ├── from_domain_test.go
│ │ │ │ ├── index_utils.go
│ │ │ │ ├── json_span_compare_test.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ ├── reader_test.go
│ │ │ │ ├── readerv1.go
│ │ │ │ ├── readerv1_test.go
│ │ │ │ ├── service_operation.go
│ │ │ │ ├── service_operation_test.go
│ │ │ │ ├── to_domain.go
│ │ │ │ ├── to_domain_test.go
│ │ │ │ ├── writer.go
│ │ │ │ ├── writer_test.go
│ │ │ │ ├── writerv1.go
│ │ │ │ └── writerv1_test.go
│ │ │ ├── factory.go
│ │ │ ├── mocks/
│ │ │ │ └── mocks.go
│ │ │ └── package_test.go
│ │ └── v2/
│ │ ├── api/
│ │ │ ├── depstore/
│ │ │ │ ├── factory.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ └── writer.go
│ │ │ ├── package_test.go
│ │ │ └── tracestore/
│ │ │ ├── empty_test.go
│ │ │ ├── factory.go
│ │ │ ├── mocks/
│ │ │ │ └── mocks.go
│ │ │ ├── reader.go
│ │ │ ├── reader_test.go
│ │ │ ├── tracestoremetrics/
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader_metrics.go
│ │ │ │ └── reader_metrics_test.go
│ │ │ └── writer.go
│ │ ├── badger/
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ └── package_test.go
│ │ ├── cassandra/
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── package_test.go
│ │ │ └── tracestore/
│ │ │ ├── fixtures/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── cas_01.json
│ │ │ │ └── otel_traces_01.json
│ │ │ ├── from_dbmodel.go
│ │ │ ├── from_dbmodel_test.go
│ │ │ ├── package_test.go
│ │ │ ├── reader.go
│ │ │ ├── reader_test.go
│ │ │ ├── to_dbmodel.go
│ │ │ └── to_dbmodel_test.go
│ │ ├── clickhouse/
│ │ │ ├── README.md
│ │ │ ├── clickhousetest/
│ │ │ │ ├── package_test.go
│ │ │ │ └── server.go
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── depstore/
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ └── reader_test.go
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── package_test.go
│ │ │ ├── sql/
│ │ │ │ ├── create_attribute_metadata_mv.sql
│ │ │ │ ├── create_attribute_metadata_table.sql
│ │ │ │ ├── create_event_attribute_metadata_mv.sql
│ │ │ │ ├── create_link_attribute_metadata_mv.sql
│ │ │ │ ├── create_operations_mv.sql
│ │ │ │ ├── create_operations_table.sql
│ │ │ │ ├── create_services_mv.sql
│ │ │ │ ├── create_services_table.sql
│ │ │ │ ├── create_spans_table.sql
│ │ │ │ ├── create_trace_id_timestamps_mv.sql
│ │ │ │ ├── create_trace_id_timestamps_table.sql
│ │ │ │ ├── package_test.go
│ │ │ │ └── queries.go
│ │ │ └── tracestore/
│ │ │ ├── assert_test.go
│ │ │ ├── attribute_metadata.go
│ │ │ ├── attribute_metadata_test.go
│ │ │ ├── dbmodel/
│ │ │ │ ├── attribute_metadata.go
│ │ │ │ ├── dbmodel_test.go
│ │ │ │ ├── from.go
│ │ │ │ ├── from_test.go
│ │ │ │ ├── operation.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── service.go
│ │ │ │ ├── spanrow.go
│ │ │ │ ├── to.go
│ │ │ │ └── to_test.go
│ │ │ ├── driver_test.go
│ │ │ ├── package_test.go
│ │ │ ├── query_builder.go
│ │ │ ├── query_builder_test.go
│ │ │ ├── reader.go
│ │ │ ├── reader_test.go
│ │ │ ├── snapshots/
│ │ │ │ ├── TestFindTraceIDs_1.sql
│ │ │ │ ├── TestFindTraceIDs_2.sql
│ │ │ │ ├── TestFindTraces_Success/
│ │ │ │ │ ├── multiple_spans_1.sql
│ │ │ │ │ └── single_span_1.sql
│ │ │ │ ├── TestFindTraces_WithFilters_1.sql
│ │ │ │ ├── TestFindTraces_WithFilters_2.sql
│ │ │ │ ├── TestGetOperations/
│ │ │ │ │ ├── successfully_returns_operations_by_kind_1.sql
│ │ │ │ │ └── successfully_returns_operations_for_all_kinds_1.sql
│ │ │ │ ├── TestGetServices/
│ │ │ │ │ └── successfully_returns_services_1.sql
│ │ │ │ ├── TestGetTraces_Success/
│ │ │ │ │ ├── multiple_spans_1.sql
│ │ │ │ │ ├── single_span_1.sql
│ │ │ │ │ └── with_time_range_1.sql
│ │ │ │ └── TestWriter_Success_1.sql
│ │ │ ├── spans_test.go
│ │ │ ├── writer.go
│ │ │ └── writer_test.go
│ │ ├── elasticsearch/
│ │ │ ├── depstore/
│ │ │ │ ├── dbmodel/
│ │ │ │ │ ├── converter.go
│ │ │ │ │ ├── converter_test.go
│ │ │ │ │ └── model.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── storage.go
│ │ │ │ ├── storage_test.go
│ │ │ │ ├── storagev2.go
│ │ │ │ └── storagev2_test.go
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── package_test.go
│ │ │ └── tracestore/
│ │ │ ├── fixtures/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── es_01.json
│ │ │ │ ├── es_01_string_tags.json
│ │ │ │ └── otel_traces_01.json
│ │ │ ├── from_dbmodel.go
│ │ │ ├── from_dbmodel_test.go
│ │ │ ├── ids.go
│ │ │ ├── package_test.go
│ │ │ ├── reader.go
│ │ │ ├── reader_test.go
│ │ │ ├── to_dbmodel.go
│ │ │ ├── to_dbmodel_test.go
│ │ │ ├── writer.go
│ │ │ └── writer_test.go
│ │ ├── grpc/
│ │ │ ├── README.md
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── depreader.go
│ │ │ ├── depreader_test.go
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── handler.go
│ │ │ ├── handler_test.go
│ │ │ ├── package_test.go
│ │ │ ├── tracereader.go
│ │ │ ├── tracereader_test.go
│ │ │ ├── tracewriter.go
│ │ │ └── tracewriter_test.go
│ │ ├── memory/
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── fixtures/
│ │ │ │ ├── db_traces_01.json
│ │ │ │ ├── db_traces_02.json
│ │ │ │ └── otel_traces_01.json
│ │ │ ├── lock.go
│ │ │ ├── lock_test.go
│ │ │ ├── memory.go
│ │ │ ├── memory_test.go
│ │ │ ├── package_test.go
│ │ │ ├── sampling.go
│ │ │ ├── sampling_test.go
│ │ │ └── tenant.go
│ │ └── v1adapter/
│ │ ├── README.md
│ │ ├── depreader.go
│ │ ├── depreader_test.go
│ │ ├── factory.go
│ │ ├── factory_test.go
│ │ ├── otelids.go
│ │ ├── otelids_test.go
│ │ ├── package_test.go
│ │ ├── spanreader.go
│ │ ├── spanreader_test.go
│ │ ├── spanwriter.go
│ │ ├── spanwriter_test.go
│ │ ├── tracereader.go
│ │ ├── tracereader_test.go
│ │ ├── tracewriter.go
│ │ ├── tracewriter_test.go
│ │ ├── translator.go
│ │ └── translator_test.go
│ ├── telemetry/
│ │ ├── otelsemconv/
│ │ │ ├── empty_test.go
│ │ │ ├── semconv.go
│ │ │ └── semconv_test.go
│ │ ├── settings.go
│ │ └── settings_test.go
│ ├── tenancy/
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── flags.go
│ │ ├── flags_test.go
│ │ ├── grpc.go
│ │ ├── grpc_test.go
│ │ ├── http.go
│ │ ├── http_test.go
│ │ ├── manage_test.go
│ │ ├── manager.go
│ │ └── package_test.go
│ ├── testutils/
│ │ ├── leakcheck.go
│ │ ├── leakcheck_test.go
│ │ ├── logger.go
│ │ └── logger_test.go
│ ├── tools/
│ │ ├── empty.go
│ │ ├── go.mod
│ │ ├── go.sum
│ │ └── tools.go
│ ├── tracegen/
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── package_test.go
│ │ ├── worker.go
│ │ └── worker_test.go
│ ├── uimodel/
│ │ ├── converter/
│ │ │ └── v1/
│ │ │ └── json/
│ │ │ ├── doc.go
│ │ │ ├── fixtures/
│ │ │ │ ├── domain_01.json
│ │ │ │ ├── domain_es_01.json
│ │ │ │ ├── es_01.json
│ │ │ │ └── ui_01.json
│ │ │ ├── from_domain.go
│ │ │ ├── from_domain_test.go
│ │ │ ├── json_span_compare_test.go
│ │ │ ├── package_test.go
│ │ │ ├── process_hashtable.go
│ │ │ ├── process_hashtable_test.go
│ │ │ ├── sampling.go
│ │ │ └── sampling_test.go
│ │ ├── doc.go
│ │ ├── empty_test.go
│ │ └── model.go
│ └── version/
│ ├── build.go
│ ├── build_test.go
│ ├── command.go
│ ├── command_test.go
│ ├── handler.go
│ ├── handler_test.go
│ └── package_test.go
├── monitoring/
│ └── jaeger-mixin/
│ ├── README.md
│ ├── alerts.libsonnet
│ ├── dashboard-for-grafana.json
│ ├── dashboards.libsonnet
│ ├── jsonnetfile.json
│ ├── mixin.libsonnet
│ ├── monitoring-setup.example.jsonnet
│ ├── prometheus_alerts.yml
│ └── prometheus_alerts_v2.yml
├── ports/
│ ├── ports.go
│ └── ports_test.go
├── renovate.json
└── scripts/
├── build/
│ ├── build-all-in-one-image.sh
│ ├── build-hotrod-image.sh
│ ├── build-upload-a-docker-image.sh
│ ├── build-upload-docker-images.sh
│ ├── clean-binaries.sh
│ ├── docker/
│ │ ├── base/
│ │ │ └── Dockerfile
│ │ └── debug/
│ │ ├── Dockerfile
│ │ ├── go.mod
│ │ ├── go.sum
│ │ └── tools.go
│ ├── package-deploy.sh
│ ├── rebuild-ui.sh
│ └── upload-docker-readme.sh
├── e2e/
│ ├── adaptive-sampling-integration-test.sh
│ ├── cassandra.sh
│ ├── clickhouse.sh
│ ├── compare_metrics.py
│ ├── elasticsearch.sh
│ ├── filter_coverage.py
│ ├── kafka.sh
│ ├── metrics_summary.py
│ ├── metrics_summary.sh
│ └── spm.sh
├── lint/
│ ├── check-go-version.sh
│ ├── check-goleak-files.sh
│ ├── check-jaeger-idl-version.sh
│ ├── check-semconv-version.sh
│ ├── check-test-files.sh
│ ├── dco_check.py
│ ├── import-order-cleanup.py
│ ├── replace_license_headers.py
│ ├── update-semconv-version.sh
│ └── updateLicense.py
├── makefiles/
│ ├── BuildBinaries.mk
│ ├── BuildInfo.mk
│ ├── Docker.mk
│ ├── IntegrationTests.mk
│ ├── Protobuf.mk
│ ├── Tools.mk
│ └── Windows.mk
├── release/
│ ├── draft.py
│ ├── formatter.py
│ ├── notes.py
│ ├── prepare.sh
│ ├── rotate-managers.py
│ ├── start.sh
│ └── update-changelog.py
└── utils/
├── compare_metrics.py
├── compute-tags.sh
├── compute-tags.test.sh
├── compute-version.sh
├── docker-login.sh
├── find-official-remote.sh
├── generate-help-output.sh
├── ids-to-base64.py
├── metrics-md.py
├── platforms-to-gh-matrix.sh
└── run-tests.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .codecov.yml
================================================
codecov:
notify:
require_ci_to_pass: yes
after_n_builds: 18
strict_yaml_branch: main # only use the latest copy on the main branch
ignore:
- "**/*.pb.go"
- "**/mocks/*"
- "proto-gen/*/*"
- "thrift-gen/*/*"
- "**/main.go"
- "examples/hotrod"
- "internal/storage/integration"
- "cmd/jaeger/internal/integration"
- "internal/tools"
coverage:
precision: 2
round: down
range: "95...100"
status:
project:
default:
enabled: yes
target: 95%
patch:
default:
enabled: yes
target: 95%
================================================
FILE: .fossa.yml
================================================
# FOSSA Configuration File
# https://github.com/fossas/fossa-cli/blob/master/docs/references/files/fossa-yml.md
#
# This configuration excludes development-only tooling from license scanning.
# The excluded paths contain GPL-3.0 licensed tools (golangci-lint and its plugins)
# that are used only during development and are NOT compiled into or distributed
# with the final Jaeger binaries.
#
# These tools are in separate Go modules specifically to isolate them from
# production dependencies. Using GPL-licensed development tools to build
# Apache 2.0 licensed software does not create any license compliance issues.
version: 3
project:
id: git+github.com/jaegertracing/jaeger
name: jaeger
paths:
exclude:
# Development tooling (golangci-lint and plugins) - GPL-3.0 licensed
# These are NOT part of the distributed binaries
- ./internal/tools
# Debug build utilities - only used for debugging, not distributed
- ./scripts/build/docker/debug
# Git submodules - scanned separately in their own repositories
- ./idl
- ./jaeger-ui
================================================
FILE: .github/CODEOWNERS
================================================
* @jaegertracing/jaeger-maintainers
================================================
FILE: .github/actions/block-pr-from-main-branch/action.yml
================================================
name: 'block-pr-not-on-main'
description: 'Blocks PRs from main branch of forked repository'
runs:
using: "composite"
steps:
- name: Ensure PR is not on main branch
shell: bash
run: |
echo "Repo: ${{ github.repository }}"
echo "Head Repo: ${{ github.event.pull_request.head.repo.full_name }}"
echo "Forked: ${{ github.event.pull_request.head.repo.fork }}"
echo "Branch: ${{ github.event.pull_request.head.ref }}"
if [ "${{ github.event.pull_request.head.repo.fork }}" == "true" ] && [ "${{ github.event.pull_request.head.ref }}" == 'main' ]; then
echo "Error 🛑: PRs from the main branch of forked repositories are not allowed."
echo " Please create a named branch and resubmit the PR."
echo " See https://github.com/jaegertracing/jaeger/blob/main/CONTRIBUTING_GUIDELINES.md#branches"
exit 1
fi
================================================
FILE: .github/actions/setup-branch/action.yml
================================================
name: 'Setup BRANCH'
description: 'Make BRANCH var accessible to job'
runs:
using: "composite"
steps:
- name: Setup BRANCH
shell: bash
run: |
echo GITHUB_EVENT_NAME=${GITHUB_EVENT_NAME}
echo GITHUB_HEAD_REF=${GITHUB_HEAD_REF}
echo GITHUB_REF=${GITHUB_REF}
case ${GITHUB_EVENT_NAME} in
pull_request)
BRANCH=${GITHUB_HEAD_REF}
if [[ $BRANCH == 'main' ]]; then
BRANCH=main_from_fork
fi
;;
*)
BRANCH=${GITHUB_REF##*/}
;;
esac
echo "we are on branch=${BRANCH}"
echo "BRANCH=${BRANCH}" >> ${GITHUB_ENV}
================================================
FILE: .github/actions/setup-go-tip/action.yml
================================================
# Inspired by https://github.com/actions/setup-go/issues/21#issuecomment-997208686
name: 'Install Go Tip'
description: 'Install Go Tip toolchain'
inputs:
gh_token:
description: 'The GitHub Token'
required: true
runs:
using: "composite"
steps:
- name: Download pre-built Go tip from grafana/gotip repo
id: download
shell: bash
run: |
set -euo pipefail
gh release download ubuntu-latest --repo grafana/gotip --pattern 'go.zip'
echo "::group::unzip"
unzip go.zip -d $HOME/sdk
echo "::endgroup::"
export GOROOT="$HOME/sdk/gotip"
echo "GOROOT=$GOROOT" >> $GITHUB_ENV
echo "success=true" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ inputs.gh_token }}
# If download failed, we will try to build tip from source.
# This requires Go toolchain, so install it first.
# However, gotip is picky about the version of Go used to build it,
# sometimes it requires the latest version, so determine it dynamically.
- name: Determine latest Go version
if: steps.download.outputs.success == 'false'
id: get_go_version
shell: bash
run: |
LATEST_GO_VERSION=$(curl -s "https://go.dev/VERSION?m=text" | grep go1 | sed 's/^go//g')
echo "LATEST_GO_VERSION=$LATEST_GO_VERSION" >> $GITHUB_OUTPUT
- name: Install Go toolchain
if: steps.download.outputs.success == 'false'
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: ${{ steps.get_go_version.outputs.LATEST_GO_VERSION }}
- name: Build Go Tip from source
if: steps.download.outputs.success == 'false'
shell: bash
run: |
echo Build Go Tip from source
set -euo pipefail
go install golang.org/dl/gotip@latest
gotip download
export GOROOT="$(gotip env GOROOT)"
echo "GOROOT=$GOROOT" >> $GITHUB_ENV
# for some reason even though we put gotip at the front of PATH later,
# the go binary installed in previous step still takes precedence. So remove it.
rm -f $(which go)
- name: Setup Go environment
shell: bash
run: |
echo Setup Go environment
set -euo pipefail
$GOROOT/bin/go version
GOPATH="$HOME/gotip"
PATH="$GOROOT/bin:$GOPATH/bin:$PATH"
echo "GOPATH=$GOPATH" >> $GITHUB_ENV
echo "PATH=$PATH" >> $GITHUB_ENV
- name: Check Go Version
shell: bash
run: |
echo Check Go Version
set -euo pipefail
echo "GOPATH=$GOPATH"
echo "GOROOT=$GOROOT"
echo "which go:"
which -a go
echo "Active Go version:"
go version
================================================
FILE: .github/actions/setup-node.js/action.yml
================================================
name: 'Setup Node.js'
description: 'Setup Node.js version as required by jaeger-ui repo. Must be called after checkout with submodules.'
runs:
using: "composite"
steps:
- name: Get Node.js version from jaeger-ui
shell: bash
run: |
echo "JAEGER_UI_NODE_JS_VERSION=$(cat jaeger-ui/.nvmrc)" >> ${GITHUB_ENV}
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ env.JAEGER_UI_NODE_JS_VERSION }}
cache: 'npm'
cache-dependency-path: jaeger-ui/package-lock.json
================================================
FILE: .github/actions/upload-codecov/action.yml
================================================
# Copyright (c) 2023 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# Codecov upload often fails on rate limits if used without a token.
# See https://github.com/codecov/codecov-action/issues/837
# This action embeds a token directly.
# We cannot define it as "secret" as we need it accessible from forks.
name: 'Upload coverage to codecov'
description: 'Uploads coverage to codecov with retries and saves raw profiles as artifacts'
inputs:
files:
description: 'Coverage files to upload (comma-separated)'
required: true
flag:
description: 'Codecov flag for this upload; also used as the artifact name suffix (coverage-<flag>)'
required: true
runs:
using: 'composite'
steps:
# Upload raw profiles first so they are available to the fan-in workflow
# even if the Codecov upload below fails (e.g. rate-limit).
- name: Stage coverage files for artifact upload
shell: bash
run: |
set -x
mkdir -p /tmp/coverage-staging
IFS=',' read -ra FILES <<< "${{ inputs.files }}"
echo "Staging ${#FILES[@]} coverage file(s): ${{ inputs.files }}"
for f in "${FILES[@]}"; do
f=$(echo "$f" | xargs) # trim whitespace
if [ -f "$f" ]; then
echo "Staging: $f"
cp "$f" /tmp/coverage-staging/
else
echo "Warning: coverage file not found, skipping: $f"
fi
done
echo "Staged files:"
ls -la /tmp/coverage-staging/
- name: Upload coverage profiles as artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: coverage-${{ inputs.flag }}
path: /tmp/coverage-staging/
retention-days: 7
- name: Retry upload
uses: Wandalen/wretry.action@e68c23e6309f2871ca8ae4763e7629b9c258e1ea # v3.8.0
with:
attempt_limit: 6
# sleep 10 seconds between retries
attempt_delay: 10000
action: codecov/codecov-action@7afa10ed9b269c561c2336fd862446844e0cbf71 # v4.2.0
with: |
files: ${{ inputs.files }}
flags: ${{ inputs.flag }}
verbose: true
fail_ci_if_error: false
token: f457b710-93af-4191-8678-bcf51281f98c
================================================
FILE: .github/actions/verify-metrics-snapshot/action.yaml
================================================
# Copyright (c) 2023 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
name: 'Verify Metric Snapshot and Upload Metrics'
description: 'Upload or cache the metrics data after verification'
inputs:
snapshot:
description: 'Path to the metric file'
required: true
artifact_key:
description: 'Artifact key used for uploading and fetching artifacts'
required: true
runs:
using: 'composite'
steps:
- name: Upload current metrics snapshot
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: ${{ inputs.artifact_key }}
path: ./.metrics/${{ inputs.snapshot }}.txt
retention-days: 7
# The github cache restore successfully restores when cache saved has same key and same path.
# Hence to restore release metric with name relese_{metric_name} , the name must be changed to the same.
- name: Change file name before caching
if: github.ref_name == 'main'
shell: bash
run: |
mv ./.metrics/${{ inputs.snapshot }}.txt ./.metrics/baseline_${{ inputs.snapshot }}.txt
- name: Cache metrics snapshot on main branch for longer retention
if: github.ref_name == 'main'
uses: actions/cache/save@1bd1e32a3bdc45362d1e726936510720a7c30a57
with:
path: ./.metrics/baseline_${{ inputs.snapshot }}.txt
key: ${{ inputs.artifact_key }}_${{ github.run_id }}
# Use restore keys to match prefix and fetch the latest cache
# Here , restore keys is an ordered list of prefixes that need to be matched
- name: Download the cached tagged metrics
id: download-release-snapshot
if: github.ref_name != 'main'
uses: actions/cache/restore@1bd1e32a3bdc45362d1e726936510720a7c30a57
with:
path: ./.metrics/baseline_${{ inputs.snapshot }}.txt
key: ${{ inputs.artifact_key }}
restore-keys: |
${{ inputs.artifact_key }}
# Create an empty stub so the diff artifact is always uploaded on PRs.
# The fan-in uses 1-to-1 presence of diff artifacts to detect infra failures
# (a missing diff_* artifact means this action never ran for that snapshot).
# The stub is overwritten by the compare step when a baseline exists.
- name: Create diff file stub
if: github.ref_name != 'main'
shell: bash
run: touch ./.metrics/diff_${{ inputs.snapshot }}.txt
- name: Calculate diff between the snapshots
id: compare-snapshots
if: ${{ (github.ref_name != 'main') && (steps.download-release-snapshot.outputs.cache-matched-key != '') }}
continue-on-error: true
shell: bash
run: |
python3 -m pip install prometheus-client
if python3 ./scripts/e2e/compare_metrics.py --file1 ./.metrics/${{ inputs.snapshot }}.txt --file2 ./.metrics/baseline_${{ inputs.snapshot }}.txt --output ./.metrics/diff_${{ inputs.snapshot }}.txt; then
echo "No differences found in metrics"
else
echo "🛑 Differences found in metrics"
echo "has_diff=true" >> $GITHUB_OUTPUT
fi
# Always upload the diff artifact on PRs (even when empty / no baseline yet).
# Presence of this artifact in the fan-in proves this action ran for the snapshot.
- name: Upload the diff artifact
if: github.ref_name != 'main'
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: diff_${{ inputs.artifact_key }}
path: ./.metrics/diff_${{ inputs.snapshot }}.txt
retention-days: 7
================================================
FILE: .github/scripts/.gitignore
================================================
node_modules/
================================================
FILE: .github/scripts/README.md
================================================
# PR Quota Manager - Manual Execution Guide
This document explains how to run the PR Quota Manager script manually from the command line for testing and troubleshooting.
## Prerequisites
1. **Node.js** (version 16 or higher)
```bash
node --version
```
2. **GitHub Personal Access Token** with the following permissions:
- `repo` (Full control of private repositories)
- `public_repo` (Access public repositories) - if working with public repos only
Create a token at: https://github.com/settings/tokens.
Store the value in a file, e.g. `~/.github_token`.
Then set the environment variable:
```bash
read -r GITHUB_TOKEN < ~/.github_token
export GITHUB_TOKEN
```
3. **Install Dependencies**
Navigate to the `.github/scripts` directory and install dependencies:
```bash
cd .github/scripts
npm ci
```
## Running the Script
### Basic Usage
```bash
node pr-quota-manager.js <username> [owner] [repo]
```
### Parameters
- `username` (required): The GitHub username to process quota for
- `owner` (optional): Repository owner (defaults to `jaegertracing` or `GITHUB_REPOSITORY` env var)
- `repo` (optional): Repository name (defaults to `jaeger` or `GITHUB_REPOSITORY` env var)
### Examples
**Process quota for a specific user in the default repository:**
```bash
node pr-quota-manager.js newcontributor
```
**Process quota for a user in a different repository:**
```bash
node pr-quota-manager.js username myorg myrepo
```
**Using environment variables for repository:**
```bash
export GITHUB_REPOSITORY="jaegertracing/jaeger"
node pr-quota-manager.js contributor
```
### Dry-Run Mode
Test the script without making any actual changes:
```bash
# Using flag
node pr-quota-manager.js username --dry-run
# Using environment variable
DRY_RUN=true node pr-quota-manager.js username
```
In dry-run mode, the script will:
- Show exactly what actions it would take
- Not create/modify labels
- Not post comments
- Not make any API modifications
- Still fetch and analyze PRs for accurate simulation
## Listing Open PRs by Author
Use the utility script to see all open PRs grouped by author:
```bash
node list-open-prs-by-author.js [owner] [repo]
```
This is useful for:
- Identifying which users need quota processing
- Planning backfills of the quota system
- Seeing which PRs are already quota-blocked
**CSV output for scripting:**
```bash
FORMAT=csv node list-open-prs-by-author.js > prs.csv
```
## Output
The script will display:
1. **History Audit**: Summary of merged PR count (up to 3 merged PRs for quota calculation)
2. **Current Stats**: Merged count, calculated quota, and open PR count
3. **Processing Actions**: Each PR being blocked/unblocked
4. **Summary**: Total counts of blocked, unblocked, and unchanged PRs
### Example Output
```
=== Processing Quota for: @newuser ===
📜 History Audit:
No merged PRs found.
📊 Current Stats:
User has 0 merged PRs. Current Quota: 1. Currently Open: 3.
🔄 Processing Open PRs:
ℹ️ PR #123 unchanged (active)
✅ Labeled PR #124 as blocked (Position: 2/3, Quota: 1)
✅ Labeled PR #125 as blocked (Position: 3/3, Quota: 1)
✅ Processing Complete for @newuser
📋 Summary:
- Blocked: 2 PRs
- Unblocked: 0 PRs
- Unchanged: 1 PRs
```
## Running Tests
To run the unit tests:
```bash
cd .github/scripts
npm test
```
To run tests with coverage:
```bash
npm test -- --coverage
```
## Quota Rules
The script applies the following quota rules:
| Merged PRs | Quota |
|-----------|-------|
| 0 | 1 |
| 1 | 2 |
| 2 | 3 |
| 3+ | 10 |
## Troubleshooting
### "GITHUB_TOKEN environment variable is required"
Make sure you've set the `GITHUB_TOKEN` environment variable:
```bash
export GITHUB_TOKEN="your_token_here"
```
### "403 Forbidden" errors
Your GitHub token may not have the required permissions. Ensure it has:
- `repo` scope for private repositories
- `public_repo` scope for public repositories
### "Cannot find module '@octokit/rest'"
Install the required dependency:
```bash
cd .github/scripts
npm install @octokit/rest
```
### API Rate Limiting
GitHub has rate limits for API requests:
- Authenticated requests: 5,000 requests per hour
- The script makes approximately 2-5 API calls per user
If you hit rate limits, wait for the limit to reset or use a different token.
## How It Works
1. **Fetches PRs** by the target author (all open PRs + up to 3 merged PRs for quota calculation)
2. **Calculates quota** based on the number of merged PRs
3. **Identifies open PRs** and sorts them by creation date (oldest first)
4. **Applies labels** to PRs based on quota:
- PRs within quota: Remove `pr-quota-reached` label (if present)
- PRs exceeding quota: Add `pr-quota-reached` label
5. **Posts comments** (only on state changes to avoid spam):
- Blocking comment when PR first gets blocked
- Unblocking comment when PR is moved to active queue
## Integration with GitHub Actions
This script is automatically executed by the GitHub Actions workflow (`.github/workflows/pr-quota-manager.yml`) on:
- Pull request opened, closed, or reopened events
- Manual workflow dispatch
The workflow uses `actions/github-script` to run the script with the repository's built-in `GITHUB_TOKEN`.
================================================
FILE: .github/scripts/ci-summary-report-publish.js
================================================
// Copyright (c) 2026 The Jaeger Authors.
// SPDX-License-Identifier: Apache-2.0
// SECURITY WARNING — INJECTION RISK
//
// This script runs in the BASE REPOSITORY context (via workflow_run) with
// pull-requests: write and checks: write permissions. The ci-summary artifact
// it reads was produced by a PR's CI run and may originate from a FORK,
// containing UNTRUSTED content crafted by the PR author.
//
// NEVER interpolate artifact content verbatim into PR comments, check run
// summaries, or any GitHub API call. Doing so allows a malicious PR to inject
// arbitrary Markdown or URLs into the repository's UI.
//
// Required invariants maintained by this file:
// 1. ci-summary.json contains ONLY typed primitives: numbers, booleans, and
// fixed enum strings ("success"/"failure"/"skipped"). No free-form text.
// 2. All display text (PR comments, check summaries) is constructed entirely
// from trusted template strings defined in this file.
// 3. Numeric values are coerced through safeNum() which validates with
// Number.isFinite() and rejects negatives.
// 4. Boolean fields are compared with === true, never coerced with !! which
// would misinterpret a JSON string "false" as truthy.
// 5. String fields from the artifact are used only in comparisons
// (=== 'success'), never interpolated into output strings.
'use strict';
// HTML comment tag used to identify the CI summary comment on a PR.
const COMMENT_TAG = '<!-- ci-summary-report -->';
/**
* Coerce a value from ci-summary.json to a non-negative number, or null.
* Returns null for null/undefined inputs (preserves "step did not run" signal).
* Returns null for NaN, Infinity, or negative values.
* @param {*} v
* @returns {number|null}
*/
function safeNum(v) {
if (v === null || v === undefined) return null;
const n = Number(v);
return Number.isFinite(n) && n >= 0 ? n : null;
}
// Prometheus metric names: must start with [a-zA-Z_:], followed by [a-zA-Z0-9_:].
const METRIC_NAME_RE = /^[a-zA-Z_:][a-zA-Z0-9_:]*$/;
const MAX_METRIC_NAME_LEN = 200;
const MAX_SNAPSHOT_NAME_LEN = 200;
const MAX_SNAPSHOTS = 50;
const MAX_METRIC_NAMES_PER_SNAPSHOT = 200;
// Snapshot names come from artifact directory names (alphanumeric, underscores,
// dots, hyphens). We reject anything outside this character set.
const SNAPSHOT_NAME_RE = /^[a-zA-Z0-9_.\-]+$/;
/**
* Validate and sanitize a Prometheus metric name.
* Returns the name if valid, null otherwise.
* @param {*} name
* @returns {string|null}
*/
function sanitizeMetricName(name) {
if (typeof name !== 'string') return null;
if (name.length === 0 || name.length > MAX_METRIC_NAME_LEN) return null;
return METRIC_NAME_RE.test(name) ? name : null;
}
/**
* Validate and sanitize the metrics_snapshots array from ci-summary.json.
* Each entry is validated: counts go through safeNum(), metric names through
* sanitizeMetricName(). Invalid entries or fields are silently dropped.
* @param {*} raw - The raw metrics_snapshots value from the artifact
* @returns {Array|null} - Sanitized array, or null if input is missing/invalid
*/
function sanitizeSnapshots(raw) {
if (!Array.isArray(raw)) return null;
const result = [];
for (const entry of raw) {
if (result.length >= MAX_SNAPSHOTS) break;
if (typeof entry !== 'object' || entry === null) continue;
// Validate snapshot name
const snapshot = typeof entry.snapshot === 'string'
&& entry.snapshot.length > 0
&& entry.snapshot.length <= MAX_SNAPSHOT_NAME_LEN
&& SNAPSHOT_NAME_RE.test(entry.snapshot)
? entry.snapshot : null;
if (!snapshot) continue;
// Validate counts
const added = safeNum(entry.added);
const removed = safeNum(entry.removed);
const modified = safeNum(entry.modified);
// Validate metric_names array — collect up to cap valid names
const names = [];
if (Array.isArray(entry.metric_names)) {
for (const n of entry.metric_names) {
if (names.length >= MAX_METRIC_NAMES_PER_SNAPSHOT) break;
const clean = sanitizeMetricName(n);
if (clean) names.push(clean);
}
}
result.push({ snapshot, added, removed, modified, metric_names: names });
}
return result.length > 0 ? result : null;
}
/**
* Derive metrics conclusion and display text from the parsed ci-summary artifact.
* Uses === true for boolean fields to avoid misinterpreting JSON strings.
* @param {object} s - Parsed ci-summary.json
* @returns {{ hasInfraErrors: boolean, totalChanges: number|null, snapshots: Array|null, conclusion: string, text: string }}
*/
function computeMetrics(s) {
const hasInfraErrors = s.metrics_has_infra_errors === true;
const totalChanges = safeNum(s.metrics_total_changes);
const snapshots = sanitizeSnapshots(s.metrics_snapshots);
// Derive conclusion from the same conditions that drive text so they are always consistent.
const conclusion = (hasInfraErrors || totalChanges === null || totalChanges > 0) ? 'failure' : 'success';
let text;
if (hasInfraErrors) {
text = '❌ Infrastructure error: missing diff artifacts';
} else if (totalChanges === null) {
text = '❌ Could not read metrics_total_changes from summary';
} else if (totalChanges > 0) {
text = `❌ ${totalChanges} metric change(s) detected`;
} else {
text = '✅ No significant metric changes';
}
return { hasInfraErrors, totalChanges, snapshots, conclusion, text };
}
/**
* Derive coverage conclusion and display text from the parsed ci-summary artifact.
* @param {object} s - Parsed ci-summary.json
* @returns {{ skipped: boolean, conclusion: string, text: string }}
*/
function computeCoverage(s) {
const skipped = s.coverage_skipped === true || s.coverage_conclusion === 'skipped';
const conclusion = (skipped || s.coverage_conclusion === 'success') ? 'success' : 'failure';
const pct = safeNum(s.coverage_percentage);
const baseline = safeNum(s.coverage_baseline);
let text;
if (skipped) {
text = '⏭️ No coverage profiles found; coverage gate skipped.';
} else {
const pctStr = pct !== null ? `${pct}%` : 'unknown';
const baselineStr = baseline !== null ? ` (baseline ${baseline}%)` : ' (no baseline)';
const icon = conclusion === 'success' ? '✅' : '❌';
text = `${icon} Coverage ${pctStr}${baselineStr}`;
}
return { skipped, conclusion, text };
}
/**
* Format a detail breakdown of per-snapshot metric changes.
* All text is built from trusted templates; metric names have been validated
* through sanitizeMetricName() and are rendered in backtick-code spans.
* @param {Array|null} snapshots - Sanitized snapshots from computeMetrics
* @returns {string} - Markdown detail block, or empty string if no data
*/
function formatMetricsDetail(snapshots) {
if (!snapshots || snapshots.length === 0) return '';
const lines = [
'',
'<details>',
'<summary>View changed metrics</summary>',
'',
];
for (const snap of snapshots) {
lines.push(`**${snap.snapshot}**`);
const parts = [];
if (snap.added !== null && snap.added > 0) parts.push(`${snap.added} added`);
if (snap.removed !== null && snap.removed > 0) parts.push(`${snap.removed} removed`);
if (snap.modified !== null && snap.modified > 0) parts.push(`${snap.modified} modified`);
if (parts.length > 0) {
lines.push(parts.join(', '));
}
if (snap.metric_names.length > 0) {
for (const name of snap.metric_names) {
lines.push(`- \`${name}\``);
}
}
lines.push('');
}
lines.push('</details>');
return lines.join('\n');
}
/**
* Build the PR comment body from pre-computed display strings.
* Inputs are strings produced by computeMetrics/computeCoverage: all display text
* is constructed from trusted templates; artifact-derived values appear only as
* validated primitives (numbers) embedded by those functions, never as raw strings.
* @param {string} metricsText
* @param {string} coverageText
* @param {string} footer - links + timestamp line
* @param {object} [opts]
* @param {Array|null} [opts.metricsSnapshots] - sanitized snapshot data for detail rendering
* @returns {string}
*/
function buildCommentBody(metricsText, coverageText, footer, { metricsSnapshots } = {}) {
const parts = [
COMMENT_TAG,
'## CI Summary Report',
'',
'### Metrics Comparison',
metricsText,
];
const detail = formatMetricsDetail(metricsSnapshots);
if (detail) {
parts.push(detail);
}
parts.push('');
parts.push('### Code Coverage');
parts.push(coverageText);
parts.push('');
parts.push(footer);
return parts.join('\n');
}
/**
* Create a completed check run and log the result.
* @param {object} github - Octokit client
* @param {string} owner
* @param {string} repo
* @param {string} headSha
* @param {string} name
* @param {string} conclusion
* @param {object} output - { title, summary, text }
* @param {object} core - GitHub Actions core logger
*/
async function postCheckRun(github, owner, repo, headSha, name, conclusion, output, core) {
core.info(`Creating check run: "${name}" (conclusion: ${conclusion})`);
const { data } = await github.rest.checks.create({
owner, repo,
head_sha: headSha,
name,
status: 'completed',
conclusion,
output,
});
core.info(`Check run created: id=${data.id} url=${data.html_url}`);
}
/**
* Post or update the CI summary comment on a PR.
* Always updates an existing comment (clears stale failure messages on green runs).
* Only creates a new comment when createNew is true.
* @param {object} github - Octokit client
* @param {string} owner
* @param {string} repo
* @param {number} prNumber
* @param {string} body
* @param {object} core - GitHub Actions core logger
* @param {object} [opts]
* @param {boolean} [opts.createNew=true] - create a comment if none exists
*/
async function postOrUpdateComment(github, owner, repo, prNumber, body, core, { createNew = true } = {}) {
core.info(`Searching for existing CI summary comment on PR #${prNumber}`);
const existing = await github.paginate(github.rest.issues.listComments, {
owner, repo, issue_number: prNumber,
}).then(cs => cs.find(c => c.body && c.body.startsWith(COMMENT_TAG)));
if (existing) {
core.info(`Updating existing comment id=${existing.id}`);
const { data: updated } = await github.rest.issues.updateComment({
owner, repo, comment_id: existing.id, body,
});
core.info(`Comment updated: url=${updated.html_url}`);
} else if (createNew) {
core.info(`Creating new comment on PR #${prNumber}`);
const { data: created } = await github.rest.issues.createComment({
owner, repo, issue_number: prNumber, body,
});
core.info(`Comment created: id=${created.id} url=${created.html_url}`);
} else {
core.info('No existing comment and no issues to report; skipping PR comment.');
}
}
/**
* GitHub Actions entry point.
* Reads ci-summary.json, computes conclusions, posts check runs and PR comment.
*
* @param {object} opts
* @param {object} opts.github - Octokit client from actions/github-script
* @param {object} opts.core - GitHub Actions core logger
* @param {object} opts.fs - Node fs module (injected for testability)
* @param {object} opts.inputs
* @param {string} opts.inputs.owner
* @param {string} opts.inputs.repo
* @param {string} opts.inputs.headSha
* @param {string} opts.inputs.prNumber - raw string from step output
* @param {string} opts.inputs.ciRunUrl
* @param {string} opts.inputs.publishUrl
*/
async function handler({ github, core, fs, inputs }) {
const { owner, repo, headSha, ciRunUrl, publishUrl } = inputs;
const prNumber = parseInt(inputs.prNumber, 10) || null;
const links = `➡️ [View CI run](${ciRunUrl}) | [View publish logs](${publishUrl})`;
const ts = new Date().toISOString().replace('T', ' ').replace(/\.\d+Z$/, ' UTC');
const footer = `${links}\n_${ts}_`;
// Read structured data written by ci-summary-report.yml.
// All fields are primitives (enums, numbers, booleans) — no free-form text.
let s;
try {
s = JSON.parse(fs.readFileSync('.artifacts/ci-summary.json', 'utf8'));
} catch (e) {
core.warning(`ci-summary.json not found or unparseable: ${e.message}`);
// Post failing check runs so required status checks are never silently absent.
// All text here is a trusted, fixed string — no artifact content is used.
const errorSummary = 'ci-summary artifact missing or unparseable; check CI run logs.';
for (const name of ['Metrics Comparison', 'Coverage Gate']) {
await postCheckRun(github, owner, repo, headSha, name, 'failure',
{ title: name, summary: errorSummary, text: footer }, core);
}
return;
}
const metrics = computeMetrics(s);
const coverage = computeCoverage(s);
await postCheckRun(github, owner, repo, headSha, 'Metrics Comparison', metrics.conclusion, {
title: 'Metrics Comparison Result',
summary: metrics.text,
text: `Total changes across all snapshots: ${metrics.totalChanges ?? 'unknown'}\n\n${footer}`,
}, core);
// Always created so it can be used as a required status check.
await postCheckRun(github, owner, repo, headSha, 'Coverage Gate', coverage.conclusion, {
title: 'Coverage Gate',
summary: coverage.text,
text: footer,
}, core);
// ── PR comment ──
if (prNumber) {
// Always update an existing comment so stale failure messages don't linger
// after a green run. Only create a new comment when there is something to report.
const hasIssues = metrics.conclusion === 'failure' || coverage.conclusion === 'failure'
|| metrics.totalChanges > 0;
const body = buildCommentBody(metrics.text, coverage.text, footer, { metricsSnapshots: metrics.snapshots });
await postOrUpdateComment(github, owner, repo, prNumber, body, core, { createNew: hasIssues });
} else {
core.info('No PR number; skipping PR comment.');
}
}
module.exports = handler;
module.exports.safeNum = safeNum;
module.exports.sanitizeMetricName = sanitizeMetricName;
module.exports.sanitizeSnapshots = sanitizeSnapshots;
module.exports.computeMetrics = computeMetrics;
module.exports.computeCoverage = computeCoverage;
module.exports.formatMetricsDetail = formatMetricsDetail;
module.exports.buildCommentBody = buildCommentBody;
module.exports.postCheckRun = postCheckRun;
module.exports.postOrUpdateComment = postOrUpdateComment;
module.exports.COMMENT_TAG = COMMENT_TAG;
================================================
FILE: .github/scripts/ci-summary-report-publish.test.js
================================================
// Copyright (c) 2026 The Jaeger Authors.
// SPDX-License-Identifier: Apache-2.0
'use strict';
const {
safeNum,
sanitizeMetricName,
sanitizeSnapshots,
computeMetrics,
computeCoverage,
formatMetricsDetail,
buildCommentBody,
postCheckRun,
postOrUpdateComment,
COMMENT_TAG,
} = require('./ci-summary-report-publish');
// ── safeNum ──────────────────────────────────────────────────────────────────
describe('safeNum', () => {
test('returns null for null', () => expect(safeNum(null)).toBeNull());
test('returns null for undefined', () => expect(safeNum(undefined)).toBeNull());
test('returns 0 for 0', () => expect(safeNum(0)).toBe(0));
test('returns integer value', () => expect(safeNum(5)).toBe(5));
test('returns float value', () => expect(safeNum(96.8)).toBe(96.8));
test('returns null for negative number', () => expect(safeNum(-1)).toBeNull());
test('returns null for NaN', () => expect(safeNum(NaN)).toBeNull());
test('returns null for Infinity', () => expect(safeNum(Infinity)).toBeNull());
test('coerces numeric string', () => expect(safeNum('42')).toBe(42));
test('returns null for non-numeric string', () => expect(safeNum('bad')).toBeNull());
});
// ── sanitizeMetricName ───────────────────────────────────────────────────────
describe('sanitizeMetricName', () => {
test('accepts valid Prometheus metric name', () => {
expect(sanitizeMetricName('http_server_duration')).toBe('http_server_duration');
});
test('accepts name with colons', () => {
expect(sanitizeMetricName('rpc:server_duration:total')).toBe('rpc:server_duration:total');
});
test('accepts name starting with underscore', () => {
expect(sanitizeMetricName('_internal_metric')).toBe('_internal_metric');
});
test('rejects empty string', () => {
expect(sanitizeMetricName('')).toBeNull();
});
test('rejects name starting with digit', () => {
expect(sanitizeMetricName('0invalid')).toBeNull();
});
test('rejects name with spaces', () => {
expect(sanitizeMetricName('metric name')).toBeNull();
});
test('rejects markdown injection', () => {
expect(sanitizeMetricName('[click me](http://evil.com)')).toBeNull();
});
test('rejects HTML injection', () => {
expect(sanitizeMetricName('<img src=x onerror=alert(1)>')).toBeNull();
});
test('rejects name with curly braces', () => {
expect(sanitizeMetricName('metric{label="value"}')).toBeNull();
});
test('rejects non-string types', () => {
expect(sanitizeMetricName(42)).toBeNull();
expect(sanitizeMetricName(null)).toBeNull();
expect(sanitizeMetricName(undefined)).toBeNull();
expect(sanitizeMetricName({})).toBeNull();
});
test('rejects names exceeding 200 characters', () => {
expect(sanitizeMetricName('a'.repeat(201))).toBeNull();
});
test('accepts names at exactly 200 characters', () => {
const name = 'a'.repeat(200);
expect(sanitizeMetricName(name)).toBe(name);
});
});
// ── sanitizeSnapshots ────────────────────────────────────────────────────────
describe('sanitizeSnapshots', () => {
test('returns null for non-array input', () => {
expect(sanitizeSnapshots(null)).toBeNull();
expect(sanitizeSnapshots(undefined)).toBeNull();
expect(sanitizeSnapshots('string')).toBeNull();
expect(sanitizeSnapshots({})).toBeNull();
});
test('returns null for empty array', () => {
expect(sanitizeSnapshots([])).toBeNull();
});
test('sanitizes valid snapshot entry', () => {
const input = [{
snapshot: 'metrics_snapshot_cassandra',
added: 2, removed: 1, modified: 0,
metric_names: ['http_server_duration', 'rpc_client_duration'],
}];
const result = sanitizeSnapshots(input);
expect(result).toHaveLength(1);
expect(result[0].snapshot).toBe('metrics_snapshot_cassandra');
expect(result[0].added).toBe(2);
expect(result[0].removed).toBe(1);
expect(result[0].modified).toBe(0);
expect(result[0].metric_names).toEqual(['http_server_duration', 'rpc_client_duration']);
});
test('drops entries with invalid snapshot names', () => {
const input = [
{ snapshot: 'valid_name', added: 1, removed: 0, modified: 0, metric_names: [] },
{ snapshot: '<script>alert(1)</script>', added: 1, removed: 0, modified: 0, metric_names: [] },
{ snapshot: 'also.valid-name.2', added: 0, removed: 1, modified: 0, metric_names: [] },
];
const result = sanitizeSnapshots(input);
expect(result).toHaveLength(2);
expect(result[0].snapshot).toBe('valid_name');
expect(result[1].snapshot).toBe('also.valid-name.2');
});
test('drops invalid metric names from metric_names array', () => {
const input = [{
snapshot: 'test_snapshot',
added: 2, removed: 0, modified: 0,
metric_names: ['valid_metric', '<injected>', 'another_valid'],
}];
const result = sanitizeSnapshots(input);
expect(result[0].metric_names).toEqual(['valid_metric', 'another_valid']);
});
test('caps snapshots at 50 entries', () => {
const input = Array.from({ length: 60 }, (_, i) => ({
snapshot: `snap_${i}`,
added: 1, removed: 0, modified: 0,
metric_names: [],
}));
const result = sanitizeSnapshots(input);
expect(result).toHaveLength(50);
});
test('caps metric_names at 200 per snapshot', () => {
const names = Array.from({ length: 210 }, (_, i) => `metric_${i}`);
const input = [{
snapshot: 'test_snapshot',
added: 210, removed: 0, modified: 0,
metric_names: names,
}];
const result = sanitizeSnapshots(input);
expect(result[0].metric_names).toHaveLength(200);
});
test('handles missing metric_names gracefully', () => {
const input = [{
snapshot: 'test_snapshot',
added: 1, removed: 0, modified: 0,
}];
const result = sanitizeSnapshots(input);
expect(result[0].metric_names).toEqual([]);
});
test('validates counts through safeNum', () => {
const input = [{
snapshot: 'test_snapshot',
added: -1, removed: 'bad', modified: Infinity,
metric_names: ['valid_metric'],
}];
const result = sanitizeSnapshots(input);
expect(result[0].added).toBeNull();
expect(result[0].removed).toBeNull();
expect(result[0].modified).toBeNull();
});
test('skips null and non-object entries', () => {
const input = [null, 42, 'string', { snapshot: 'valid', added: 0, removed: 0, modified: 0, metric_names: [] }];
const result = sanitizeSnapshots(input);
expect(result).toHaveLength(1);
expect(result[0].snapshot).toBe('valid');
});
});
// ── computeMetrics ────────────────────────────────────────────────────────────
describe('computeMetrics', () => {
test('success when no changes and no infra errors', () => {
const r = computeMetrics({ metrics_has_infra_errors: false, metrics_total_changes: 0 });
expect(r.conclusion).toBe('success');
expect(r.text).toBe('✅ No significant metric changes');
expect(r.totalChanges).toBe(0);
expect(r.hasInfraErrors).toBe(false);
expect(r.snapshots).toBeNull();
});
test('failure when total changes > 0', () => {
const r = computeMetrics({ metrics_has_infra_errors: false, metrics_total_changes: 3 });
expect(r.conclusion).toBe('failure');
expect(r.text).toBe('❌ 3 metric change(s) detected');
expect(r.totalChanges).toBe(3);
});
test('failure when infra errors present', () => {
const r = computeMetrics({ metrics_has_infra_errors: true, metrics_total_changes: 0 });
expect(r.conclusion).toBe('failure');
expect(r.text).toBe('❌ Infrastructure error: missing diff artifacts');
expect(r.hasInfraErrors).toBe(true);
});
test('failure when total_changes is null (step did not write output)', () => {
const r = computeMetrics({ metrics_has_infra_errors: false, metrics_total_changes: null });
expect(r.conclusion).toBe('failure');
expect(r.text).toBe('❌ Could not read metrics_total_changes from summary');
expect(r.totalChanges).toBeNull();
});
test('infra errors take precedence over missing total_changes', () => {
const r = computeMetrics({ metrics_has_infra_errors: true, metrics_total_changes: null });
expect(r.conclusion).toBe('failure');
expect(r.text).toBe('❌ Infrastructure error: missing diff artifacts');
});
// Ensure JSON string "false" / "true" are not coerced as booleans
test('treats string "true" for metrics_has_infra_errors as falsy (not === true)', () => {
const r = computeMetrics({ metrics_has_infra_errors: 'true', metrics_total_changes: 0 });
expect(r.hasInfraErrors).toBe(false);
});
test('treats string "false" for metrics_has_infra_errors as falsy', () => {
const r = computeMetrics({ metrics_has_infra_errors: 'false', metrics_total_changes: 0 });
expect(r.hasInfraErrors).toBe(false);
});
test('includes sanitized snapshots when present', () => {
const r = computeMetrics({
metrics_has_infra_errors: false,
metrics_total_changes: 2,
metrics_snapshots: [{
snapshot: 'cassandra_v2',
added: 1, removed: 1, modified: 0,
metric_names: ['http_server_duration', 'rpc_client_duration'],
}],
});
expect(r.snapshots).toHaveLength(1);
expect(r.snapshots[0].snapshot).toBe('cassandra_v2');
expect(r.snapshots[0].metric_names).toEqual(['http_server_duration', 'rpc_client_duration']);
});
test('returns null snapshots when metrics_snapshots is absent', () => {
const r = computeMetrics({ metrics_has_infra_errors: false, metrics_total_changes: 0 });
expect(r.snapshots).toBeNull();
});
});
// ── formatMetricsDetail ──────────────────────────────────────────────────────
describe('formatMetricsDetail', () => {
test('returns empty string for null snapshots', () => {
expect(formatMetricsDetail(null)).toBe('');
});
test('returns empty string for empty array', () => {
expect(formatMetricsDetail([])).toBe('');
});
test('renders single snapshot with metric names', () => {
const detail = formatMetricsDetail([{
snapshot: 'cassandra_v2',
added: 1, removed: 0, modified: 1,
metric_names: ['http_server_duration', 'rpc_client_duration'],
}]);
expect(detail).toContain('<details>');
expect(detail).toContain('</details>');
expect(detail).toContain('View changed metrics');
expect(detail).toContain('**cassandra_v2**');
expect(detail).toContain('1 added, 1 modified');
expect(detail).toContain('- `http_server_duration`');
expect(detail).toContain('- `rpc_client_duration`');
});
test('renders multiple snapshots', () => {
const detail = formatMetricsDetail([
{ snapshot: 'snap_a', added: 2, removed: 0, modified: 0, metric_names: ['metric_a'] },
{ snapshot: 'snap_b', added: 0, removed: 3, modified: 0, metric_names: ['metric_b'] },
]);
expect(detail).toContain('**snap_a**');
expect(detail).toContain('**snap_b**');
expect(detail).toContain('2 added');
expect(detail).toContain('3 removed');
});
test('omits zero counts from summary line', () => {
const detail = formatMetricsDetail([{
snapshot: 'test', added: 0, removed: 5, modified: 0,
metric_names: [],
}]);
expect(detail).not.toContain('added');
expect(detail).toContain('5 removed');
expect(detail).not.toContain('modified');
});
});
// ── computeCoverage ───────────────────────────────────────────────────────────
describe('computeCoverage', () => {
test('success with pct and baseline', () => {
const r = computeCoverage({
coverage_skipped: false,
coverage_conclusion: 'success',
coverage_percentage: 96.8,
coverage_baseline: 46.4,
});
expect(r.conclusion).toBe('success');
expect(r.skipped).toBe(false);
expect(r.text).toBe('✅ Coverage 96.8% (baseline 46.4%)');
});
test('failure when conclusion is failure', () => {
const r = computeCoverage({
coverage_skipped: false,
coverage_conclusion: 'failure',
coverage_percentage: 94.0,
coverage_baseline: 96.0,
});
expect(r.conclusion).toBe('failure');
expect(r.text).toBe('❌ Coverage 94% (baseline 96%)');
});
test('skipped when coverage_skipped is true', () => {
const r = computeCoverage({ coverage_skipped: true, coverage_conclusion: 'success' });
expect(r.skipped).toBe(true);
expect(r.conclusion).toBe('success');
expect(r.text).toBe('⏭️ No coverage profiles found; coverage gate skipped.');
});
test('skipped when coverage_conclusion is "skipped"', () => {
const r = computeCoverage({ coverage_skipped: false, coverage_conclusion: 'skipped' });
expect(r.skipped).toBe(true);
expect(r.conclusion).toBe('success');
});
test('shows "unknown" pct when percentage is null', () => {
const r = computeCoverage({
coverage_skipped: false,
coverage_conclusion: 'failure',
coverage_percentage: null,
coverage_baseline: null,
});
expect(r.text).toBe('❌ Coverage unknown (no baseline)');
});
test('shows "no baseline" when baseline is null but pct is known', () => {
const r = computeCoverage({
coverage_skipped: false,
coverage_conclusion: 'success',
coverage_percentage: 97.0,
coverage_baseline: null,
});
expect(r.text).toBe('✅ Coverage 97% (no baseline)');
});
// Ensure JSON string "false" is not coerced as boolean true
test('treats string "true" for coverage_skipped as not skipped', () => {
const r = computeCoverage({
coverage_skipped: 'true',
coverage_conclusion: 'success',
coverage_percentage: 97.0,
coverage_baseline: 96.0,
});
expect(r.skipped).toBe(false);
});
});
// ── buildCommentBody ──────────────────────────────────────────────────────────
describe('buildCommentBody', () => {
const metricsText = '✅ No significant metric changes';
const coverageText = '✅ Coverage 96.8% (baseline 46.4%)';
const footer = '➡️ links\n_2026-03-04 00:00:00 UTC_';
test('starts with COMMENT_TAG for idempotent find-and-update', () => {
const body = buildCommentBody(metricsText, coverageText, footer);
expect(body.startsWith(COMMENT_TAG)).toBe(true);
});
test('contains expected section headers', () => {
const body = buildCommentBody(metricsText, coverageText, footer);
expect(body).toContain('## CI Summary Report');
expect(body).toContain('### Metrics Comparison');
expect(body).toContain('### Code Coverage');
});
test('embeds metrics and coverage text', () => {
const body = buildCommentBody(metricsText, coverageText, footer);
expect(body).toContain(metricsText);
expect(body).toContain(coverageText);
});
test('ends with footer', () => {
const body = buildCommentBody(metricsText, coverageText, footer);
expect(body.endsWith(footer)).toBe(true);
});
test('does not include details block when no snapshots', () => {
const body = buildCommentBody(metricsText, coverageText, footer);
expect(body).not.toContain('<details>');
});
test('includes metrics detail when metricsSnapshots provided', () => {
const snapshots = [{
snapshot: 'cassandra_v2',
added: 1, removed: 0, modified: 1,
metric_names: ['http_server_duration'],
}];
const body = buildCommentBody('❌ 2 metric change(s) detected', coverageText, footer, { metricsSnapshots: snapshots });
expect(body).toContain('<details>');
expect(body).toContain('**cassandra_v2**');
expect(body).toContain('- `http_server_duration`');
expect(body).toContain('</details>');
// Verify proper section ordering
const metricsPos = body.indexOf('### Metrics Comparison');
const detailsPos = body.indexOf('<details>');
const coveragePos = body.indexOf('### Code Coverage');
expect(metricsPos).toBeLessThan(detailsPos);
expect(detailsPos).toBeLessThan(coveragePos);
});
});
// ── postCheckRun ──────────────────────────────────────────────────────────────
describe('postCheckRun', () => {
const owner = 'org', repo = 'repo', headSha = 'abc123';
test('calls checks.create with correct parameters and logs result', async () => {
const mockGithub = {
rest: { checks: { create: jest.fn().mockResolvedValue({ data: { id: 42, html_url: 'https://example.com/check/42' } }) } },
};
const mockCore = { info: jest.fn() };
await postCheckRun(mockGithub, owner, repo, headSha, 'Coverage Gate', 'success',
{ title: 'Coverage Gate', summary: '✅ ok', text: 'footer' }, mockCore);
expect(mockGithub.rest.checks.create).toHaveBeenCalledWith({
owner, repo, head_sha: headSha,
name: 'Coverage Gate',
status: 'completed',
conclusion: 'success',
output: { title: 'Coverage Gate', summary: '✅ ok', text: 'footer' },
});
expect(mockCore.info).toHaveBeenCalledWith(expect.stringContaining('Coverage Gate'));
expect(mockCore.info).toHaveBeenCalledWith(expect.stringContaining('id=42'));
});
});
// ── postOrUpdateComment ───────────────────────────────────────────────────────
describe('postOrUpdateComment', () => {
const owner = 'org', repo = 'repo', prNumber = 99;
const body = `${COMMENT_TAG}\n## CI Summary Report`;
test('creates a new comment when none exists', async () => {
const mockGithub = {
paginate: jest.fn().mockResolvedValue([{ id: 1, body: 'unrelated comment' }]),
rest: { issues: {
listComments: jest.fn(),
createComment: jest.fn().mockResolvedValue({ data: { id: 201, html_url: 'https://example.com/comment/201' } }),
}},
};
const mockCore = { info: jest.fn() };
await postOrUpdateComment(mockGithub, owner, repo, prNumber, body, mockCore);
expect(mockGithub.rest.issues.createComment).toHaveBeenCalledWith(
expect.objectContaining({ owner, repo, issue_number: prNumber, body })
);
expect(mockCore.info).toHaveBeenCalledWith(expect.stringContaining('id=201'));
});
test('updates existing comment when one is found', async () => {
const existingComment = { id: 100, body: `${COMMENT_TAG}\nold content` };
const mockGithub = {
paginate: jest.fn().mockResolvedValue([existingComment]),
rest: { issues: {
listComments: jest.fn(),
updateComment: jest.fn().mockResolvedValue({ data: { html_url: 'https://example.com/comment/100' } }),
}},
};
const mockCore = { info: jest.fn() };
await postOrUpdateComment(mockGithub, owner, repo, prNumber, body, mockCore);
expect(mockGithub.rest.issues.updateComment).toHaveBeenCalledWith(
expect.objectContaining({ owner, repo, comment_id: 100, body })
);
expect(mockCore.info).toHaveBeenCalledWith(expect.stringContaining('Updating existing comment id=100'));
});
test('skips creating a new comment when createNew is false and no existing comment', async () => {
const mockGithub = {
paginate: jest.fn().mockResolvedValue([{ id: 1, body: 'unrelated' }]),
rest: { issues: {
listComments: jest.fn(),
createComment: jest.fn(),
}},
};
const mockCore = { info: jest.fn() };
await postOrUpdateComment(mockGithub, owner, repo, prNumber, body, mockCore, { createNew: false });
expect(mockGithub.rest.issues.createComment).not.toHaveBeenCalled();
expect(mockCore.info).toHaveBeenCalledWith(expect.stringContaining('No existing comment'));
});
test('still updates existing comment when createNew is false', async () => {
const existingComment = { id: 100, body: `${COMMENT_TAG}\nold failure` };
const mockGithub = {
paginate: jest.fn().mockResolvedValue([existingComment]),
rest: { issues: {
listComments: jest.fn(),
updateComment: jest.fn().mockResolvedValue({ data: { html_url: 'https://example.com/comment/100' } }),
}},
};
const mockCore = { info: jest.fn() };
await postOrUpdateComment(mockGithub, owner, repo, prNumber, body, mockCore, { createNew: false });
expect(mockGithub.rest.issues.updateComment).toHaveBeenCalledWith(
expect.objectContaining({ owner, repo, comment_id: 100, body })
);
expect(mockCore.info).toHaveBeenCalledWith(expect.stringContaining('Updating existing comment id=100'));
});
});
================================================
FILE: .github/scripts/list-open-prs-by-author.js
================================================
#!/usr/bin/env node
/**
* List Open PRs Grouped by Author
*
* This utility script lists all open PRs in a repository grouped by author.
* Useful for identifying which users need quota processing or backfilling.
*
* Usage:
* GITHUB_TOKEN=<token> node list-open-prs-by-author.js [owner] [repo]
*/
/**
* Fetch all open PRs grouped by author
* @param {object} octokit - GitHub API client
* @param {string} owner - Repository owner
* @param {string} repo - Repository name
* @returns {Promise<Map>} Map of author -> array of PRs
*/
async function fetchOpenPRsByAuthor(octokit, owner, repo) {
const prsByAuthor = new Map();
let page = 1;
const perPage = 100;
console.log(`📥 Fetching open PRs from ${owner}/${repo}...`);
while (true) {
const { data } = await octokit.rest.pulls.list({
owner,
repo,
state: 'open',
per_page: perPage,
page,
sort: 'created',
direction: 'asc'
});
if (data.length === 0) break;
for (const pr of data) {
const author = pr.user.login;
if (!prsByAuthor.has(author)) {
prsByAuthor.set(author, []);
}
prsByAuthor.get(author).push({
number: pr.number,
title: pr.title,
created_at: pr.created_at,
labels: pr.labels.map(l => l.name)
});
}
if (data.length < perPage) break;
page++;
}
return prsByAuthor;
}
/**
* Display PRs grouped by author
* @param {Map} prsByAuthor - Map of author -> PRs
*/
function displayResults(prsByAuthor) {
// Sort by number of open PRs (descending)
const sortedAuthors = Array.from(prsByAuthor.entries())
.sort((a, b) => b[1].length - a[1].length);
console.log(`\n📊 Found ${sortedAuthors.length} authors with open PRs\n`);
console.log('=' .repeat(80));
for (const [author, prs] of sortedAuthors) {
const hasQuotaLabel = prs.some(pr => pr.labels.includes('pr-quota-reached'));
const quotaIndicator = hasQuotaLabel ? ' 🚫' : '';
console.log(`\n👤 @${author} (${prs.length} open PR${prs.length > 1 ? 's' : ''})${quotaIndicator}`);
// Sort PRs by creation date (oldest first)
const sortedPRs = prs.sort((a, b) =>
new Date(a.created_at) - new Date(b.created_at)
);
for (const pr of sortedPRs) {
const date = new Date(pr.created_at).toISOString().split('T')[0];
const quotaLabel = pr.labels.includes('pr-quota-reached') ? ' [QUOTA REACHED]' : '';
console.log(` - PR #${pr.number}: ${pr.title.substring(0, 70)}${pr.title.length > 70 ? '...' : ''}`);
console.log(` Created: ${date}${quotaLabel}`);
}
}
console.log('\n' + '='.repeat(80));
console.log(`\n📋 Summary:`);
console.log(` Total authors: ${sortedAuthors.length}`);
console.log(` Total open PRs: ${Array.from(prsByAuthor.values()).reduce((sum, prs) => sum + prs.length, 0)}`);
const authorsWithQuota = sortedAuthors.filter(([_, prs]) =>
prs.some(pr => pr.labels.includes('pr-quota-reached'))
).length;
if (authorsWithQuota > 0) {
console.log(` Authors with quota-blocked PRs: ${authorsWithQuota}`);
}
}
/**
* Display in CSV format for easy processing
* @param {Map} prsByAuthor - Map of author -> PRs
*/
function displayCSV(prsByAuthor) {
console.log('Author,PR Count,PR Numbers,Has Quota Label');
for (const [author, prs] of prsByAuthor.entries()) {
const prNumbers = prs.map(pr => `#${pr.number}`).join(' ');
const hasQuotaLabel = prs.some(pr => pr.labels.includes('pr-quota-reached'));
console.log(`${author},${prs.length},"${prNumbers}",${hasQuotaLabel}`);
}
}
/**
* Main execution function
*/
async function main() {
const args = process.argv.slice(2);
const owner = args[0] || process.env.GITHUB_REPOSITORY?.split('/')[0] || 'jaegertracing';
const repo = args[1] || process.env.GITHUB_REPOSITORY?.split('/')[1] || 'jaeger';
const format = process.env.FORMAT || 'default'; // 'default' or 'csv'
if (!process.env.GITHUB_TOKEN) {
console.error('Error: GITHUB_TOKEN environment variable is required');
console.error('Usage: GITHUB_TOKEN=<token> node list-open-prs-by-author.js [owner] [repo]');
console.error('Optional: FORMAT=csv for CSV output');
process.exit(1);
}
// Import @octokit/rest dynamically
const { Octokit } = await import('@octokit/rest');
const octokit = new Octokit({
auth: process.env.GITHUB_TOKEN
});
try {
const prsByAuthor = await fetchOpenPRsByAuthor(octokit, owner, repo);
if (format === 'csv') {
displayCSV(prsByAuthor);
} else {
displayResults(prsByAuthor);
}
} catch (error) {
console.error('Error:', error.message);
process.exit(1);
}
}
// Export for testing
if (typeof module !== 'undefined' && module.exports) {
module.exports = {
fetchOpenPRsByAuthor,
displayResults,
displayCSV
};
}
// Run main function if executed directly
if (require.main === module) {
main().catch(error => {
console.error('Fatal error:', error);
process.exit(1);
});
}
================================================
FILE: .github/scripts/package.json
================================================
{
"name": "jaeger-ci-scripts",
"version": "1.0.0",
"description": "Jaeger CI scripts for managing pull request quotas and other automation tasks.",
"main": "pr-quota-manager.js",
"scripts": {
"test": "jest",
"test:coverage": "jest --coverage",
"test:watch": "jest --watch"
},
"keywords": [
"github",
"pull-request",
"quota",
"management"
],
"author": "Jaeger Team",
"license": "Apache-2.0",
"engines": {
"node": ">=24"
},
"dependencies": {
"@octokit/rest": "^22.0.0"
},
"devDependencies": {
"jest": "30.2.0"
},
"jest": {
"testEnvironment": "node",
"coveragePathIgnorePatterns": [
"/node_modules/"
],
"collectCoverageFrom": [
"pr-quota-manager.js",
"ci-summary-report-publish.js"
]
}
}
================================================
FILE: .github/scripts/pr-quota-manager.js
================================================
#!/usr/bin/env node
/**
* PR Quota Management System
*
* This script implements a "Waiting Room" system that limits concurrent open PRs
* from contributors based on their merge history, automatically unlocking queued PRs
* when quota becomes available.
*
* Usage:
* - Via GitHub Actions (integrated with actions/github-script)
* - Manual execution: GITHUB_TOKEN=<token> node pr-quota-manager.js <username> [owner] [repo]
*/
const LABEL_NAME = 'pr-quota-reached';
const LABEL_COLOR = 'CFD3D7';
/**
* Format open/limit counts as a bullet-point status block
* @param {number} openCount - Number of currently open PRs
* @param {number} quota - Allowed quota
* @returns {string} Formatted status string
*/
function formatStatus(openCount, quota) {
return ` * Open: ${openCount}\n * Limit: ${quota}`;
}
/**
* Calculate the quota for a user based on their merged PR count
* @param {number} mergedCount - Number of merged PRs
* @returns {number} The allowed quota
*/
function calculateQuota(mergedCount) {
if (mergedCount === 0) return 1;
if (mergedCount === 1) return 2;
if (mergedCount === 2) return 3;
return 10; // Unlimited for 3+ merged PRs
}
/**
* Fetch open and merged PRs by a specific author
* Optimized to stop early: fetches all open PRs and only enough merged PRs to determine quota
* @param {object} octokit - GitHub API client
* @param {string} owner - Repository owner/org
* @param {string} repo - Repository name
* @param {string} author - PR author username
* @returns {Promise<{openPRs: Array, mergedCount: number}>} Open PRs and count of merged PRs
*/
async function fetchAuthorPRs(octokit, owner, repo, author) {
const openPRs = [];
const mergedPRs = [];
const perPage = 100;
const MAX_MERGED_NEEDED = 3; // Stop after 3 merged PRs (gives unlimited quota)
// Fetch open PRs
let page = 1;
while (true) {
const { data } = await octokit.rest.pulls.list({
owner,
repo,
state: 'open',
per_page: perPage,
page,
sort: 'created',
direction: 'asc'
});
if (data.length === 0) break;
const authorPRs = data.filter(pr => pr.user.login === author);
openPRs.push(...authorPRs);
if (data.length < perPage) break;
page++;
}
// Fetch merged PRs, but stop once we have enough to determine quota
page = 1;
while (mergedPRs.length < MAX_MERGED_NEEDED) {
const { data } = await octokit.rest.pulls.list({
owner,
repo,
state: 'closed',
per_page: perPage,
page,
sort: 'created',
direction: 'desc' // Most recent first to find merges faster
});
if (data.length === 0) break;
const authorMergedPRs = data.filter(pr => pr.user.login === author && pr.merged_at !== null);
mergedPRs.push(...authorMergedPRs);
// Stop if we have enough merged PRs to determine unlimited quota
if (mergedPRs.length >= MAX_MERGED_NEEDED) break;
if (data.length < perPage) break;
page++;
}
return {
openPRs,
mergedCount: mergedPRs.length
};
}
/**
* Process quota management for a specific author
* @param {object} octokit - GitHub API client
* @param {string} owner - Repository owner
* @param {string} repo - Repository name
* @param {string} author - PR author username
* @param {object} logger - Logger object (console or custom)
* @param {boolean} dryRun - If true, only print actions without executing them
* @returns {Promise<object>} Processing results
*/
async function processQuotaForAuthor(octokit, owner, repo, author, logger = console, dryRun = false) {
if (dryRun) {
logger.log('🔍 DRY RUN MODE - No changes will be made\n');
}
logger.log(`\n=== Processing Quota for: @${author} ===\n`);
// Fetch PRs by the author (optimized to stop early)
const { openPRs, mergedCount } = await fetchAuthorPRs(octokit, owner, repo, author);
// Open PRs are already sorted by creation date (oldest first) from the fetch
const quota = calculateQuota(mergedCount);
const openCount = openPRs.length;
// Log history audit
logger.log('📜 History Audit:');
if (mergedCount === 0) {
logger.log(' No merged PRs found.');
} else if (mergedCount >= 3) {
logger.log(` User has ${mergedCount}+ merged PRs (unlimited quota).`);
} else {
logger.log(` User has ${mergedCount} merged PR${mergedCount > 1 ? 's' : ''}.`);
}
// Log current stats
logger.log(`\n📊 Current Stats:`);
logger.log(` User has ${mergedCount} merged PRs. Current Quota: ${quota}. Currently Open: ${openCount}.`);
// Ensure label exists
if (!dryRun) {
await ensureLabelExists(octokit, owner, repo, logger);
}
// Process each open PR
const results = {
blocked: [],
unblocked: [],
unchanged: []
};
logger.log(`\n🔄 Processing Open PRs:\n`);
for (let i = 0; i < openPRs.length; i++) {
const pr = openPRs[i];
const shouldBeBlocked = i >= quota;
const isCurrentlyBlocked = pr.labels.some(label => label.name === LABEL_NAME);
if (shouldBeBlocked && !isCurrentlyBlocked) {
// Need to block this PR
if (dryRun) {
logger.log(` 🔍 [DRY RUN] Would label PR #${pr.number} as blocked (Position: ${i + 1}/${openCount}, Quota: ${quota})`);
logger.log(` 🔍 [DRY RUN] Would post blocking comment on PR #${pr.number}`);
} else {
await addLabel(octokit, owner, repo, pr.number, logger);
await postBlockingComment(octokit, owner, repo, pr.number, author, openCount, quota, logger);
logger.log(` ✅ Labeled PR #${pr.number} as blocked (Position: ${i + 1}/${openCount}, Quota: ${quota})`);
}
results.blocked.push(pr.number);
} else if (!shouldBeBlocked && isCurrentlyBlocked) {
// Need to unblock this PR
if (dryRun) {
logger.log(` 🔍 [DRY RUN] Would remove label from PR #${pr.number} (Position: ${i + 1}/${openCount}, Quota: ${quota})`);
logger.log(` 🔍 [DRY RUN] Would post unblocking comment on PR #${pr.number}`);
} else {
await removeLabel(octokit, owner, repo, pr.number, logger);
await postUnblockingComment(octokit, owner, repo, pr.number, author, openCount, quota, logger);
logger.log(` ✅ Unblocked PR #${pr.number} (Position: ${i + 1}/${openCount}, Quota: ${quota})`);
}
results.unblocked.push(pr.number);
} else {
results.unchanged.push(pr.number);
logger.log(` ℹ️ PR #${pr.number} unchanged (${shouldBeBlocked ? 'blocked' : 'active'})`);
}
}
logger.log(`\n✅ Processing Complete for @${author}\n`);
return {
author,
mergedCount,
quota,
openCount,
results
};
}
/**
* Ensure the pr-quota-reached label exists in the repository
*/
async function ensureLabelExists(octokit, owner, repo, logger) {
try {
await octokit.rest.issues.getLabel({
owner,
repo,
name: LABEL_NAME
});
} catch (error) {
if (error.status === 404) {
logger.log(`🏷️ Creating label: ${LABEL_NAME}`);
await octokit.rest.issues.createLabel({
owner,
repo,
name: LABEL_NAME,
color: LABEL_COLOR,
description: 'PR is on hold due to quota limits for new contributors'
});
} else {
throw error;
}
}
}
/**
* Add the quota-reached label to a PR
*/
async function addLabel(octokit, owner, repo, issueNumber, logger) {
try {
await octokit.rest.issues.addLabels({
owner,
repo,
issue_number: issueNumber,
labels: [LABEL_NAME]
});
} catch (error) {
logger.error(`Failed to add label to PR #${issueNumber}:`, error.message);
}
}
/**
* Remove the quota-reached label from a PR
*/
async function removeLabel(octokit, owner, repo, issueNumber, logger) {
try {
await octokit.rest.issues.removeLabel({
owner,
repo,
issue_number: issueNumber,
name: LABEL_NAME
});
} catch (error) {
// Ignore 404 errors (label wasn't present)
if (error.status !== 404) {
logger.error(`Failed to remove label from PR #${issueNumber}:`, error.message);
}
}
}
/**
* Check if a blocking comment already exists on the PR
*/
async function hasBlockingComment(octokit, owner, repo, issueNumber) {
const { data: comments } = await octokit.rest.issues.listComments({
owner,
repo,
issue_number: issueNumber
});
return comments.some(comment =>
comment.body && comment.body.includes('This PR is currently **on hold**')
);
}
/**
* Post a blocking comment to a PR
*/
async function postBlockingComment(octokit, owner, repo, issueNumber, author, openCount, quota, logger) {
// Check if blocking comment already exists
if (await hasBlockingComment(octokit, owner, repo, issueNumber)) {
logger.log(` ℹ️ Blocking comment already exists on PR #${issueNumber}, skipping.`);
return;
}
const message = `Hi @${author}, thanks for your contribution! To ensure quality reviews, we limit how many concurrent PRs new contributors can open:
${formatStatus(openCount, quota)}
This PR is currently **on hold**. We will automatically move this into the review queue once your existing PRs are merged or closed.
Please see our [Contributing Guidelines](https://github.com/jaegertracing/jaeger/blob/main/CONTRIBUTING_GUIDELINES.md#pull-request-limits-for-new-contributors) for details on our tiered quota policy.`;
try {
await octokit.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: message
});
} catch (error) {
logger.error(`Failed to post blocking comment on PR #${issueNumber}:`, error.message);
}
}
/**
* Post an unblocking comment to a PR
* Always posts when called - if PR was blocked again after being unblocked, user should be notified again
*/
async function postUnblockingComment(octokit, owner, repo, issueNumber, author, openCount, quota, logger) {
const message = `PR quota unlocked!
@${author}, this PR has been moved out of the waiting room and into the active review queue:
${formatStatus(openCount, quota)}
Thank you for your patience.`;
try {
await octokit.rest.issues.createComment({
owner,
repo,
issue_number: issueNumber,
body: message
});
} catch (error) {
logger.error(`Failed to post unblocking comment on PR #${issueNumber}:`, error.message);
}
}
/**
* Main execution function for manual CLI usage
*/
async function main() {
const args = process.argv.slice(2);
if (args.length < 1) {
console.error('Usage: GITHUB_TOKEN=<token> node pr-quota-manager.js <username> [owner] [repo]');
process.exit(1);
}
const username = args[0];
const owner = args[1] || process.env.GITHUB_REPOSITORY?.split('/')[0] || 'jaegertracing';
const repo = args[2] || process.env.GITHUB_REPOSITORY?.split('/')[1] || 'jaeger';
const dryRun = process.env.DRY_RUN === 'true' || args.includes('--dry-run');
if (!process.env.GITHUB_TOKEN) {
console.error('Error: GITHUB_TOKEN environment variable is required');
process.exit(1);
}
// Import @octokit/rest dynamically for CLI usage
const { Octokit } = await import('@octokit/rest');
const octokit = new Octokit({
auth: process.env.GITHUB_TOKEN
});
try {
const result = await processQuotaForAuthor(octokit, owner, repo, username, console, dryRun);
console.log('\n📋 Summary:');
console.log(` - Blocked: ${result.results.blocked.length} PRs`);
console.log(` - Unblocked: ${result.results.unblocked.length} PRs`);
console.log(` - Unchanged: ${result.results.unchanged.length} PRs`);
} catch (error) {
console.error('Error:', error.message);
process.exit(1);
}
}
// GitHub Actions wrapper function
async function githubActionHandler({github, core, username, owner, repo, dryRun = false}) {
if (!username) {
core.setFailed('Username is required');
return;
}
if (!owner || !repo) {
core.setFailed('Owner and repo are required');
return;
}
// Process the quota
try {
const result = await processQuotaForAuthor(github, owner, repo, username, console, dryRun);
core.info('');
core.info('=== Summary ===');
core.info(`Blocked: ${result.results.blocked.length} PRs`);
core.info(`Unblocked: ${result.results.unblocked.length} PRs`);
core.info(`Unchanged: ${result.results.unchanged.length} PRs`);
if (result.results.blocked.length > 0) {
core.info(`Blocked PRs: ${result.results.blocked.join(', ')}`);
}
if (result.results.unblocked.length > 0) {
core.info(`Unblocked PRs: ${result.results.unblocked.join(', ')}`);
}
} catch (error) {
core.setFailed(`Error processing quota: ${error.message}`);
throw error;
}
}
// Export for GitHub Actions usage
if (typeof module !== 'undefined' && module.exports) {
// Default export is the GitHub Actions handler
module.exports = githubActionHandler;
// Named exports for testing and direct usage
module.exports.formatStatus = formatStatus;
module.exports.calculateQuota = calculateQuota;
module.exports.fetchAuthorPRs = fetchAuthorPRs;
module.exports.processQuotaForAuthor = processQuotaForAuthor;
module.exports.ensureLabelExists = ensureLabelExists;
module.exports.addLabel = addLabel;
module.exports.removeLabel = removeLabel;
module.exports.hasBlockingComment = hasBlockingComment;
module.exports.postBlockingComment = postBlockingComment;
module.exports.postUnblockingComment = postUnblockingComment;
module.exports.LABEL_NAME = LABEL_NAME;
module.exports.LABEL_COLOR = LABEL_COLOR;
}
// Run main function if executed directly
if (require.main === module) {
main().catch(error => {
console.error('Fatal error:', error);
process.exit(1);
});
}
================================================
FILE: .github/scripts/pr-quota-manager.test.js
================================================
/**
* Unit tests for PR Quota Management System
*/
const prQuotaManager = require('./pr-quota-manager');
const {
formatStatus,
calculateQuota,
fetchAuthorPRs,
processQuotaForAuthor,
ensureLabelExists,
addLabel,
removeLabel,
hasBlockingComment,
postBlockingComment,
postUnblockingComment,
LABEL_NAME,
LABEL_COLOR
} = prQuotaManager;
// Mock logger to suppress output during tests
const mockLogger = {
log: jest.fn(),
error: jest.fn()
};
describe('formatStatus', () => {
test('formats open count and quota as bullet points', () => {
expect(formatStatus(3, 5)).toBe(' * Open: 3\n * Limit: 5');
});
});
describe('calculateQuota', () => {
test('returns 1 for 0 merged PRs', () => {
expect(calculateQuota(0)).toBe(1);
});
test('returns 2 for 1 merged PR', () => {
expect(calculateQuota(1)).toBe(2);
});
test('returns 3 for 2 merged PRs', () => {
expect(calculateQuota(2)).toBe(3);
});
test('returns 10 (unlimited) for 3 merged PRs', () => {
expect(calculateQuota(3)).toBe(10);
});
test('returns 10 (unlimited) for 10 merged PRs', () => {
expect(calculateQuota(10)).toBe(10);
});
});
describe('fetchAuthorPRs', () => {
test('fetches open PRs and merged count', async () => {
const mockOctokit = {
rest: {
pulls: {
list: jest.fn()
// First call for open PRs
.mockResolvedValueOnce({
data: [
{ number: 1, user: { login: 'testuser' }, state: 'open', merged_at: null },
{ number: 2, user: { login: 'otheruser' }, state: 'open', merged_at: null },
{ number: 3, user: { login: 'testuser' }, state: 'open', merged_at: null }
]
})
// Second call for closed/merged PRs
.mockResolvedValueOnce({
data: [
{ number: 10, user: { login: 'testuser' }, merged_at: '2024-01-01' },
{ number: 11, user: { login: 'otheruser' }, merged_at: '2024-01-02' }
]
})
}
}
};
const result = await fetchAuthorPRs(mockOctokit, 'owner', 'repo', 'testuser');
expect(result.openPRs).toHaveLength(2);
expect(result.openPRs[0].number).toBe(1);
expect(result.openPRs[1].number).toBe(3);
expect(result.mergedCount).toBe(1);
});
test('stops fetching merged PRs after finding 3', async () => {
const mockOctokit = {
rest: {
pulls: {
list: jest.fn()
// Open PRs call
.mockResolvedValueOnce({ data: [] })
// First batch of closed PRs with 3 merged
.mockResolvedValueOnce({
data: [
{ number: 1, user: { login: 'testuser' }, merged_at: '2024-01-01' },
{ number: 2, user: { login: 'testuser' }, merged_at: '2024-01-02' },
{ number: 3, user: { login: 'testuser' }, merged_at: '2024-01-03' },
{ number: 4, user: { login: 'testuser' }, merged_at: null }, // closed but not merged
]
})
}
}
};
const result = await fetchAuthorPRs(mockOctokit, 'owner', 'repo', 'testuser');
expect(result.mergedCount).toBe(3);
// Should stop after finding 3 merged PRs, so only 2 calls (1 for open, 1 for closed)
expect(mockOctokit.rest.pulls.list).toHaveBeenCalledTimes(2);
});
});
describe('ensureLabelExists', () => {
test('does not create label if it already exists', async () => {
const mockOctokit = {
rest: {
issues: {
getLabel: jest.fn().mockResolvedValue({ data: { name: LABEL_NAME } }),
createLabel: jest.fn()
}
}
};
await ensureLabelExists(mockOctokit, 'owner', 'repo', mockLogger);
expect(mockOctokit.rest.issues.getLabel).toHaveBeenCalledWith({
owner: 'owner',
repo: 'repo',
name: LABEL_NAME
});
expect(mockOctokit.rest.issues.createLabel).not.toHaveBeenCalled();
});
test('creates label if it does not exist', async () => {
const mockOctokit = {
rest: {
issues: {
getLabel: jest.fn().mockRejectedValue({ status: 404 }),
createLabel: jest.fn().mockResolvedValue({})
}
}
};
await ensureLabelExists(mockOctokit, 'owner', 'repo', mockLogger);
expect(mockOctokit.rest.issues.createLabel).toHaveBeenCalledWith({
owner: 'owner',
repo: 'repo',
name: LABEL_NAME,
color: LABEL_COLOR,
description: 'PR is on hold due to quota limits for new contributors'
});
});
});
describe('addLabel', () => {
test('adds label to PR', async () => {
const mockOctokit = {
rest: {
issues: {
addLabels: jest.fn().mockResolvedValue({})
}
}
};
await addLabel(mockOctokit, 'owner', 'repo', 123, mockLogger);
expect(mockOctokit.rest.issues.addLabels).toHaveBeenCalledWith({
owner: 'owner',
repo: 'repo',
issue_number: 123,
labels: [LABEL_NAME]
});
});
test('handles errors gracefully', async () => {
const mockOctokit = {
rest: {
issues: {
addLabels: jest.fn().mockRejectedValue(new Error('API error'))
}
}
};
await addLabel(mockOctokit, 'owner', 'repo', 123, mockLogger);
expect(mockLogger.error).toHaveBeenCalledWith(
expect.stringContaining('Failed to add label'),
expect.any(String)
);
});
});
describe('removeLabel', () => {
test('removes label from PR', async () => {
const mockOctokit = {
rest: {
issues: {
removeLabel: jest.fn().mockResolvedValue({})
}
}
};
await removeLabel(mockOctokit, 'owner', 'repo', 123, mockLogger);
expect(mockOctokit.rest.issues.removeLabel).toHaveBeenCalledWith({
owner: 'owner',
repo: 'repo',
issue_number: 123,
name: LABEL_NAME
});
});
test('ignores 404 errors when label is not present', async () => {
const testLogger = {
log: jest.fn(),
error: jest.fn()
};
const mockOctokit = {
rest: {
issues: {
removeLabel: jest.fn().mockRejectedValue({ status: 404 })
}
}
};
await removeLabel(mockOctokit, 'owner', 'repo', 123, testLogger);
expect(testLogger.error).not.toHaveBeenCalled();
});
test('logs non-404 errors', async () => {
const mockOctokit = {
rest: {
issues: {
removeLabel: jest.fn().mockRejectedValue({ status: 500, message: 'Server error' })
}
}
};
await removeLabel(mockOctokit, 'owner', 'repo', 123, mockLogger);
expect(mockLogger.error).toHaveBeenCalled();
});
});
describe('hasBlockingComment', () => {
test('returns true if blocking comment exists', async () => {
const mockOctokit = {
rest: {
issues: {
listComments: jest.fn().mockResolvedValue({
data: [
{ body: 'Some other comment' },
{ body: 'This PR is currently **on hold**' }
]
})
}
}
};
const result = await hasBlockingComment(mockOctokit, 'owner', 'repo', 123);
expect(result).toBe(true);
});
test('returns false if blocking comment does not exist', async () => {
const mockOctokit = {
rest: {
issues: {
listComments: jest.fn().mockResolvedValue({
data: [
{ body: 'Some other comment' },
{ body: 'Another comment' }
]
})
}
}
};
const result = await hasBlockingComment(mockOctokit, 'owner', 'repo', 123);
expect(result).toBe(false);
});
});
describe('postBlockingComment', () => {
test('posts blocking comment if none exists', async () => {
const mockOctokit = {
rest: {
issues: {
listComments: jest.fn().mockResolvedValue({ data: [] }),
createComment: jest.fn().mockResolvedValue({})
}
}
};
await postBlockingComment(mockOctokit, 'owner', 'repo', 123, 'testuser', 2, 1, mockLogger);
expect(mockOctokit.rest.issues.createComment).toHaveBeenCalledWith({
owner: 'owner',
repo: 'repo',
issue_number: 123,
body: expect.stringContaining('This PR is currently **on hold**')
});
});
test('skips comment if blocking comment already exists', async () => {
const mockOctokit = {
rest: {
issues: {
listComments: jest.fn().mockResolvedValue({
data: [{ body: 'This PR is currently **on hold**' }]
}),
createComment: jest.fn()
}
}
};
await postBlockingComment(mockOctokit, 'owner', 'repo', 123, 'testuser', 2, 1, mockLogger);
expect(mockOctokit.rest.issues.createComment).not.toHaveBeenCalled();
});
});
describe('postUnblockingComment', () => {
test('always posts unblocking comment', async () => {
const mockOctokit = {
rest: {
issues: {
createComment: jest.fn().mockResolvedValue({})
}
}
};
await postUnblockingComment(mockOctokit, 'owner', 'repo', 123, 'testuser', 1, 2, mockLogger);
expect(mockOctokit.rest.issues.createComment).toHaveBeenCalledWith({
owner: 'owner',
repo: 'repo',
issue_number: 123,
body: expect.stringContaining('PR quota unlocked!')
});
});
});
describe('processQuotaForAuthor', () => {
test('blocks PRs exceeding quota for new contributor', async () => {
const mockOctokit = {
rest: {
pulls: {
list: jest.fn()
// Open PRs call
.mockResolvedValueOnce({
data: [
{
number: 1,
user: { login: 'newuser' },
state: 'open',
merged_at: null,
created_at: '2024-01-01T00:00:00Z',
labels: []
},
{
number: 2,
user: { login: 'newuser' },
state: 'open',
merged_at: null,
created_at: '2024-01-02T00:00:00Z',
labels: []
}
]
})
// Closed PRs call (no merged PRs found)
.mockResolvedValueOnce({ data: [] })
},
issues: {
getLabel: jest.fn().mockResolvedValue({ data: { name: LABEL_NAME } }),
addLabels: jest.fn().mockResolvedValue({}),
listComments: jest.fn().mockResolvedValue({ data: [] }),
createComment: jest.fn().mockResolvedValue({})
}
}
};
const result = await processQuotaForAuthor(mockOctokit, 'owner', 'repo', 'newuser', mockLogger);
expect(result.mergedCount).toBe(0);
expect(result.quota).toBe(1);
expect(result.openCount).toBe(2);
expect(result.results.blocked).toEqual([2]);
expect(result.results.unchanged).toEqual([1]);
});
test('unblocks PRs when quota becomes available', async () => {
const mockOctokit = {
rest: {
pulls: {
list: jest.fn()
// Open PRs call
.mockResolvedValueOnce({
data: [
{
number: 1,
user: { login: 'contributor' },
state: 'open',
merged_at: null,
created_at: '2024-01-01T00:00:00Z',
labels: []
},
{
number: 3,
user: { login: 'contributor' },
state: 'open',
merged_at: null,
created_at: '2024-01-03T00:00:00Z',
labels: [{ name: LABEL_NAME }]
}
]
})
// Closed PRs call (1 merged)
.mockResolvedValueOnce({
data: [
{
number: 2,
user: { login: 'contributor' },
merged_at: '2024-01-05T00:00:00Z'
}
]
})
},
issues: {
getLabel: jest.fn().mockResolvedValue({ data: { name: LABEL_NAME } }),
removeLabel: jest.fn().mockResolvedValue({}),
listComments: jest.fn().mockResolvedValue({ data: [] }),
createComment: jest.fn().mockResolvedValue({})
}
}
};
const result = await processQuotaForAuthor(mockOctokit, 'owner', 'repo', 'contributor', mockLogger);
expect(result.mergedCount).toBe(1);
expect(result.quota).toBe(2);
expect(result.openCount).toBe(2);
expect(result.results.unblocked).toEqual([3]);
});
test('processes PRs in order by creation date (oldest first)', async () => {
const mockOctokit = {
rest: {
pulls: {
list: jest.fn()
// Open PRs are already sorted by creation date from the API
.mockResolvedValueOnce({
data: [
{
number: 1,
user: { login: 'user' },
state: 'open',
merged_at: null,
created_at: '2024-01-01T00:00:00Z',
labels: []
},
{
number: 2,
user: { login: 'user' },
state: 'open',
merged_at: null,
created_at: '2024-01-02T00:00:00Z',
labels: []
},
{
number: 3,
user: { login: 'user' },
state: 'open',
merged_at: null,
created_at: '2024-01-03T00:00:00Z',
labels: []
}
]
})
// No merged PRs
.mockResolvedValueOnce({ data: [] })
},
issues: {
getLabel: jest.fn().mockResolvedValue({ data: { name: LABEL_NAME } }),
addLabels: jest.fn().mockResolvedValue({}),
listComments: jest.fn().mockResolvedValue({ data: [] }),
createComment: jest.fn().mockResolvedValue({})
}
}
};
const result = await processQuotaForAuthor(mockOctokit, 'owner', 'repo', 'user', mockLogger);
// First PR (oldest) should not be blocked, others should be
expect(result.results.unchanged).toEqual([1]);
expect(result.results.blocked).toEqual([2, 3]);
});
});
================================================
FILE: .github/scripts/waiting-for-author.js
================================================
module.exports = async ({github, context, core}) => {
const LABEL_NAME = 'waiting-for-author';
// Determine event type
const eventName = context.eventName;
// Get PR data
let prNumber;
let repoOwner;
let repoName;
if (eventName === 'issue_comment') {
prNumber = context.payload.issue.number;
repoOwner = context.repo.owner;
repoName = context.repo.repo;
} else if (eventName === 'pull_request_target') {
prNumber = context.payload.number;
repoOwner = context.repo.owner;
repoName = context.repo.repo;
} else {
core.info(`Unsupported event: ${eventName}`);
return;
}
// Fetch PR details to get the author
// We need to fetch the PR object because issue_comment payload doesn't always have full PR details (like author)
// correctly populated in a way that is identical to pull_request payload for our needs.
const { data: pr } = await github.rest.pulls.get({
owner: repoOwner,
repo: repoName,
pull_number: prNumber,
});
const prAuthor = pr.user.login;
if (eventName === 'issue_comment') {
const commenter = context.payload.comment.user.login;
// Logic:
// If Maintainer comments -> Add label (if not present)
// If Author comments -> Remove label (if present)
// Check if commenter is the author
if (commenter === prAuthor) {
core.info(`Comment by author ${commenter}. Removing label if present.`);
await removeLabel(github, repoOwner, repoName, prNumber, LABEL_NAME, core);
}
// Check if commenter is a maintainer (has write access)
else if (await isMaintainer(github, repoOwner, repoName, commenter, core)) {
core.info(`Comment by maintainer ${commenter}. Adding label if missing.`);
await addLabel(github, repoOwner, repoName, prNumber, LABEL_NAME, core);
} else {
core.info(`Comment by ${commenter} (not author or maintainer). No action taken.`);
}
} else if (eventName === 'pull_request_target') {
// This is the 'synchronize' event (push to PR branch)
// Logic:
// If Author pushes -> Remove label (UNLESS it's just an "Update branch" merge)
const sender = context.payload.sender.login;
if (sender !== prAuthor) {
core.info(`Push by ${sender}, not the PR author ${prAuthor}. Doing nothing.`);
return;
}
// Check if it's an "Update branch" commit
// We look at the commits in this push.
// context.payload.before and context.payload.after give us the range of commits.
// simpler approach: look at the head commit of the PR.
// Ideally we want to see if the content changed or if it was just a merge from base.
// A heuristic is to check the commit message or parents of the head commit.
// We'll fetch the commit details.
const headSha = context.payload.pull_request.head.sha;
const { data: commit } = await github.rest.repos.getCommit({
owner: repoOwner,
repo: repoName,
ref: headSha,
});
const message = commit.commit.message;
const parents = commit.parents;
// A merge commit typically has 2 parents.
// If it's a merge from the base branch (e.g. "Merge branch 'main' into ...")
// Note: GitHub's "Update branch" button creates a merge commit.
const isMergeCommit = parents.length > 1;
const isUpdateBranch = isMergeCommit && (
message.startsWith(`Merge branch '${context.payload.pull_request.base.ref}'`) ||
message.startsWith(`Merge remote-tracking branch 'origin/${context.payload.pull_request.base.ref}'`)
);
if (isUpdateBranch) {
core.info(`Push detected as 'Update branch' (Merge from base). Keeping label.`);
return;
}
core.info(`Push by author detected. Removing label.`);
await removeLabel(github, repoOwner, repoName, prNumber, LABEL_NAME, core);
}
};
async function addLabel(github, owner, repo, issueNumber, label, logger) {
try {
const { data: labels } = await github.rest.issues.listLabelsOnIssue({
owner,
repo,
issue_number: issueNumber,
});
if (labels.find(l => l.name === label)) {
logger.info(`Label '${label}' already exists.`);
return;
}
await github.rest.issues.addLabels({
owner,
repo,
issue_number: issueNumber,
labels: [label],
});
logger.info(`Added label '${label}'.`);
} catch (error) {
logger.error(`Error adding label: ${error.message}`);
}
}
async function removeLabel(github, owner, repo, issueNumber, label, logger) {
try {
const { data: labels } = await github.rest.issues.listLabelsOnIssue({
owner,
repo,
issue_number: issueNumber,
});
if (!labels.find(l => l.name === label)) {
logger.info(`Label '${label}' does not exist.`);
return;
}
await github.rest.issues.removeLabel({
owner,
repo,
issue_number: issueNumber,
name: label,
});
logger.info(`Removed label '${label}'.`);
} catch (error) {
// Ignore 404 if label not found (though check above should catch it)
logger.error(`Error removing label: ${error.message}`);
}
}
async function isMaintainer(github, owner, repo, username, logger) {
try {
const { data } = await github.rest.repos.getCollaboratorPermissionLevel({
owner,
repo,
username,
});
// Based on gh api logic: .permissions.maintain==true or .permissions.admin==true or .permissions.push==true
// getCollaboratorPermissionLevel returns a 'permission' field which describes the permission level.
// Levels: 'admin', 'maintain', 'write', 'triage', 'read', 'none'
// We want 'admin', 'maintain', or 'write'.
const permission = data.permission;
return ['admin', 'maintain', 'write'].includes(permission);
} catch (error) {
logger.error(`Error checking permissions for ${username}: ${error.message}`);
return false;
}
}
================================================
FILE: .github/workflows/README.md
================================================
# CI Workflows
This directory contains GitHub Actions workflows for the Jaeger project. The workflows are organized into a staged architecture to optimize CI resource usage and provide fail-fast behavior.
## Architecture Overview
The CI system uses a **Forked DAG (Directed Acyclic Graph)** orchestrated by `ci-orchestrator.yml`. The orchestrator supports two execution paths based on the context of the run:
- **Sequential path (~30m)**: Default for external contributors. Stage 1 must pass before Stage 2, and Stage 2 must pass before Stage 3. Provides fail-fast behavior that saves resources when linting or unit tests fail.
- **Parallel path (~10m)**: For trusted maintainers, merge queue, and main branch builds. All three stages start simultaneously after a setup step.
### CI Orchestrator
The main entry point for PR and branch CI is **`ci-orchestrator.yml`**, which:
1. Runs a **`setup`** job to determine the execution mode (parallel or sequential)
2. Triggers either the sequential or parallel path based on the result
#### Setup Job: Execution Mode Detection
The `setup` job determines whether to use parallel execution based on these **OR** conditions:
| Condition | Rationale |
|-----------|-----------|
| Push to `main` branch | Already merged, fully trusted |
| `merge_group` event | Merge Queue entry, high confidence |
| PR author is an org member (`MEMBER` or `OWNER`) | Trusted maintainer |
| PR author login is `dependabot[bot]` or `renovate-bot` | Dependency automation bots |
| PR has the `ci:parallel` label | Explicit opt-in |
#### Stage Workflows (DRY Encapsulation)
Each stage is encapsulated in a reusable "stage" workflow:
- **ci-orchestrator-stage1.yml** - Stage 1 workflows (Linters only — fast fail-fast gate)
- **ci-orchestrator-stage2.yml** - Stage 2 workflows (Unit Tests)
- **ci-orchestrator-stage3.yml** - Stage 3 workflows (Docker, E2E, Binaries, Static Analysis)
This avoids duplication: both the sequential and parallel paths call the same stage workflows.
#### Stage 1: Fast Gate (Linters only)
- **ci-lint-checks.yaml** - Go linting, DCO checks, generated files validation, shell script linting
#### Stage 2: Unit Tests
- **ci-unit-tests.yml** - Full unit test suite with coverage
#### Stage 3: Expensive Checks & Static Analysis
Executes in parallel within the stage:
- **ci-build-binaries.yml** - Multi-platform binary builds
- **ci-docker-build.yml** - Docker images for all components
- **ci-docker-all-in-one.yml** - All-in-one Docker image
- **ci-docker-hotrod.yml** - HotROD demo application image
- **ci-e2e-all.yml** - E2E test suite orchestrator (calls individual E2E workflows)
- **ci-e2e-spm.yml** - Service Performance Monitoring tests
- **ci-e2e-tailsampling.yml** - Tail sampling processor tests
- **codeql.yml** - Security scanning with CodeQL
- **dependency-review.yml** - Dependency vulnerability checks
- **fossa.yml** - License compliance scanning
#### Gatekeeper Job
The orchestrator includes a final **`ci-success`** job that:
- Runs after all stage jobs (regardless of which path was taken)
- Determines which path was used and validates its results
- Should be used as the required status check in GitHub branch protection rules
### Execution Flow Diagram
```
┌─────────┐
│ setup │
└────┬────┘
parallel=false │ parallel=true
┌──────────────────┴──────────────────┐
│ Sequential Path │ Parallel Path
│ │
┌────▼──────┐ ┌────────────┼────────────┐
│ stage1-seq│ │ │ │
└────┬──────┘ ┌────▼───┐ ┌────▼───┐ ┌────▼───┐
│ │stage1- │ │stage2- │ │stage3- │
┌────▼──────┐ │ fast │ │ fast │ │ fast │
│ stage2-seq│ └────┬───┘ └────┬───┘ └────┬───┘
└────┬──────┘ │ │ │
│ └────────────┴───────────┘
┌────▼──────┐ │
│ stage3-seq│ │
└────┬──────┘ │
└──────────────────┬──────────────────┘
┌────▼────┐
│ci-success│
└─────────┘
```
### Concurrency Control
The orchestrator manages concurrency centrally:
```yaml
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
```
This allows a single "kill-switch" to cancel older runs when new commits are pushed to a PR.
### Permissions Model
The orchestrator uses `permissions: write-all` to allow maximum flexibility for child workflows:
```yaml
permissions: write-all
```
This grants broad permissions at the orchestrator level, allowing child workflows to request the specific permissions they need. Child workflows then apply the principle of least privilege by downgrading to only the permissions they require:
- **codeql.yml**: `security-events: write`, `actions: read` (for security scanning)
- **ci-unit-tests.yml**: `checks: write` (for reporting test results)
- **ci-docker-all-in-one.yml**: `packages: read` (for pulling from GHCR)
- Other workflows: typically `contents: read` only
**Why write-all?** When using `workflow_call`, GitHub Actions requires the caller workflow to grant permissions that called workflows can then use or downgrade. Without `write-all`, child workflows would be restricted to `contents: read` only, causing failures for workflows that need additional permissions like CodeQL or test reporting.
## Independent Workflows
The following workflows operate independently and are **not** part of the orchestrator:
### Release & Deployment
- **ci-release.yml** - Triggered on release events to build and publish artifacts
- **ci-deploy-demo.yml** - Scheduled/manual deployment to demo environment
### Automated Checks
- **ci-summary-report.yml** - Fan-in workflow triggered after CI Orchestrator completes; posts a consolidated PR comment with performance metrics comparison and code coverage gating (see `docs/adr/004-migrating-coverage-gating-to-github-actions.md`)
- **label-check.yml** - Verifies PR labels
- **pr-quota-manager.yml** - PR management automation
- **dco_merge_group.yml** - DCO verification for merge groups
### Scheduled Maintenance
- **stale.yml** - Marks and closes stale issues/PRs
- **waiting-for-author.yml** - PR status management
- **scorecard.yml** - Security scorecard scanning
### Special Cases
- **ci-unit-tests-go-tip.yml** - Tests against Go development version (runs on main or when workflow modified)
- **codeql.yml** - Also runs on schedule (weekly) in addition to being called by orchestrator
## E2E Test Workflows
Individual E2E test workflows are called by `ci-e2e-all.yml`:
- ci-e2e-badger.yaml
- ci-e2e-cassandra.yml
- ci-e2e-clickhouse.yml
- ci-e2e-elasticsearch.yml
- ci-e2e-grpc.yml
- ci-e2e-kafka.yml
- ci-e2e-memory.yaml
- ci-e2e-opensearch.yml
- ci-e2e-query.yml
These workflows use `workflow_call` only and don't have independent triggers.
## Branch Protection
To require CI checks before merging, configure branch protection to require:
- **CI Orchestrator / ci-success** - This single check represents the entire CI pipeline
This is much simpler than requiring 10+ individual workflow checks.
## Local Development
Individual workflows can still be triggered manually via the GitHub Actions UI for testing or debugging purposes. However, on PR events, only the orchestrator runs to avoid duplicate work.
## Benefits
1. **Reduced Feedback Loop**: Trusted contributors get ~10m feedback instead of ~30m
2. **Fail-Fast for External Contributors**: Expensive checks only run after cheaper ones pass, saving resources
3. **Simplified Branch Protection**: Single `ci-success` check represents the entire CI pipeline
4. **Centralized Concurrency Control**: Single kill-switch via `cancel-in-progress: true`
5. **DRY Stage Workflows**: Both execution paths reuse the same `ci-orchestrator-stage*.yml` workflows
6. **Maintainability**: Individual child workflows remain decoupled and independently testable
================================================
FILE: .github/workflows/ci-build-binaries.yml
================================================
name: Build binaries
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions:
contents: read
jobs:
generate-matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- name: define matrix
id: set-matrix
run: |
echo "matrix=$(bash scripts/utils/platforms-to-gh-matrix.sh)" >> $GITHUB_OUTPUT
build-binaries:
needs: generate-matrix
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix: ${{fromJson(needs.generate-matrix.outputs.matrix)}}
name: build-binaries-${{ matrix.os }}-${{ matrix.arch }}
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: true
- name: Fetch git tags
run: |
git fetch --prune --unshallow --tags
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Setup Node.js version
uses: ./.github/actions/setup-node.js
- name: Install tools
run: make install-ci
- name: Build platform binaries
run: make build-binaries-${{ matrix.os }}-${{ matrix.arch }}
env:
# Skip debug binaries on PRs to save CI time (4+ min per arch)
# Debug binaries are still built on main branch and during releases
SKIP_DEBUG_BINARIES: ${{ github.event_name == 'pull_request' && '1' || '0' }}
================================================
FILE: .github/workflows/ci-deploy-demo.yml
================================================
name: Deploy Jaeger Demo to OKE
on:
schedule:
- cron: '0 13 * * *' # Daily at 8:00 AM US Eastern Time (ET)
workflow_dispatch:
permissions: read-all
jobs:
deploy:
name: Deploy Jaeger to OKE Cluster
runs-on: ubuntu-latest
env:
OCI_CLI_USER: ${{ secrets.OCI_CLI_USER }}
OCI_CLI_TENANCY: ${{ secrets.OCI_CLI_TENANCY }}
OCI_CLI_FINGERPRINT: ${{ secrets.OCI_CLI_FINGERPRINT }}
OCI_CLI_KEY_CONTENT: ${{ secrets.OCI_CLI_KEY_CONTENT }}
OCI_CLI_REGION: ${{ secrets.OCI_CLI_REGION }}
steps:
- name: Configure kubectl with OKE
uses: oracle-actions/configure-kubectl-oke@77a733d79446dabe7bf0e58eb56197d33ce4dc58 # v1.5.0
with:
cluster: ${{ secrets.OKE_CLUSTER_OCID }}
enablePrivateEndpoint: false
- name: Install Helm
uses: azure/setup-helm@b9e51907a09c216f16ebe8536097933489208112 # v4
- name: Checkout jaeger repository
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
- name: Deploy using appropriate script
run: |
if [ "${{ github.event_name }}" = "schedule" ]; then
echo "🕒 Scheduled run - using deploy-all.sh (upgrade mode)"
bash ./examples/oci/deploy-all.sh
else
echo "🔄 Manual run - using deploy-all.sh with clean mode (uninstall/install)"
bash ./examples/oci/deploy-all.sh clean
fi
- name: Send detailed Slack notification on failure
if: failure()
uses: rtCamp/action-slack-notify@4e5fb42d249be6a45a298f3c9543b111b02f7907 # v2.3.0
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_CHANNEL: '#jaeger-operations'
SLACK_COLOR: danger
SLACK_USERNAME: 'Jaeger CI Bot'
SLACK_ICON_EMOJI: ':warning:'
SLACK_TITLE: '🚨 Jaeger OKE Deployment Failed'
SLACK_MESSAGE: |
*Repository:* ${{ github.repository }}
*Workflow:* ${{ github.workflow }}
*Run ID:* ${{ github.run_id }}
*Trigger:* ${{ github.event_name }}
*Actor:* ${{ github.actor }}
<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|🔗 View Failed Run>
SLACK_FOOTER: 'Jaeger CI/CD Pipeline'
================================================
FILE: .github/workflows/ci-docker-all-in-one.yml
================================================
name: Build all-in-one
on:
workflow_call:
permissions:
contents: read
packages: read # This allows the runner to pull from GHCR
jobs:
all-in-one:
runs-on: ubuntu-latest
timeout-minutes: 30 # max + 3*std over the last 2600 runs
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: true
- name: Fetch git tags
run: git fetch --prune --unshallow --tags
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Log in to GHCR
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: ./.github/actions/setup-node.js
- uses: ./.github/actions/setup-branch
- run: make install-ci
- uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
- name: Define BUILD_FLAGS var if running on a Pull Request or Merge Queue
run: |
case ${GITHUB_EVENT_NAME} in
pull_request|merge_group)
echo "BUILD_FLAGS=-l -p linux/$(go env GOARCH)" >> ${GITHUB_ENV}
;;
*)
echo "BUILD_FLAGS=" >> ${GITHUB_ENV}
;;
esac
- name: Build, test, and publish all-in-one image
run: |
bash scripts/build/build-all-in-one-image.sh ${{ env.BUILD_FLAGS }} v2
env:
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
QUAY_TOKEN: ${{ secrets.QUAY_TOKEN }}
================================================
FILE: .github/workflows/ci-docker-build.yml
================================================
name: Build docker images
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions:
contents: read
jobs:
docker-images:
runs-on: ubuntu-latest
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: true
- name: Fetch git tags
run: git fetch --prune --unshallow --tags
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- uses: ./.github/actions/setup-node.js
- uses: ./.github/actions/setup-branch
- run: make install-ci
- uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
- name: Build only linux/amd64 container images for a Pull Request
if: github.ref_name != 'main'
# -D disables images with debugger
run: bash scripts/build/build-upload-docker-images.sh -D -p linux/amd64
- name: Build and upload all container images
if: github.ref_name == 'main'
run: bash scripts/build/build-upload-docker-images.sh
env:
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
QUAY_TOKEN: ${{ secrets.QUAY_TOKEN }}
================================================
FILE: .github/workflows/ci-docker-hotrod.yml
================================================
name: CIT Hotrod
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions:
contents: read
jobs:
hotrod:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
runtime: [docker, k8s]
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: true
- name: Fetch git tags
run: |
git fetch --prune --unshallow --tags
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- uses: ./.github/actions/setup-node.js
- uses: ./.github/actions/setup-branch
- uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
- name: Define BUILD_FLAGS var if running on a Pull Request
run: |
case ${GITHUB_EVENT_NAME} in
pull_request)
echo "BUILD_FLAGS=-l -p linux/amd64" >> ${GITHUB_ENV}
;;
*)
echo "BUILD_FLAGS=" >> ${GITHUB_ENV}
;;
esac
- name: Install kubectl
if: matrix.runtime == 'k8s'
uses: azure/setup-kubectl@3e0aec4d80787158d308d7b364cb1b702e7feb7f # v4
with:
version: 'latest'
- name: Create k8s Kind Cluster
if: matrix.runtime == 'k8s'
uses: helm/kind-action@a1b0e391336a6ee6713a0583f8c6240d70863de3 # v1
- name: Build, test, and publish hotrod image
run: bash scripts/build/build-hotrod-image.sh ${{ env.BUILD_FLAGS }} -r ${{ matrix.runtime }}
env:
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
QUAY_TOKEN: ${{ secrets.QUAY_TOKEN }}
================================================
FILE: .github/workflows/ci-e2e-all.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# Fan-out workflow that invokes all individual E2E integration test workflows
# for every supported storage backend and feature.
name: E2E Tests
on:
workflow_call:
permissions:
contents: read
jobs:
badger:
uses: ./.github/workflows/ci-e2e-badger.yaml
cassandra:
uses: ./.github/workflows/ci-e2e-cassandra.yml
elasticsearch:
uses: ./.github/workflows/ci-e2e-elasticsearch.yml
grpc:
uses: ./.github/workflows/ci-e2e-grpc.yml
kafka:
uses: ./.github/workflows/ci-e2e-kafka.yml
memory:
uses: ./.github/workflows/ci-e2e-memory.yaml
opensearch:
uses: ./.github/workflows/ci-e2e-opensearch.yml
query:
uses: ./.github/workflows/ci-e2e-query.yml
clickhouse:
uses: ./.github/workflows/ci-e2e-clickhouse.yml
spm:
uses: ./.github/workflows/ci-e2e-spm.yml
tailsampling:
uses: ./.github/workflows/ci-e2e-tailsampling.yml
================================================
FILE: .github/workflows/ci-e2e-badger.yaml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# Integration tests for Badger (embedded key-value store) storage backend.
# direct: classic tests at the storage API layer, directly instantiating the storage implementation.
# e2e: multi-process E2E tests via the trace ingestion and query APIs.
name: CIT Badger
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
badger:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
storage_test: [direct, e2e]
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Run Badger storage integration tests
env:
# Short interval so metricsCopier fires within the test duration.
# Propagated to the Jaeger subprocess via PropagateEnvVars in badger_test.go.
BADGER_METRICS_UPDATE_INTERVAL: 1s
run: |
case ${{ matrix.storage_test }} in
direct)
make badger-storage-integration-test
;;
e2e)
STORAGE=badger make jaeger-v2-storage-integration-test
;;
esac
- uses: ./.github/actions/verify-metrics-snapshot
if: matrix.storage_test == 'e2e'
with:
snapshot: metrics_snapshot_badger
artifact_key: metrics_snapshot_badger_${{ matrix.storage_test }}
- name: Upload coverage to codecov
uses: ./.github/actions/upload-codecov
with:
files: cover.out
flag: badger_${{ matrix.storage_test }}
================================================
FILE: .github/workflows/ci-e2e-cassandra.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# Integration tests for Cassandra storage backend, covering multiple Cassandra
# major versions, schema versions, and both manual and auto schema creation.
# direct: classic tests at the storage API layer, directly instantiating the storage implementation.
# e2e: multi-process E2E tests via the trace ingestion and query APIs.
name: CIT Cassandra
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
cassandra:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
storage_test: [direct, e2e]
create-schema: [manual, auto]
version:
- distribution: cassandra
major: 4.x
schema: v004
- distribution: cassandra
major: 5.x
schema: v004
exclude:
# Exclude direct as creating schema on startup is only available in e2e mode
- storage_test: direct
create-schema: auto
name: ${{ matrix.version.distribution }}-${{ matrix.version.major }} ${{ matrix.storage_test }} schema=${{ matrix.create-schema }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Run cassandra integration tests
id: test-execution
run: bash scripts/e2e/cassandra.sh ${{ matrix.version.major }} ${{ matrix.version.schema }} ${{ matrix.storage_test }}
env:
SKIP_APPLY_SCHEMA: ${{ matrix.create-schema == 'auto' && true || false }}
- uses: ./.github/actions/verify-metrics-snapshot
if: matrix.storage_test == 'e2e'
with:
snapshot: metrics_snapshot_cassandra
artifact_key: metrics_snapshot_cassandras_${{ matrix.version.major }}_${{ matrix.version.schema }}_${{ matrix.storage_test }}_${{ matrix.create-schema }}
- name: Upload coverage to codecov
uses: ./.github/actions/upload-codecov
with:
files: cover.out
flag: cassandra-${{ matrix.version.major }}-${{ matrix.storage_test }}-${{ matrix.create-schema }}
================================================
FILE: .github/workflows/ci-e2e-clickhouse.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# E2E integration tests for ClickHouse storage backend (Jaeger v2 only).
name: CIT ClickHouse
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
clickhouse:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Run ClickHouse integration tests
id: test-execution
run: bash scripts/e2e/clickhouse.sh
- uses: ./.github/actions/verify-metrics-snapshot
with:
snapshot: metrics_snapshot_clickhouse
artifact_key: metrics_snapshot_clickhouse
- name: Upload coverage to codecov
uses: ./.github/actions/upload-codecov
with:
files: cover.out
flag: clickhouse
================================================
FILE: .github/workflows/ci-e2e-elasticsearch.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# Integration tests for Elasticsearch storage backend, covering major versions 6.x through 9.x.
# direct: classic tests at the storage API layer, directly instantiating the storage implementation.
# e2e: multi-process E2E tests via the trace ingestion and query APIs.
name: CIT Elasticsearch
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
elasticsearch:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
version:
- major: 6.x
distribution: elasticsearch
storage_test: direct
- major: 7.x
distribution: elasticsearch
storage_test: direct
- major: 8.x
distribution: elasticsearch
storage_test: direct
- major: 8.x
distribution: elasticsearch
storage_test: e2e
- major: 9.x
distribution: elasticsearch
storage_test: e2e
name: ${{ matrix.version.distribution }} ${{ matrix.version.major }} ${{ matrix.version.storage_test }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: true
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: time settings
run: |
date
echo TZ="$TZ"
- uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
- name: Run ${{ matrix.version.distribution }} integration tests
id: test-execution
run: bash scripts/e2e/elasticsearch.sh ${{ matrix.version.distribution }} ${{ matrix.version.major }} ${{ matrix.version.storage_test }}
- uses: ./.github/actions/verify-metrics-snapshot
if: matrix.version.storage_test == 'e2e'
with:
snapshot: metrics_snapshot_elasticsearch
artifact_key: metrics_snapshot_elasticsearch_${{ matrix.version.major }}_${{ matrix.version.storage_test }}
- name: Upload coverage to codecov
uses: ./.github/actions/upload-codecov
with:
files: cover.out,cover-index-cleaner.out,cover-index-rollover.out
flag: ${{ matrix.version.distribution }}-${{ matrix.version.major }}-${{ matrix.version.storage_test }}
================================================
FILE: .github/workflows/ci-e2e-grpc.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# Integration tests for the gRPC remote storage plugin interface.
# direct: classic tests at the storage API layer, directly instantiating the storage implementation.
# e2e: multi-process E2E tests via the trace ingestion and query APIs.
name: CIT gRPC
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
grpc:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
storage_test: [direct, e2e]
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Run gRPC storage integration tests
run: |
case ${{ matrix.storage_test }} in
direct)
SPAN_STORAGE_TYPE=memory make grpc-storage-integration-test
;;
e2e)
STORAGE=grpc make jaeger-v2-storage-integration-test
;;
esac
- uses: ./.github/actions/verify-metrics-snapshot
if: matrix.storage_test == 'e2e'
with:
snapshot: metrics_snapshot_grpc
artifact_key: metrics_snapshot_grpc_${{ matrix.storage_test }}
- name: Upload coverage to codecov
uses: ./.github/actions/upload-codecov
with:
files: cover.out
flag: grpc_${{ matrix.storage_test }}
================================================
FILE: .github/workflows/ci-e2e-kafka.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# E2E integration tests for Kafka as a span ingestion buffer (Jaeger v2),
# verifying the Collector → Kafka → Ingester pipeline.
name: CIT Kafka
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
kafka:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
kafka-version: ["3.x"]
name: kafka ${{ matrix.kafka-version }} v2
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Run kafka integration tests
id: test-execution
run: bash scripts/e2e/kafka.sh -v ${{ matrix.kafka-version }}
- uses: ./.github/actions/verify-metrics-snapshot
with:
snapshot: metrics_snapshot_kafka
artifact_key: metrics_snapshot_kafka_v2
- name: Upload coverage to codecov
uses: ./.github/actions/upload-codecov
with:
files: cover.out
flag: kafka-${{ matrix.kafka-version }}-v2
================================================
FILE: .github/workflows/ci-e2e-memory.yaml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# E2E integration tests for the in-memory storage backend (Jaeger v2).
name: CIT Memory
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
memory-v2:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Run Memory storage integration tests
run: |
STORAGE=memory_v2 make jaeger-v2-storage-integration-test
- uses: ./.github/actions/verify-metrics-snapshot
with:
snapshot: metrics_snapshot_memory
artifact_key: metrics_snapshot_memory
- name: Upload coverage to codecov
uses: ./.github/actions/upload-codecov
with:
files: cover.out
flag: memory_v2
================================================
FILE: .github/workflows/ci-e2e-opensearch.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# Integration tests for OpenSearch storage backend, covering major versions 1.x through 3.x.
# direct: classic tests at the storage API layer, directly instantiating the storage implementation.
# e2e: multi-process E2E tests via the trace ingestion and query APIs.
name: CIT OpenSearch
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
opensearch:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
version:
- major: 1.x
distribution: opensearch
storage_test: direct
- major: 2.x
distribution: opensearch
storage_test: direct
- major: 2.x
distribution: opensearch
storage_test: e2e
- major: 3.x
distribution: opensearch
storage_test: e2e
name: ${{ matrix.version.distribution }} ${{ matrix.version.major }} ${{ matrix.version.storage_test }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: true
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
- name: Run ${{ matrix.version.distribution }} integration tests
id: test-execution
run: bash scripts/e2e/elasticsearch.sh ${{ matrix.version.distribution }} ${{ matrix.version.major }} ${{ matrix.version.storage_test }}
- uses: ./.github/actions/verify-metrics-snapshot
if: matrix.version.storage_test == 'e2e'
with:
snapshot: metrics_snapshot_opensearch
artifact_key: metrics_snapshot_opensearch_${{ matrix.version.major }}
- name: Upload coverage to codecov
uses: ./.github/actions/upload-codecov
with:
files: cover.out,cover-index-cleaner.out,cover-index-rollover.out
flag: ${{ matrix.version.distribution }}-${{ matrix.version.major }}-${{ matrix.version.storage_test }}
================================================
FILE: .github/workflows/ci-e2e-query.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# E2E integration tests for a two-process deployment topology:
# - collector (config-remote-storage-backend.yaml): receives OTLP traces,
# writes to in-memory storage, exposes it via the remote_storage gRPC extension.
# - query (config-query.yaml): no ingestion pipeline, serves the query API
# by reading from the collector's remote_storage gRPC endpoint.
name: CIT Query
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
query:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Run Memory storage integration tests
run: |
STORAGE=query make jaeger-v2-storage-integration-test
- name: Upload coverage to codecov
uses: ./.github/actions/upload-codecov
with:
files: cover.out
flag: query
================================================
FILE: .github/workflows/ci-e2e-spm.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# E2E integration tests for Service Performance Monitoring (SPM), verifying
# that span metrics are correctly derived and served via the metrics API,
# with Prometheus, Elasticsearch, and OpenSearch as the metrics store.
name: Test SPM
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions:
contents: read
jobs:
spm:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
mode:
- name: v2
metricstore: prometheus
- name: v2 with ES
metricstore: elasticsearch
- name: v2 with OS
metricstore: opensearch
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: true
- name: Fetch git tags
run: |
git fetch --prune --unshallow --tags
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Setup Node.js version
uses: ./.github/actions/setup-node.js
- name: Run SPM Test
run: bash scripts/e2e/spm.sh -m ${{ matrix.mode.metricstore }}
================================================
FILE: .github/workflows/ci-e2e-tailsampling.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# E2E integration tests for the tail-based sampling processor, verifying
# that sampling decisions are applied correctly after collecting full traces.
name: Test Tail Sampling Processor
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
tailsampling-processor:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Run Tail Sampling Processor Integration Test
run: |
make tail-sampling-integration-test
- name: Upload coverage to codecov
uses: ./.github/actions/upload-codecov
with:
files: cover.out
flag: tailsampling-processor
================================================
FILE: .github/workflows/ci-lint-checks.yaml
================================================
name: Lint Checks
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after a couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Print Jaeger version for no reason
run: make echo-version
- run: make install-test-tools
- run: make lint
pull-request-preconditions:
runs-on: ubuntu-latest
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after a couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: ./.github/actions/block-pr-from-main-branch
- run: |
git fetch origin main
make lint-nocommit
dco-check:
runs-on: ubuntu-latest
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after a couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- name: Set up Python 3.x for DCO check
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: '3.x'
- name: Run DCO check
if: ${{ github.event.pull_request.user.login != 'dependabot' && github.event_name != 'merge_group' }}
run: python3 scripts/lint/dco_check.py -b main -v --exclude-pattern '@users\.noreply\.github\.com'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
idl-version-check:
runs-on: ubuntu-latest
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: recursive
fetch-tags: true
- name: check jaeger-idl versions across git submodule and go.mod dependency
run: make lint-jaeger-idl-versions
generated-files-check:
runs-on: ubuntu-latest
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: recursive
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Verify Protobuf types are up to date
run: make proto && { if git status --porcelain | grep '??'; then exit 1; else git diff --name-status --exit-code; fi }
- name: Verify Mockery types are up to date
run: make generate-mocks && { if git status --porcelain | grep '??'; then exit 1; else git diff --name-status --exit-code; fi }
lint-shell-scripts:
runs-on: ubuntu-latest
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- run: sudo apt-get install shellcheck
- run: shellcheck scripts/**/*.sh
- name: Install shunit2 for shell unit tests
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
repository: kward/shunit2
path: .tools/shunit2
- name: Run unit tests for scripts
run: |
SHUNIT2=.tools/shunit2 bash scripts/utils/run-tests.sh
binary-size-check:
runs-on: ubuntu-latest
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: true
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Setup Node.js version
uses: ./.github/actions/setup-node.js
- name: Build jaeger binary
run: make build-jaeger
- name: Calculate jaeger binary size
run: |
TOTAL_SIZE=$(du -sb ./cmd/jaeger/jaeger-linux-amd64 | cut -f1)
echo "$TOTAL_SIZE" > ./new_jaeger_binary_size.txt
echo "Total binary size: $TOTAL_SIZE bytes"
- name: Restore previous binary size
id: cache-binary-size
uses: actions/cache/restore@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1
with:
path: ./jaeger_binary_size.txt
key: jaeger_binary_size
restore-keys: |
jaeger_binary_size
- name: Compare `jaeger` binary sizes
if: ${{ (steps.cache-binary-size.outputs.cache-matched-key != '') && ((github.event_name != 'push') || (github.ref != 'refs/heads/main')) }}
run: |
set -euf -o pipefail
OLD_BINARY_SIZE=$(cat ./jaeger_binary_size.txt)
NEW_BINARY_SIZE=$(cat ./new_jaeger_binary_size.txt)
printf "Previous binary size: %'d bytes\n" $OLD_BINARY_SIZE
printf "New binary size: %'d bytes\n" $NEW_BINARY_SIZE
PERCENTAGE_CHANGE=$(echo "scale=2; ($NEW_BINARY_SIZE - $OLD_BINARY_SIZE) * 100 / $OLD_BINARY_SIZE" | bc)
if (( $(echo "$PERCENTAGE_CHANGE > 2.0" | bc) == 1 )); then
echo "❌ binary size increased by more than 2% ($PERCENTAGE_CHANGE%)"
exit 1
else
echo "✅ binary size change is within acceptable range ($PERCENTAGE_CHANGE%)"
fi
- name: Remove previous *_binary_*.txt
run: |
rm -rf ./jaeger_binary_size.txt
mv ./new_jaeger_binary_size.txt ./jaeger_binary_size.txt
- name: Save new jaeger binary size
if: ${{ (github.event_name == 'push') && (github.ref == 'refs/heads/main') }}
uses: actions/cache/save@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1
with:
path: ./jaeger_binary_size.txt
key: jaeger_binary_size_${{ github.run_id }}
validate-renovate-config:
runs-on: ubuntu-latest
steps:
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: false
- name: validate renovate config
run: |
docker run \
-v $PWD/renovate.json:/usr/src/app/renovate.json \
ghcr.io/renovatebot/renovate:latest \
renovate-config-validator
================================================
FILE: .github/workflows/ci-orchestrator-stage1.yml
================================================
name: "CI Orchestrator: Stage 1 (Linters)"
on:
workflow_call:
jobs:
lint-checks:
uses: ./.github/workflows/ci-lint-checks.yaml
secrets: inherit
================================================
FILE: .github/workflows/ci-orchestrator-stage2.yml
================================================
name: "CI Orchestrator: Stage 2 (Unit Tests)"
on:
workflow_call:
jobs:
unit-tests:
uses: ./.github/workflows/ci-unit-tests.yml
secrets: inherit
================================================
FILE: .github/workflows/ci-orchestrator-stage3.yml
================================================
name: "CI Orchestrator: Stage 3 (Docker, E2E, Binaries, Static Analysis)"
on:
workflow_call:
jobs:
build-binaries:
uses: ./.github/workflows/ci-build-binaries.yml
secrets: inherit
docker-build:
uses: ./.github/workflows/ci-docker-build.yml
secrets: inherit
docker-all-in-one:
uses: ./.github/workflows/ci-docker-all-in-one.yml
secrets: inherit
docker-hotrod:
uses: ./.github/workflows/ci-docker-hotrod.yml
secrets: inherit
e2e-tests:
uses: ./.github/workflows/ci-e2e-all.yml
secrets: inherit
codeql:
uses: ./.github/workflows/codeql.yml
secrets: inherit
dependency-review:
uses: ./.github/workflows/dependency-review.yml
secrets: inherit
fossa:
uses: ./.github/workflows/fossa.yml
secrets: inherit
================================================
FILE: .github/workflows/ci-orchestrator.yml
================================================
name: CI Orchestrator
on:
pull_request:
branches: [main]
push:
branches: [main]
merge_group:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
# Grant all permissions to allow child workflows to request what they need
# Child workflows can downgrade permissions as needed (principle of least privilege)
permissions: write-all
jobs:
# ============================================================================
# SETUP: Determine execution mode (sequential vs parallel)
# Parallel mode is used for trusted actors to reduce feedback loop from ~30m to ~10m.
# ============================================================================
setup:
runs-on: ubuntu-latest
outputs:
parallel: ${{ steps.mode.outputs.parallel }}
steps:
- name: Determine execution mode
id: mode
run: |
PARALLEL=false
# Parallel for push to main
if [[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" == "refs/heads/main" ]]; then
echo "Parallel: push to main"
PARALLEL=true
else
echo "Not triggered by push to main (event=${{ github.event_name }}, ref=${{ github.ref }})"
fi
# Parallel for merge queue
if [[ "${{ github.event_name }}" == "merge_group" ]]; then
echo "Parallel: merge_group event"
PARALLEL=true
else
echo "Not a merge_group event (event=${{ github.event_name }})"
fi
# PR-specific checks (org membership, labels, and PR author login are only meaningful on pull_request events)
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
# Parallel for org members.
# Use a live API call because author_association from the event payload is
# unreliable — it reports CONTRIBUTOR for org members who don't have direct
# repo access via a team. Fall back to author_association when the API call
# fails (e.g. insufficient token permissions for fork PRs).
PR_AUTHOR="${{ github.event.pull_request.user.login }}"
AUTHOR_ASSOC="${{ github.event.pull_request.author_association }}"
if gh api --silent "orgs/jaegertracing/members/$PR_AUTHOR" 2>/dev/null; then
echo "Parallel: org member ($PR_AUTHOR, verified via API)"
PARALLEL=true
elif [[ "$AUTHOR_ASSOC" == "MEMBER" || "$AUTHOR_ASSOC" == "OWNER" ]]; then
echo "Parallel: org member ($PR_AUTHOR, author_association=$AUTHOR_ASSOC)"
PARALLEL=true
else
echo "Not an org member ($PR_AUTHOR, author_association=$AUTHOR_ASSOC)"
fi
# Parallel for known bots (dependency update automation)
if [[ "$PR_AUTHOR" == "dependabot[bot]" || "$PR_AUTHOR" == "renovate-bot" ]]; then
echo "Parallel: bot PR author ($PR_AUTHOR)"
PARALLEL=true
else
echo "Not a known bot (PR author=$PR_AUTHOR)"
fi
# Parallel if the ci:parallel label is applied to the PR.
# NOTE: re-running jobs does not refresh the event payload; a new run is needed
# to pick up labels added after the workflow was first triggered.
PR_LABELS="${{ join(github.event.pull_request.labels.*.name, ', ') }}"
echo "PR labels: ${PR_LABELS:-<none>}"
if [[ "${{ contains(github.event.pull_request.labels.*.name, 'ci:parallel') }}" == "true" ]]; then
echo "Parallel: ci:parallel label found"
PARALLEL=true
else
echo "ci:parallel label not found in: ${PR_LABELS:-<none>}"
fi
else
echo "Not a pull_request event — skipping PR-specific checks"
fi
echo "parallel=$PARALLEL" >> "$GITHUB_OUTPUT"
echo "Execution mode: parallel=$PARALLEL"
# ============================================================================
# SCRIPTS UNIT TESTS: Fast, independent job for .github/scripts/ Jest suite.
# ============================================================================
ci-scripts:
name: CI Scripts Unit Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: '24'
cache: 'npm'
cache-dependency-path: .github/scripts/package-lock.json
- name: Install Node dependencies (retry on transient registry failures)
working-directory: .github/scripts
run: |
set -euo pipefail
npm config set fetch-retries 5
npm config set fetch-retry-mintimeout 20000
npm config set fetch-retry-maxtimeout 120000
attempts=3
for i in $(seq 1 "$attempts"); do
echo "npm ci attempt $i/$attempts"
if npm ci; then
exit 0
fi
if [ "$i" -lt "$attempts" ]; then
sleep_time=$((i * 15))
echo "npm ci failed, retrying in ${sleep_time}s"
sleep "$sleep_time"
fi
done
echo "npm ci failed after $attempts attempts"
exit 1
- run: npm test
working-directory: .github/scripts
# ============================================================================
# SEQUENTIAL PATH (~30m): Default for external contributors.
# Stage 2 waits for Stage 1; Stage 3 waits for Stage 2.
# Active when parallel == false.
# ============================================================================
stage1-seq:
needs: [setup]
if: ${{ needs.setup.outputs.parallel == 'false' }}
uses: ./.github/workflows/ci-orchestrator-stage1.yml
secrets: inherit
stage2-seq:
needs: [setup, stage1-seq]
if: ${{ needs.setup.outputs.parallel == 'false' }}
uses: ./.github/workflows/ci-orchestrator-stage2.yml
secrets: inherit
stage3-seq:
needs: [setup, stage2-seq]
if: ${{ needs.setup.outputs.parallel == 'false' }}
uses: ./.github/workflows/ci-orchestrator-stage3.yml
secrets: inherit
# ============================================================================
# PARALLEL PATH (~10m): For trusted maintainers, merge queue, and main branch.
# All stages start simultaneously after setup.
# Active when parallel == true.
# ============================================================================
stage1-fast:
needs: [setup]
if: ${{ needs.setup.outputs.parallel == 'true' }}
uses: ./.github/workflows/ci-orchestrator-stage1.yml
secrets: inherit
stage2-fast:
needs: [setup]
if: ${{ needs.setup.outputs.parallel == 'true' }}
uses: ./.github/workflows/ci-orchestrator-stage2.yml
secrets: inherit
stage3-fast:
needs: [setup]
if: ${{ needs.setup.outputs.parallel == 'true' }}
uses: ./.github/workflows/ci-orchestrator-stage3.yml
secrets: inherit
# ============================================================================
# FINAL GATEKEEPER: Use this job for Branch Protection.
# Validates whichever execution path was taken (sequential or parallel).
# ============================================================================
ci-success:
name: All CI Checks Passed
runs-on: ubuntu-latest
if: always()
needs: [setup, ci-scripts, stage1-seq, stage2-seq, stage3-seq, stage1-fast, stage2-fast, stage3-fast]
steps:
- name: Check setup status
if: ${{ needs.setup.result != 'success' }}
run: |
echo "❌ Setup job failed or was cancelled."
exit 1
- name: Check CI scripts tests
if: ${{ needs.ci-scripts.result != 'success' }}
run: |
echo "❌ CI scripts unit tests failed or were cancelled."
exit 1
- name: Check sequential path
if: ${{ needs.setup.outputs.parallel == 'false' }}
run: |
S1="${{ needs.stage1-seq.result }}"
S2="${{ needs.stage2-seq.result }}"
S3="${{ needs.stage3-seq.result }}"
if [[ "$S1" != "success" || "$S2" != "success" || "$S3" != "success" ]]; then
echo "❌ CI failed on sequential path. Stage 1: $S1, Stage 2: $S2, Stage 3: $S3"
exit 1
fi
echo "✅ CI passed on sequential path."
- name: Check parallel path
if: ${{ needs.setup.outputs.parallel == 'true' }}
run: |
S1="${{ needs.stage1-fast.result }}"
S2="${{ needs.stage2-fast.result }}"
S3="${{ needs.stage3-fast.result }}"
if [[ "$S1" != "success" || "$S2" != "success" || "$S3" != "success" ]]; then
echo "❌ CI failed on parallel path. Stage 1: $S1, Stage 2: $S2, Stage 3: $S3"
exit 1
fi
echo "✅ CI passed on parallel path."
- name: Validate execution path was determined
run: |
PARALLEL="${{ needs.setup.outputs.parallel }}"
if [[ "$PARALLEL" != "true" && "$PARALLEL" != "false" ]]; then
echo "❌ Invalid parallel mode: '$PARALLEL' (expected 'true' or 'false')"
exit 1
fi
# ============================================================================
# SUMMARY REPORT: Runs after all CI stages pass.
# Computes coverage gating and metrics comparison, uploads ci-summary artifact.
# Fails visibly in PR Checks if coverage drops or metrics regress.
# ci-summary-report-publish.yml (workflow_run) reads the artifact and posts
# the PR comment and check runs — even when this job fails.
# ============================================================================
summary:
name: CI Summary Report
needs: [ci-success]
if: always() && needs.ci-success.result == 'success'
uses: ./.github/workflows/ci-summary-report.yml
secrets: inherit
================================================
FILE: .github/workflows/ci-release.yml
================================================
name: Publish release
on:
release:
types:
- published
workflow_dispatch:
inputs:
dry_run:
required: true
type: boolean
description: Do a test run. It will only build one platform (for speed) and will not push artifacts.
overwrite:
required: true
type: boolean
description: Allow overwriting artifacts.
jobs:
publish-release:
permissions:
contents: write
deployments: write
packages: read # This allows the runner to pull from GHCR
if: github.repository == 'jaegertracing/jaeger'
runs-on: jaeger-linux-amd64-32core-1200GB_SSD
steps:
- name: Clean up some disk space
# We had an issue where the workflow was running out of disk space,
# because it downloads so many Docker images for different platforms.
# Here we delete some stuff from the VM that we do not use.
# Inspired by https://github.com/jlumbroso/free-disk-space.
run: |
sudo rm -rf /usr/local/lib/android || true
df -h /
- uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: true
- name: Fetch git tags
run: |
git fetch --prune --unshallow --tags
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- uses: ./.github/actions/setup-node.js
- name: Determine parameters
id: params
run: |
docker_flags=()
if [[ "${{ inputs.dry_run }}" == "true" ]]; then
docker_flags=("${docker_flags[@]}" -l -p linux/amd64)
echo "platforms=linux/amd64" >> $GITHUB_OUTPUT
echo "gpg_key_override=-k skip" >> $GITHUB_OUTPUT
else
echo "platforms=$(make echo-platforms)" >> $GITHUB_OUTPUT
fi
if [[ "${{ inputs.overwrite }}" == "true" ]]; then
docker_flags=("${docker_flags[@]}" -o)
fi
echo "docker_flags=${docker_flags[@]}" >> $GITHUB_OUTPUT
cat $GITHUB_OUTPUT
- name: Export BRANCH variable and validate it is a semver
# Many scripts depend on BRANCH variable. We do not want to
# use ./.github/actions/setup-branch here because it may set
# BRANCH=main when the workflow is triggered manually.
run: |
BRANCH=$(make echo-version)
echo Validate that the latest tag ${BRANCH} is in semver format
echo ${BRANCH} | grep -E '^v[0-9]+.[0-9]+.[0-9]+(-rc[0-9]+)?$'
echo "BRANCH=${BRANCH}" >> ${GITHUB_ENV}
- name: Configure GPG Key
if: ${{ inputs.dry_run != true }}
uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec # v6.3.0
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
- name: Build all binaries
run: make build-all-platforms PLATFORMS=${{ steps.params.outputs.platforms }}
- name: Package binaries
run: |
bash scripts/build/package-deploy.sh \
-p ${{ steps.params.outputs.platforms }} \
${{ steps.params.outputs.gpg_key_override }}
- name: Upload binaries
if: ${{ inputs.dry_run != true }}
uses: svenstaro/upload-release-action@5e35e583720436a2cc5f9682b6f55657101c1ea1 # 2.11.1
with:
file: '{deploy/*.tar.gz,deploy/*.zip,deploy/*.sha256sum.txt,deploy/*.asc}'
file_glob: true
overwrite: ${{ inputs.overwrite }}
tag: ${{ env.BRANCH }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
- name: Delete the release artifacts after uploading them.
run: |
rm -rf deploy || true
df -h /
- name: Log in to GHCR
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
- name: Build and upload all container images
# -B skips building the binaries since we already did that above
run: |
bash scripts/build/build-upload-docker-images.sh -B \
${{ steps.params.outputs.docker_flags }}
env:
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
QUAY_TOKEN: ${{ secrets.QUAY_TOKEN }}
- name: Build, test, and publish jaeger image
run: |
bash scripts/build/build-all-in-one-image.sh \
${{ steps.params.outputs.docker_flags }}
env:
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
QUAY_TOKEN: ${{ secrets.QUAY_TOKEN }}
- name: Build, test, and publish hotrod image
run: |
bash scripts/build/build-hotrod-image.sh \
${{ steps.params.outputs.docker_flags }}
env:
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
QUAY_TOKEN: ${{ secrets.QUAY_TOKEN }}
- name: Generate SBOM
uses: anchore/sbom-action@17ae1740179002c89186b61233e0f892c3118b11 # v0.23.0
with:
output-file: jaeger-SBOM.spdx.json
upload-release-assets: false
upload-artifact: false
- name: Upload SBOM
# Upload SBOM manually, because anchore/sbom-action does not do that
# when the workflow is triggered manually, only from a release.
uses: svenstaro/upload-release-action@5e35e583720436a2cc5f9682b6f55657101c1ea1 # 2.11.1
if: ${{ inputs.dry_run != true }}
with:
file: jaeger-SBOM.spdx.json
overwrite: ${{ inputs.overwrite }}
tag: ${{ env.BRANCH }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/ci-summary-report-publish.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# CI Summary Report (Publish): posts PR comments and check runs from the
# pre-computed ci-summary artifact produced by ci-summary-report.yml.
#
# Triggered by workflow_run on CI Orchestrator completion (success OR failure).
# pull_request workflows from forks run with read-only permissions regardless of
# what the workflow file declares, so they cannot post PR comments or check runs.
# workflow_run always executes in the base repository context and gets the
# permissions declared here — that is why posting is split into this workflow.
# The heavy computation runs inside the CI Orchestrator itself (ci-summary-report.yml),
# making gate failures immediately visible in the PR Checks table without waiting
# for this workflow's separate approval step.
#
# Design: docs/adr/004-migrating-coverage-gating-to-github-actions.md
# Security model: see .github/scripts/ci-summary-report-publish.js
name: CI Summary Report (Publish)
on:
workflow_run:
workflows: ["CI Orchestrator"]
types: [completed]
workflow_dispatch:
inputs:
run_id:
description: 'CI Orchestrator run ID to publish summary for'
required: true
pr_number:
description: 'PR number to post summary report for'
required: true
permissions:
contents: read
pull-requests: write
checks: write
actions: read
jobs:
publish:
name: Post Summary
if: |
github.event_name == 'workflow_dispatch' ||
github.event.workflow_run.conclusion == 'success' ||
github.event.workflow_run.conclusion == 'failure'
runs-on: ubuntu-latest
steps:
# Resolve the CI Orchestrator run ID and head SHA.
# PR number is read from the ci-summary artifact after download (see below).
- name: Resolve source run
id: source-run
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
RUN_ID="${{ github.event.inputs.run_id }}"
PR_NUMBER="${{ github.event.inputs.pr_number }}"
for var in RUN_ID PR_NUMBER; do
if ! [[ "${!var}" =~ ^[1-9][0-9]*$ ]]; then
echo "::error::Invalid $var input: must be a positive integer, got: '${!var}'"
exit 1
fi
done
echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT
HEAD_SHA=$(gh api "repos/${{ github.repository }}/actions/runs/$RUN_ID" --jq '.head_sha')
else
RUN_ID="${{ github.event.workflow_run.id }}"
HEAD_SHA="${{ github.event.workflow_run.head_sha }}"
fi
echo "run_id=$RUN_ID" >> $GITHUB_OUTPUT
echo "head_sha=$HEAD_SHA" >> $GITHUB_OUTPUT
echo "source_run_url=https://github.com/${{ github.repository }}/actions/runs/$RUN_ID" >> $GITHUB_OUTPUT
echo "summary_run_url=https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> $GITHUB_OUTPUT
# Checkout the base repo so that .github/scripts/ci-summary-report-publish.js
# is available for require() in the github-script step below.
# Do NOT checkout the PR head: this workflow must only run base-repo code.
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
# Download only the ci-summary artifact (pre-computed by ci-summary-report.yml).
- name: Download CI summary artifact
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh run download "${{ steps.source-run.outputs.run_id }}" \
--repo "${{ github.repository }}" \
--name ci-summary \
--dir .artifacts \
|| echo "::warning::ci-summary artifact not found; proceeding without summary artifact (later checks may fail)."
# For workflow_run triggers, read pr_number from ci-summary.json (written
# by ci-summary-report.yml inside the CI Orchestrator, where
# github.event.pull_request.number is accurate).
# For workflow_dispatch, pr_number is already set from the input above.
- name: Read PR number from artifact
id: pr
if: github.event_name != 'workflow_dispatch'
run: |
if [ -f .artifacts/ci-summary.json ]; then
PR_NUMBER=$(jq -r '.pr_number // empty' .artifacts/ci-summary.json 2>/dev/null || true)
if [ -n "$PR_NUMBER" ]; then
echo "Found PR #$PR_NUMBER in ci-summary.json"
echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT
else
echo "No PR number in ci-summary.json; PR comment will be skipped."
fi
else
echo "ci-summary.json not found; PR comment will be skipped."
fi
- name: Post PR comment and create check runs
if: steps.source-run.outputs.head_sha
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
with:
script: |
const handler = require('./.github/scripts/ci-summary-report-publish.js');
await handler({
github, core, fs: require('fs'),
inputs: {
owner: context.repo.owner,
repo: context.repo.repo,
headSha: '${{ steps.source-run.outputs.head_sha }}',
prNumber: '${{ steps.source-run.outputs.pr_number || steps.pr.outputs.pr_number }}',
ciRunUrl: '${{ steps.source-run.outputs.source_run_url }}',
publishUrl: '${{ steps.source-run.outputs.summary_run_url }}',
},
});
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/ci-summary-report.yml
================================================
# Copyright (c) 2026 The Jaeger Authors.
# SPDX-License-Identifier: Apache-2.0
# CI Summary Report: reusable workflow (workflow_call) invoked by CI Orchestrator.
# Computes metrics comparison and coverage gating, then uploads a ci-summary
# artifact with the results. ci-summary-report-publish.yml (triggered by
# workflow_run) reads that artifact to post PR comments and check runs, because
# pull_request workflows from forks cannot write to the upstream repository.
#
# Design: docs/adr/004-migrating-coverage-gating-to-github-actions.md
name: CI Summary Report
on:
workflow_call:
permissions:
contents: read
actions: write # required for actions/cache save and gh run download
jobs:
summary-report:
name: Summary Report
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
with:
ref: ${{ github.sha }}
# Download all artifacts uploaded by the calling (CI Orchestrator) run.
# This includes coverage-* and metrics_snapshot_* artifacts from all CI jobs.
- name: Download all artifacts
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh run download "${{ github.run_id }}" \
--repo "${{ github.repository }}" --dir .artifacts
- name: Install dependencies
run: python3 -m pip install prometheus-client
- name: Compare metrics and generate summary
id: compare-metrics
shell: bash
run: bash ./scripts/e2e/metrics_summary.sh
- name: Set up Go for coverage tools
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
cache-dependency-path: |
./go.sum
./internal/tools/go.sum
- name: Install coverage tools
run: make install-coverage-tools
- name: Merge coverage profiles
id: merge-coverage
run: |
mapfile -t COVER_FILES < <(find .artifacts -path "*/coverage-*/*.out" -type f)
if [ ${#COVER_FILES[@]} -eq 0 ]; then
echo "No coverage files found; skipping coverage gate."
echo "skipped=true" >> "$GITHUB_OUTPUT"
else
echo "Merging ${#COVER_FILES[@]} coverage profiles"
./.tools/gocovmerge "${COVER_FILES[@]}" > .artifacts/merged-coverage.out
echo "skipped=false" >> "$GITHUB_OUTPUT"
fi
- name: Filter excluded paths from merged coverage
if: success() && steps.merge-coverage.outputs.skipped == 'false'
run: |
# Applies the same exclusions as .codecov.yml (single source of truth).
# filter_coverage.py modifies the file in-place.
python3 scripts/e2e/filter_coverage.py .artifacts/merged-coverage.out
echo "Coverage lines after filtering: $(wc -l < .artifacts/merged-coverage.out)"
- name: Calculate current coverage percentage
if: success() && steps.merge-coverage.outputs.skipped == 'false'
id: coverage
run: |
PCT=$(go tool cover -func=.artifacts/merged-coverage.out \
| grep "^total:" | awk '{print $3}' | tr -d '%')
echo "percentage=${PCT}" >> "$GITHUB_OUTPUT"
echo "${PCT}" > .artifacts/current-coverage.txt
echo "Current coverage: ${PCT}%"
- name: Restore baseline coverage from main
if: success() && steps.merge-coverage.outputs.skipped == 'false'
id: restore-baseline
uses: actions/cache/restore@1bd1e32a3bdc45362d1e726936510720a7c30a57
with:
path: .artifacts/baseline-coverage.txt
# Exact match intentionally never hits (run IDs differ between runs).
# The restore-keys prefix coverage-baseline_ always falls back to the
# most recently created cache entry (GitHub returns the newest match
# for prefix lookups), which is the latest passing main-branch run.
# The trailing underscore avoids matching a plain "coverage-baseline"
# key if one were ever created.
# Storage is negligible: each entry is a single number (~10 B) and
# GitHub automatically evicts entries unused for 7 days.
key: coverage-baseline_${{ github.run_id }}
restore-keys: |
coverage-baseline_
- name: Gate on coverage regression
if: success() && steps.merge-coverage.outputs.skipped == 'false'
id: coverage-gate
run: |
CURRENT="${{ steps.coverage.outputs.percentage }}"
BASELINE_MSG="(no baseline yet)"
failure_reasons=()
if [ -z "$CURRENT" ]; then
failure_reasons+=("coverage percentage is empty; go tool cover may have failed")
else
# Gate 1: absolute minimum threshold
MINIMUM=95.0
if (( $(echo "$CURRENT < $MINIMUM" | bc -l) )); then
failure_reasons+=("coverage ${CURRENT}% is below minimum ${MINIMUM}%")
fi
# Gate 2: no regression vs main baseline
if [ -f .artifacts/baseline-coverage.txt ]; then
BASELINE=$(cat .artifacts/baseline-coverage.txt)
if [ -z "$BASELINE" ]; then
failure_reasons+=("baseline coverage file is empty; cannot perform regression check")
else
BASELINE_MSG="(baseline ${BASELINE}%)"
if (( $(echo "$CURRENT < $BASELINE" | bc -l) )); then
failure_reasons+=("coverage dropped from ${BASELINE}% to ${CURRENT}%")
fi
fi
fi
fi
if [ ${#failure_reasons[@]} -gt 0 ]; then
msg=$(IFS='; '; echo "${failure_reasons[*]}")
echo "conclusion=failure" >> "$GITHUB_OUTPUT"
echo "summary=${msg}" >> "$GITHUB_OUTPUT"
echo "::error::${msg}"
else
echo "conclusion=success" >> "$GITHUB_OUTPUT"
echo "summary=Coverage ${CURRENT}% ${BASELINE_MSG}" >> "$GITHUB_OUTPUT"
echo "Coverage ${CURRENT}% ${BASELINE_MSG}: OK"
fi
# Serialize only strongly-typed values to JSON so ci-summary-report-publish.yml
# never handles free-form text from test output (which could contain injections).
# All display text is constructed from this structured data by trusted publish-
# workflow code running in the base repository context.
#
# metrics_snapshots is an array of per-snapshot change data (metric names and
# counts) produced by metrics_summary.sh. The publish workflow validates every
# field before rendering (see sanitizeSnapshots in ci-summary-report-publish.js).
- name: Save conclusions for publish workflow
if: always()
env:
PR_NUMBER: ${{ github.event.pull_request.number }}
METRICS_CONCLUSION: ${{ steps.compare-metrics.outputs.CONCLUSION }}
METRICS_TOTAL: ${{ steps.compare-metrics.outputs.TOTAL_CHANGES }}
METRICS_INFRA_ERRORS: ${{ steps.compare-metrics.outputs.INFRA_ERRORS }}
COVERAGE_MERGE_OUTCOME: ${{ steps.merge-coverage.outcome }}
COVERAGE_SKIPPED: ${{ steps.merge-coverage.outputs.skipped }}
COVERAGE_CONCLUSION: ${{ steps.coverage-gate.outputs.conclusion }}
COVERAGE_PCT: ${{ steps.coverage.outputs.percentage }}
run: |
mkdir -p .artifacts
python3 - <<'PYEOF'
import json, os
metrics_conclusion = os.environ.get('METRICS_CONCLUSION') or 'failure'
metrics_total_env = os.environ.get('METRICS_TOTAL')
if metrics_total_env not in (None, ''):
metrics_total = int(metrics_total_env)
else:
metrics_total = None
has_infra_errors = os.environ.get('METRICS_INFRA_ERRORS') == 'true'
coverage_merge_outcome = os.environ.get('COVERAGE_MERGE_OUTCOME', '')
coverage_skipped = os.environ.get('COVERAGE_SKIPPED') == 'true'
if coverage_merge_outcome in ('failure', 'cancelled'):
# merge-coverage failed before writing its skipped output; treat as failure
# so a pipeline error is not silently reported as coverage skipped/success.
coverage_conclusion = 'failure'
elif coverage_skipped:
coverage_conclusion = 'skipped'
else:
coverage_conclusion = os.environ.get('COVERAGE_CONCLUSION') or 'skipped'
coverage_pct = None
coverage_baseline = None
if not coverage_skipped:
try:
coverage_pct = float(os.environ.get('COVERAGE_PCT') or '')
except (ValueError, TypeError):
pass
try:
with open('.artifacts/baseline-coverage.txt') as f:
coverage_baseline = float(f.read().strip())
except (FileNotFoundError, ValueError):
pass
# Load per-snapshot metric change data (produced by metrics_summary.sh).
# If the file is missing or malformed, set to None — the publish
# workflow treats null/missing as "no detail available".
metrics_snapshots = None
try:
with open('.artifacts/metrics_snapshots.json') as f:
metrics_snapshots = json.load(f)
except (FileNotFoundError, json.JSONDecodeError, ValueError):
pass
pr_number_env = os.environ.get('PR_NUMBER')
pr_number = int(pr_number_env) if pr_number_env else None
data = {
'pr_number': pr_number,
'metrics_conclusion': metrics_conclusion,
'metrics_total_changes': metrics_total,
'metrics_has_infra_errors': has_infra_errors,
'metrics_snapshots': metrics_snapshots,
'coverage_conclusion': coverage_conclusion,
'coverage_percentage': coverage_pct,
'coverage_baseline': coverage_baseline,
'coverage_skipped': coverage_skipped,
}
with open('.artifacts/ci-summary.json', 'w') as f:
json.dump(data, f, indent=2)
print(json.dumps(data, indent=2))
PYEOF
- name: Upload CI summary artifact
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
with:
name: ci-summary
path: .artifacts/ci-summary.json
retention-days: 7
if-no-files-found: warn
# Save baseline coverage on main-branch runs so PRs can compare against it.
# Only save when the coverage gate passes so a failing/partial run never
# overwrites a valid baseline with a bad value.
- name: Save coverage baseline on main branch
if: >-
github.ref == 'refs/heads/main' &&
steps.merge-coverage.outputs.skipped == 'false' &&
steps.coverage-gate.outputs.conclusion == 'success'
run: cp .artifacts/current-coverage.txt .artifacts/baseline-coverage.txt
- name: Cache coverage baseline
if: >-
github.ref == 'refs/heads/main' &&
steps.merge-coverage.outputs.skipped == 'false' &&
steps.coverage-gate.outputs.conclusion == 'success'
uses: actions/cache/save@1bd1e32a3bdc45362d1e726936510720a7c30a57
with:
path: .artifacts/baseline-coverage.txt
key: coverage-baseline_${{ github.run_id }}
# Fail the job (and the calling CI Orchestrator run) so the coverage/metrics
# regression is immediately visible in the PR Checks table.
# The ci-summary artifact is already uploaded above (if: always()), so
# ci-summary-report-publish.yml can still post the PR comment and check runs.
- name: Fail if coverage or metrics gate failed
if: |
steps.compare-metrics.outputs.CONCLUSION == 'failure' ||
steps.coverage-gate.outputs.conclusion == 'failure'
run: |
echo "Metrics: ${{ steps.compare-metrics.outputs.CONCLUSION }}"
echo "Coverage: ${{ steps.coverage-gate.outputs.conclusion }}"
exit 1
================================================
FILE: .github/workflows/ci-unit-tests-go-tip.yml
================================================
name: Unit Tests on Go Tip
on:
push:
branches: [main]
workflow_dispatch:
# We normally don't want this workflow to run on PRs, only on main branch.
# Unless the workflow file itself or the setup action is modified.
pull_request:
branches: [main]
paths:
- '.github/workflows/ci-unit-tests-go-tip.yml'
- '.github/actions/setup-go-tip/**'
permissions:
contents: read
jobs:
unit-tests-go-tip:
permissions:
checks: write
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- name: Install Go Tip
uses: ./.github/actions/setup-go-tip
with:
gh_token: ${{ secrets.GITHUB_TOKEN }}
- name: Clean Go cache for gotip
run: |
go clean -cache
go clean -modcache
- name: Run unit tests
run: make test-ci
================================================
FILE: .github/workflows/ci-unit-tests.yml
================================================
name: Unit Tests
on:
workflow_call:
permissions:
contents: read
jobs:
unit-tests:
permissions:
checks: write
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
cache-dependency-path: ./go.sum
# download dependencies separately to keep unit test step's output cleaner
- name: go mod download
run: go mod download
- name: Install test deps
# even though the same target runs from test-ci, running it separately makes for cleaner log in GH workflow
run: make install-test-tools
- name: Run unit tests
run: make test-ci
- name: Upload coverage to codecov
uses: ./.github/actions/upload-codecov
with:
files: cover.out
flag: unittests
================================================
FILE: .github/workflows/codeql.yml
================================================
name: "CodeQL"
on:
workflow_call:
schedule:
- cron: '31 6 * * 1'
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions: # added using https://github.com/step-security/secure-workflows
contents: read
jobs:
codeql-analyze:
# Skip merge_group to avoid duplicate runs (code already scanned on pull_request)
# See https://github.com/github/codeql-action/issues/1537
if: ${{ github.event_name != 'merge_group' }}
name: CodeQL Analyze
runs-on: ubuntu-latest
permissions:
security-events: write
actions: read
strategy:
fail-fast: false
matrix:
language: [ 'go', 'python' ]
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- name: Checkout repository
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
submodules: true
- name: Setup Go
if: matrix.language == 'go'
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Initialize CodeQL
uses: github/codeql-action/init@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0
with:
languages: ${{ matrix.language }}
# Use Autobuild for Python (it works fine for interpreted languages)
- name: Autobuild (Python)
if: matrix.language == 'python'
uses: github/codeql-action/autobuild@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0
# Explicit build for Go - required for CodeQL to analyze compiled code
- name: Build Go code
if: matrix.language == 'go'
run: |
# Build all Go binaries to ensure CodeQL can analyze them
go build -v ./...
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0
================================================
FILE: .github/workflows/dco_merge_group.yml
================================================
# Fake "DCO check" workflow inspired by https://github.com/onnx/onnx/pull/5398/files.
# The regular DCO check is required, but it does not run from a merge queue and there is
# no way to configure it to run.
name: DCO
on:
merge_group:
permissions:
contents: read
jobs:
DCO:
runs-on: ubuntu-latest
steps:
- run: echo "Fake DCO check to avoid blocking the merge queue"
================================================
FILE: .github/workflows/dependency-review.yml
================================================
# Dependency Review Action
#
# This Action will scan dependency manifest files that change as part of a Pull Request,
# surfacing known-vulnerable versions of the packages declared or updated in the PR.
# Once installed, if the workflow run is marked as required,
# PRs introducing known-vulnerable packages will be blocked from merging.
#
# Source repository: https://github.com/actions/dependency-review-action
name: 'Dependency Review'
on:
workflow_call:
permissions:
contents: read
jobs:
dependency-review:
if: |
${{ github.event_name == 'pull_request' ||
github.event_name == 'pull_request_target' ||
github.event_name == 'merge_group' }}
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- name: 'Checkout Repository'
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- name: 'Dependency Review'
uses: actions/dependency-review-action@2031cfc080254a8a887f58cffee85186f0e49e48 # v4.9.0
================================================
FILE: .github/workflows/fossa.yml
================================================
name: FOSSA
on:
workflow_call:
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
permissions:
contents: read
jobs:
fossa-license-scan:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: 1.26.x
- name: Add GOPATH
run: |
echo "GOPATH=$(go env GOPATH)"
echo "GOPATH=$(go env GOPATH)" >>"$GITHUB_ENV"
echo "$GOPATH/bin" >>"$GITHUB_PATH"
- name: Run FOSSA scan and upload report
uses: fossa-contrib/fossa-action@3d2ef181b1820d6dcd1972f86a767d18167fa19b # v3.0.1
with:
# FOSSA Push-Only API Token
fossa-api-key: 304657e2357ba57b416b94e6b119131b
github-token: ${{ github.token }}
================================================
FILE: .github/workflows/label-check.yml
================================================
name: Verify PR Label
on:
merge_group:
pull_request:
types:
- opened
- reopened
- synchronize
- ready_for_review
- labeled
- unlabeled
permissions:
contents: read
jobs:
check-label:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- name: Check PR label
# Only fail if NOT merge_group, AND labels DO NOT contain 'changelog:'
if: |
github.event_name != 'merge_group' &&
contains(join(github.event.pull_request.labels.*.name, ','), 'changelog:') == false
run: |
echo "::error::Pull request is missing a required 'changelog:' label. Found labels: ${{ join(github.event.pull_request.labels.*.name, ', ') }}"
exit 1
================================================
FILE: .github/workflows/pr-quota-manager.yml
================================================
name: PR Quota Manager
on:
pull_request_target: # Runs with write permissions even for fork PRs
types: [opened, closed, reopened, synchronize] # synchronize = new commits pushed
workflow_dispatch:
inputs:
username:
description: 'GitHub username to process quota for'
required: true
type: string
dryRun:
description: 'Dry run mode - show actions without making changes'
required: false
type: boolean
default: false
permissions:
pull-requests: write
issues: write
concurrency:
group: quota-${{ github.event.pull_request.user.login || github.event.inputs.username }}
cancel-in-progress: false
jobs:
manage-quota:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Process PR Quota
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
with:
# Use custom PAT if available (not available for fork PRs), otherwise use default token
github-token: ${{ secrets.PR_QUOTA_MANAGER_PAT || github.token }}
script: |
const handler = require('./.github/scripts/pr-quota-manager.js')
// For PR events, use PR author; for manual runs, use input. Fail if no username can be determined.
const prUser = context.payload.pull_request?.user?.login
const inputUser = context.payload.inputs?.username
const username = prUser || inputUser
if (!username) {
core.setFailed('Unable to determine username for quota processing. Aborting.')
return
}
const owner = context.repo.owner
const repo = context.repo.repo
const dryRun = context.payload.inputs?.dryRun === 'true'
await handler({github, core, username, owner, repo, dryRun})
================================================
FILE: .github/workflows/scorecard.yml
================================================
# This workflow uses actions that are not certified by GitHub. They are provided
# by a third-party and are governed by separate terms of service, privacy
# policy, and support documentation.
name: Scorecard supply-chain security
on:
# For Branch-Protection check. Only the default branch is supported. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
branch_protection_rule:
# To guarantee Maintained check is occasionally updated. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
schedule:
- cron: '17 20 * * 1'
push:
branches: [ "main" ]
# Declare default permissions as read only.
permissions: read-all
jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
# Needed to publish results and get a badge (see publish_results below).
id-token: write
# Uncomment the permissions below if installing in a private repository.
# contents: read
# actions: read
steps:
- name: Harden Runner
uses: step-security/harden-runner@a90bcbc6539c36a85cdfeb73f7e2f433735f215b # v2.15.0
with:
egress-policy: audit
- name: "Checkout code"
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0
with:
results_file: results.sarif
results_format: sarif
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
# - you want to enable the Branch-Protection check on a *public* repository, or
# - you are installing Scorecard on a *private* repository
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat.
# repo_token: ${{ secrets.SCORECARD_TOKEN }}
# Public repositories:
# - Publish results to OpenSSF REST API for easy access by consumers
# - Allows the repository to include the Scorecard badge.
# - See https://github.com/ossf/scorecard-action#publishing-results.
# For private repositories:
# - `publish_results` will always be set to `false`, regardless
# of the value entered here.
publish_results: true
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: "Upload artifact"
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: SARIF file
path: results.sarif
retention-days: 5
# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0
with:
sarif_file: results.sarif
================================================
FILE: .github/workflows/stale.yml
================================================
name: 'Close stale issues and PRs'
on:
schedule:
# Run every Monday at 1:30 AM UTC
- cron: '30 1 * * 1'
workflow_dispatch:
permissions:
issues: write
pull-requests: write
jobs:
stale:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911
with:
egress-policy: audit
- uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e
with:
# Issues configuration
days-before-issue-stale: 90
days-before-issue-close: 14
stale-issue-message: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs.
To keep it open either add a comment or the label `do-not-expire`.
close-issue-message: >
This issue has been automatically closed due to inactivity.
stale-issue-label: 'stale'
exempt-issue-labels: 'do-not-expire,help-wanted'
only-issue-labels: 'question'
# Pull requests configuration
days-before-pr-stale: 60
days-before-pr-close: 14
stale-pr-message: >
This pull request has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. You may re-open
it if you need more time.
close-pr-message: >
This pull request has been automatically closed due to inactivity. You may re-open
it if you need more time. We really appreciate your contribution and we are sorry
that this has not been completed.
stale-pr-label: 'stale'
exempt-pr-labels: 'do-not-expire'
# General configuration
operations-per-run: 100
remove-stale-when-updated: true
================================================
FILE: .github/workflows/waiting-for-author.yml
================================================
name: "Waiting for Author"
on:
pull_request_target:
types: [synchronize]
pull_request_review_comment:
types: [created]
issue_comment:
types: [created]
permissions:
pull-requests: write
issues: write
jobs:
triage:
if: ${{ github.event.issue.pull_request || github.event.pull_request }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Manage Waiting for Author Label
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
with:
script: |
const script = require('./.github/scripts/waiting-for-author.js')
await script({github, context, core})
================================================
FILE: .gitignore
================================================
go.work
go.work.sum
.tools/
*.out
*.test
*.xml
*.swp
.fmt.log
.import.log
.lint.log
cover.html
.envrc
.idea/
.vscode/
.tmp/
.mkdocs-virtual-env/
vendor/
# Jaeger binaries
examples/hotrod/hotrod
examples/hotrod/hotrod-*
cmd/agent/agent
cmd/agent/agent-*
cmd/anonymizer/anonymizer
cmd/anonymizer/anonymizer-*
cmd/jaeger/jaeger
cmd/jaeger/jaeger-*
cmd/jaeger/internal/integration/results
cmd/remote-storage/remote-storage
cmd/remote-storage/remote-storage-*
cmd/es-index-cleaner/es-index-cleaner-*
cmd/es-rollover/es-rollover-*
cmd/esmapping-generator/esmapping-generator-*
cmd/tracegen/tracegen
cmd/tracegen/tracegen-*
crossdock/crossdock-*
run-crossdock.log
__pycache__
.asset-manifest.json
deploy/
deploy-staging/
sha256sum.combined.txt
resource.syso
.gocache
test-results.json
.metrics/
.mockery.log
================================================
FILE: .gitmodules
================================================
[submodule "idl"]
path = idl
url = https://github.com/jaegertracing/jaeger-idl.git
branch = main
[submodule "jaeger-ui"]
path = jaeger-ui
url = https://github.com/jaegertracing/jaeger-ui.git
branch = main
================================================
FILE: .golangci.yml
================================================
version: "2"
run:
go: "1.26"
linters:
enable:
- asciicheck
- bidichk
- bodyclose
- contextcheck
- copyloopvar
- decorder
- depguard
- durationcheck
- errname
- errorlint
- gocritic
- gosec
- misspell
- nakedret
- nilerr
- noctx
- nolintlint
- perfsprint
- revive
- staticcheck
- testifylint
- unused
- usestdlibvars
- usetesting
disable:
- errcheck
settings:
depguard:
rules:
disallow-crossdock:
files:
- '!**/crossdock/**'
deny:
- pkg: github.com/crossdock/crossdock-go
desc: Do not refer to crossdock from other packages
disallow-otel-contrib-translator:
files:
- '!**/v1adapter/**'
deny:
- pkg: github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger
desc: Use v1adapter package instead of opentelemetry-collector-contrib/pkg/translator/jaeger
disallow-uber/goleak:
files:
- '**_test.go'
deny:
- pkg: go.uber.org/goleak
desc: Use github.com/jaegertracing/jaeger/internal/testutils
disallowed-deps:
deny:
- pkg: go.uber.org/atomic
desc: Use 'sync/atomic' instead of go.uber.org/atomic
- pkg: io/ioutil
desc: Use os or io instead of io/ioutil
- pkg: github.com/hashicorp/go-multierror
desc: Use errors.Join instead of github.com/hashicorp/go-multierror
- pkg: go.uber.org/multierr
desc: Use errors.Join instead of github.com/hashicorp/go-multierror
- pkg: github.com/jaegertracing/jaeger/model$
desc: Use github.com/jaegertracing/jaeger-idl/model/v1
- pkg: github.com/jaegertracing/jaeger/internal/proto-gen/api_v2$
desc: Use github.com/jaegertracing/jaeger-idl/proto-gen/api_v2
gocritic:
disabled-checks:
- appendAssign
- commentedOutCode
- deferInLoop
- dupArg
- exitAfterDefer
- hugeParam
- importShadow
- paramTypeCombine # WON'T FIX
- returnAfterHttpError
- todoCommentWithoutDetail
- unnamedResult
enable-all: true
gosec:
excludes:
- G104
- G107
- G404
- G601
govet:
disable:
- fieldalignment
- shadow
enable-all: true
perfsprin
gitextract_8w1ucnwf/
├── .codecov.yml
├── .fossa.yml
├── .github/
│ ├── CODEOWNERS
│ ├── actions/
│ │ ├── block-pr-from-main-branch/
│ │ │ └── action.yml
│ │ ├── setup-branch/
│ │ │ └── action.yml
│ │ ├── setup-go-tip/
│ │ │ └── action.yml
│ │ ├── setup-node.js/
│ │ │ └── action.yml
│ │ ├── upload-codecov/
│ │ │ └── action.yml
│ │ └── verify-metrics-snapshot/
│ │ └── action.yaml
│ ├── scripts/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── ci-summary-report-publish.js
│ │ ├── ci-summary-report-publish.test.js
│ │ ├── list-open-prs-by-author.js
│ │ ├── package.json
│ │ ├── pr-quota-manager.js
│ │ ├── pr-quota-manager.test.js
│ │ └── waiting-for-author.js
│ └── workflows/
│ ├── README.md
│ ├── ci-build-binaries.yml
│ ├── ci-deploy-demo.yml
│ ├── ci-docker-all-in-one.yml
│ ├── ci-docker-build.yml
│ ├── ci-docker-hotrod.yml
│ ├── ci-e2e-all.yml
│ ├── ci-e2e-badger.yaml
│ ├── ci-e2e-cassandra.yml
│ ├── ci-e2e-clickhouse.yml
│ ├── ci-e2e-elasticsearch.yml
│ ├── ci-e2e-grpc.yml
│ ├── ci-e2e-kafka.yml
│ ├── ci-e2e-memory.yaml
│ ├── ci-e2e-opensearch.yml
│ ├── ci-e2e-query.yml
│ ├── ci-e2e-spm.yml
│ ├── ci-e2e-tailsampling.yml
│ ├── ci-lint-checks.yaml
│ ├── ci-orchestrator-stage1.yml
│ ├── ci-orchestrator-stage2.yml
│ ├── ci-orchestrator-stage3.yml
│ ├── ci-orchestrator.yml
│ ├── ci-release.yml
│ ├── ci-summary-report-publish.yml
│ ├── ci-summary-report.yml
│ ├── ci-unit-tests-go-tip.yml
│ ├── ci-unit-tests.yml
│ ├── codeql.yml
│ ├── dco_merge_group.yml
│ ├── dependency-review.yml
│ ├── fossa.yml
│ ├── label-check.yml
│ ├── pr-quota-manager.yml
│ ├── scorecard.yml
│ ├── stale.yml
│ └── waiting-for-author.yml
├── .gitignore
├── .gitmodules
├── .golangci.yml
├── .mockery.header.txt
├── .mockery.yaml
├── ADOPTERS.md
├── AGENTS.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CONTRIBUTING_GUIDELINES.md
├── DCO
├── GOVERNANCE.md
├── LICENSE
├── MAINTAINERS.md
├── Makefile
├── NOTICE
├── README.md
├── RELEASE.md
├── SECURITY-INSIGHTS.yml
├── SECURITY.md
├── THREAT-MODEL.md
├── _To_People_of_Russia.md
├── cmd/
│ ├── anonymizer/
│ │ ├── Dockerfile
│ │ ├── app/
│ │ │ ├── anonymizer/
│ │ │ │ ├── anonymizer.go
│ │ │ │ ├── anonymizer_test.go
│ │ │ │ └── package_test.go
│ │ │ ├── flags.go
│ │ │ ├── flags_test.go
│ │ │ ├── query/
│ │ │ │ ├── package_test.go
│ │ │ │ ├── query.go
│ │ │ │ └── query_test.go
│ │ │ ├── uiconv/
│ │ │ │ ├── extractor.go
│ │ │ │ ├── extractor_test.go
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── trace_empty.json
│ │ │ │ │ ├── trace_invalid_json.json
│ │ │ │ │ ├── trace_scan_error.json
│ │ │ │ │ ├── trace_success.json
│ │ │ │ │ └── trace_wrong_format.json
│ │ │ │ ├── module.go
│ │ │ │ ├── module_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ └── reader_test.go
│ │ │ └── writer/
│ │ │ ├── package_test.go
│ │ │ ├── writer.go
│ │ │ └── writer_test.go
│ │ └── main.go
│ ├── es-index-cleaner/
│ │ ├── .gitignore
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── app/
│ │ │ ├── cutoff_time.go
│ │ │ ├── cutoff_time_test.go
│ │ │ ├── flags.go
│ │ │ ├── flags_test.go
│ │ │ ├── index_filter.go
│ │ │ ├── index_filter_test.go
│ │ │ └── package_test.go
│ │ └── main.go
│ ├── es-rollover/
│ │ ├── Dockerfile
│ │ ├── app/
│ │ │ ├── actions.go
│ │ │ ├── actions_test.go
│ │ │ ├── flags.go
│ │ │ ├── flags_test.go
│ │ │ ├── index_options.go
│ │ │ ├── index_options_test.go
│ │ │ ├── init/
│ │ │ │ ├── action.go
│ │ │ │ ├── action_test.go
│ │ │ │ ├── flags.go
│ │ │ │ ├── flags_test.go
│ │ │ │ └── package_test.go
│ │ │ ├── lookback/
│ │ │ │ ├── action.go
│ │ │ │ ├── action_test.go
│ │ │ │ ├── flags.go
│ │ │ │ ├── flags_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── time_reference.go
│ │ │ │ └── time_reference_test.go
│ │ │ ├── package_test.go
│ │ │ └── rollover/
│ │ │ ├── action.go
│ │ │ ├── action_test.go
│ │ │ ├── flags.go
│ │ │ ├── flags_test.go
│ │ │ └── package_test.go
│ │ └── main.go
│ ├── esmapping-generator/
│ │ └── main.go
│ ├── internal/
│ │ ├── docs/
│ │ │ ├── .gitignore
│ │ │ ├── command.go
│ │ │ └── command_test.go
│ │ ├── featuregate/
│ │ │ ├── command.go
│ │ │ ├── command_test.go
│ │ │ └── package_test.go
│ │ ├── flags/
│ │ │ ├── admin.go
│ │ │ ├── admin_test.go
│ │ │ ├── doc.go
│ │ │ ├── flags.go
│ │ │ ├── flags_test.go
│ │ │ ├── healthhost.go
│ │ │ ├── healthhost_test.go
│ │ │ ├── package_test.go
│ │ │ ├── service.go
│ │ │ └── service_test.go
│ │ ├── printconfig/
│ │ │ ├── command.go
│ │ │ └── command_test.go
│ │ ├── status/
│ │ │ ├── command.go
│ │ │ └── command_test.go
│ │ └── storageconfig/
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── factory.go
│ │ ├── factory_test.go
│ │ └── package_test.go
│ ├── remote-storage/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── app/
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── package_test.go
│ │ │ ├── server.go
│ │ │ └── server_test.go
│ │ ├── config-badger.yaml
│ │ ├── config.yaml
│ │ └── main.go
│ └── tracegen/
│ ├── Dockerfile
│ ├── README.md
│ ├── docker-compose.yml
│ └── main.go
├── doc.go
├── docker-compose/
│ ├── cassandra/
│ │ ├── v4/
│ │ │ └── docker-compose.yaml
│ │ └── v5/
│ │ └── docker-compose.yaml
│ ├── clickhouse/
│ │ └── docker-compose.yml
│ ├── elasticsearch/
│ │ ├── v6/
│ │ │ └── docker-compose.yml
│ │ ├── v7/
│ │ │ └── docker-compose.yml
│ │ ├── v8/
│ │ │ └── docker-compose.yml
│ │ └── v9/
│ │ └── docker-compose.yml
│ ├── kafka/
│ │ ├── README.md
│ │ ├── docker-compose.yml
│ │ ├── jaeger-ingester-remote-storage.yaml
│ │ └── v3/
│ │ └── docker-compose.yml
│ ├── monitor/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── datasource.yml
│ │ ├── docker-compose-elasticsearch.yml
│ │ ├── docker-compose-opensearch.yml
│ │ ├── docker-compose.yml
│ │ ├── jaeger-ui.json
│ │ ├── otel-collector-config-connector.yml
│ │ └── prometheus.yml
│ ├── opensearch/
│ │ ├── v1/
│ │ │ └── docker-compose.yml
│ │ ├── v2/
│ │ │ └── docker-compose.yml
│ │ └── v3/
│ │ └── docker-compose.yml
│ ├── scylladb/
│ │ ├── README.md
│ │ └── docker-compose.yml
│ └── tail-sampling/
│ ├── Makefile
│ ├── README.md
│ ├── docker-compose.yml
│ ├── jaeger-v2-config.yml
│ └── otel-collector-config-connector.yml
├── docs/
│ ├── SCARF.md
│ ├── adr/
│ │ ├── 001-cassandra-find-traces-duration.md
│ │ ├── 002-mcp-server.md
│ │ ├── 003-lazy-storage-factory-initialization.md
│ │ ├── 004-migrating-coverage-gating-to-github-actions.md
│ │ ├── 005-badger-storage-record-layouts.md
│ │ ├── 006-internal-tracing-via-otelcol-telemetry-factory.md
│ │ └── README.md
│ ├── release/
│ │ └── remove-v1-checklist.md
│ └── security/
│ ├── architecture.md
│ ├── assurance-case.md
│ ├── self-assessment.md
│ ├── threat-model.md
│ └── verifying-releases.md
├── empty_test.go
├── examples/
│ ├── grafana-integration/
│ │ ├── README.md
│ │ ├── docker-compose.yaml
│ │ ├── grafana/
│ │ │ ├── dashboard.yml
│ │ │ ├── datasources.yaml
│ │ │ └── hotrod_metrics_logs.json
│ │ └── prometheus/
│ │ └── prometheus.yml
│ ├── hotrod/
│ │ ├── .gitignore
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── cmd/
│ │ │ ├── all.go
│ │ │ ├── customer.go
│ │ │ ├── driver.go
│ │ │ ├── empty_test.go
│ │ │ ├── flags.go
│ │ │ ├── frontend.go
│ │ │ ├── root.go
│ │ │ └── route.go
│ │ ├── docker-compose.yml
│ │ ├── kubernetes/
│ │ │ └── README.md
│ │ ├── main.go
│ │ ├── pkg/
│ │ │ ├── delay/
│ │ │ │ ├── delay.go
│ │ │ │ └── empty_test.go
│ │ │ ├── httperr/
│ │ │ │ ├── empty_test.go
│ │ │ │ └── httperr.go
│ │ │ ├── log/
│ │ │ │ ├── empty_test.go
│ │ │ │ ├── factory.go
│ │ │ │ ├── logger.go
│ │ │ │ └── spanlogger.go
│ │ │ ├── pool/
│ │ │ │ ├── empty_test.go
│ │ │ │ └── pool.go
│ │ │ └── tracing/
│ │ │ ├── baggage.go
│ │ │ ├── empty_test.go
│ │ │ ├── http.go
│ │ │ ├── init.go
│ │ │ ├── mutex.go
│ │ │ ├── mux.go
│ │ │ └── rpcmetrics/
│ │ │ ├── README.md
│ │ │ ├── endpoints.go
│ │ │ ├── endpoints_test.go
│ │ │ ├── metrics.go
│ │ │ ├── metrics_test.go
│ │ │ ├── normalizer.go
│ │ │ ├── normalizer_test.go
│ │ │ ├── observer.go
│ │ │ ├── observer_test.go
│ │ │ └── package_test.go
│ │ └── services/
│ │ ├── config/
│ │ │ ├── config.go
│ │ │ └── empty_test.go
│ │ ├── customer/
│ │ │ ├── client.go
│ │ │ ├── database.go
│ │ │ ├── empty_test.go
│ │ │ ├── interface.go
│ │ │ └── server.go
│ │ ├── driver/
│ │ │ ├── client.go
│ │ │ ├── driver.pb.go
│ │ │ ├── driver.proto
│ │ │ ├── empty_test.go
│ │ │ ├── interface.go
│ │ │ ├── redis.go
│ │ │ └── server.go
│ │ ├── frontend/
│ │ │ ├── best_eta.go
│ │ │ ├── empty_test.go
│ │ │ ├── server.go
│ │ │ └── web_assets/
│ │ │ └── index.html
│ │ └── route/
│ │ ├── client.go
│ │ ├── empty_test.go
│ │ ├── interface.go
│ │ ├── server.go
│ │ └── stats.go
│ ├── oci/
│ │ ├── README.md
│ │ ├── config.yaml
│ │ ├── deploy-all.sh
│ │ ├── ingress.yaml
│ │ ├── jaeger-values.yaml
│ │ ├── load-generator/
│ │ │ ├── generate_traces.py
│ │ │ └── load-generator.yaml
│ │ ├── monitoring-values.yaml
│ │ ├── prometheus-svc.yaml
│ │ ├── tls-cert/
│ │ │ └── issuer.yaml
│ │ └── ui-config.json
│ ├── opentracing-tutorial/
│ │ └── README.md
│ ├── otel-demo/
│ │ ├── README.md
│ │ ├── cleanup.sh
│ │ ├── deploy-all.sh
│ │ ├── generate_traces.py
│ │ ├── ingress/
│ │ │ ├── README.md
│ │ │ ├── clusterissuer-letsencrypt-prod.yaml
│ │ │ ├── ingress-jaeger.yaml
│ │ │ ├── ingress-opensearch.yaml
│ │ │ └── ingress-otel-demo.yaml
│ │ ├── jaeger-config.yaml
│ │ ├── jaeger-query-service.yaml
│ │ ├── jaeger-values.yaml
│ │ ├── load-generator.yaml
│ │ ├── opensearch-dashboard-values.yaml
│ │ ├── opensearch-values.yaml
│ │ ├── otel-demo-values.yaml
│ │ └── start-port-forward.sh
│ ├── reverse-proxy/
│ │ ├── README.md
│ │ ├── docker-compose.yml
│ │ └── httpd.conf
│ └── service-performance-monitoring/
│ └── README.md
├── go.mod
├── go.sum
├── internal/
│ ├── auth/
│ │ ├── apikey/
│ │ │ ├── apikey-context.go
│ │ │ ├── apikey-context_test.go
│ │ │ └── package_test.go
│ │ ├── bearertoken/
│ │ │ ├── context.go
│ │ │ ├── context_test.go
│ │ │ ├── grpc.go
│ │ │ ├── grpc_test.go
│ │ │ ├── http.go
│ │ │ ├── http_test.go
│ │ │ └── package_test.go
│ │ ├── package_test.go
│ │ ├── tokenloader.go
│ │ ├── tokenloader_test.go
│ │ ├── transport.go
│ │ └── transport_test.go
│ ├── cache/
│ │ ├── cache.go
│ │ ├── lru.go
│ │ └── lru_test.go
│ ├── config/
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── package_test.go
│ │ ├── promcfg/
│ │ │ ├── config.go
│ │ │ └── config_test.go
│ │ ├── string_slice.go
│ │ ├── string_slice_test.go
│ │ └── tlscfg/
│ │ ├── flags.go
│ │ ├── flags_test.go
│ │ ├── options.go
│ │ ├── options_test.go
│ │ ├── package_test.go
│ │ └── testdata/
│ │ ├── README.md
│ │ ├── bad-CA-cert.txt
│ │ ├── example-CA-cert.pem
│ │ ├── example-client-cert.pem
│ │ ├── example-client-key.pem
│ │ ├── example-server-cert.pem
│ │ ├── example-server-key.pem
│ │ ├── gen-certs.sh
│ │ └── wrong-CA-cert.pem
│ ├── converter/
│ │ ├── doc.go
│ │ ├── empty_test.go
│ │ └── thrift/
│ │ ├── doc.go
│ │ ├── empty_test.go
│ │ └── jaeger/
│ │ ├── doc.go
│ │ ├── fixtures/
│ │ │ ├── domain_01.json
│ │ │ ├── domain_02.json
│ │ │ ├── domain_03.json
│ │ │ ├── thrift_batch_01.json
│ │ │ └── thrift_batch_02.json
│ │ ├── package_test.go
│ │ ├── sampling_from_domain.go
│ │ ├── sampling_from_domain_test.go
│ │ ├── sampling_to_domain.go
│ │ ├── sampling_to_domain_test.go
│ │ ├── to_domain.go
│ │ └── to_domain_test.go
│ ├── distributedlock/
│ │ ├── empty_test.go
│ │ ├── interface.go
│ │ └── mocks/
│ │ └── mocks.go
│ ├── fswatcher/
│ │ ├── fswatcher.go
│ │ └── fswatcher_test.go
│ ├── gogocodec/
│ │ ├── codec.go
│ │ └── codec_test.go
│ ├── grpctest/
│ │ ├── reflection.go
│ │ └── reflection_test.go
│ ├── gzipfs/
│ │ ├── gzip.go
│ │ ├── gzip_test.go
│ │ └── testdata/
│ │ └── foobar
│ ├── hostname/
│ │ ├── hostname.go
│ │ └── hostname_test.go
│ ├── httpfs/
│ │ ├── prefixed.go
│ │ ├── prefixed_test.go
│ │ └── test_assets/
│ │ └── somefile.txt
│ ├── jaegerclientenv2otel/
│ │ ├── envvars.go
│ │ └── envvars_test.go
│ ├── jiter/
│ │ ├── iter.go
│ │ ├── iter_test.go
│ │ └── package_test.go
│ ├── jptrace/
│ │ ├── aggregator.go
│ │ ├── aggregator_test.go
│ │ ├── attributes.go
│ │ ├── attributes_test.go
│ │ ├── package_test.go
│ │ ├── sanitizer/
│ │ │ ├── emptyservicename.go
│ │ │ ├── emptyservicename_test.go
│ │ │ ├── emptyspanname.go
│ │ │ ├── emptyspanname_test.go
│ │ │ ├── negative_duration_santizer.go
│ │ │ ├── negative_duration_santizer_test.go
│ │ │ ├── package_test.go
│ │ │ ├── readonly_test.go
│ │ │ ├── sanitizer.go
│ │ │ ├── sanitizer_test.go
│ │ │ ├── utf8.go
│ │ │ └── utf8_test.go
│ │ ├── spaniter.go
│ │ ├── spaniter_test.go
│ │ ├── spankind.go
│ │ ├── spankind_test.go
│ │ ├── spanmap.go
│ │ ├── spanmap_test.go
│ │ ├── statuscode.go
│ │ ├── statuscode_test.go
│ │ ├── traces.go
│ │ ├── traces_test.go
│ │ ├── valuetype.go
│ │ ├── valuetype_test.go
│ │ ├── warning.go
│ │ └── warning_test.go
│ ├── jtracer/
│ │ ├── jtracer.go
│ │ └── jtracer_test.go
│ ├── leaderelection/
│ │ ├── leader_election.go
│ │ ├── leader_election_test.go
│ │ └── mocks/
│ │ └── mocks.go
│ ├── metrics/
│ │ ├── benchmark/
│ │ │ └── benchmark_test.go
│ │ ├── counter.go
│ │ ├── factory.go
│ │ ├── gauge.go
│ │ ├── histogram.go
│ │ ├── metrics.go
│ │ ├── metrics_test.go
│ │ ├── metricsbuilder/
│ │ │ ├── builder.go
│ │ │ └── builder_test.go
│ │ ├── otelmetrics/
│ │ │ ├── counter.go
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── gauge.go
│ │ │ ├── histogram.go
│ │ │ └── timer.go
│ │ ├── package.go
│ │ ├── prometheus/
│ │ │ ├── cache.go
│ │ │ ├── factory.go
│ │ │ └── factory_test.go
│ │ ├── stopwatch.go
│ │ └── timer.go
│ ├── metricstest/
│ │ ├── keys.go
│ │ ├── local.go
│ │ ├── local_test.go
│ │ ├── metricstest.go
│ │ ├── metricstest_test.go
│ │ └── package_test.go
│ ├── proto/
│ │ ├── api_v3/
│ │ │ └── query_service.pb.go
│ │ └── metrics/
│ │ ├── README.md
│ │ ├── openmetrics.proto
│ │ └── otelspankind.proto
│ ├── proto-gen/
│ │ ├── .gitignore
│ │ ├── api_v2/
│ │ │ └── metrics/
│ │ │ ├── openmetrics.pb.go
│ │ │ └── otelspankind.pb.go
│ │ ├── patch.sed
│ │ ├── storage/
│ │ │ └── v2/
│ │ │ ├── dependency_storage.pb.go
│ │ │ └── trace_storage.pb.go
│ │ ├── storage_v1/
│ │ │ ├── mocks/
│ │ │ │ └── mocks.go
│ │ │ └── storage.pb.go
│ │ └── zipkin/
│ │ └── zipkin.pb.go
│ ├── recoveryhandler/
│ │ ├── zap.go
│ │ └── zap_test.go
│ ├── safeexpvar/
│ │ ├── safeexpvar.go
│ │ └── safeexpvar_test.go
│ ├── sampling/
│ │ ├── grpc/
│ │ │ ├── grpc_handler.go
│ │ │ └── grpc_handler_test.go
│ │ ├── http/
│ │ │ ├── cfgmgr.go
│ │ │ ├── cfgmgr_test.go
│ │ │ ├── handler.go
│ │ │ ├── handler_test.go
│ │ │ └── package_test.go
│ │ └── samplingstrategy/
│ │ ├── adaptive/
│ │ │ ├── README.md
│ │ │ ├── aggregator.go
│ │ │ ├── aggregator_test.go
│ │ │ ├── cache.go
│ │ │ ├── cache_test.go
│ │ │ ├── calculationstrategy/
│ │ │ │ ├── interface.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── percentage_increase_capped_calculator.go
│ │ │ │ └── percentage_increase_capped_calculator_test.go
│ │ │ ├── floatutils.go
│ │ │ ├── floatutils_test.go
│ │ │ ├── options.go
│ │ │ ├── options_test.go
│ │ │ ├── package_test.go
│ │ │ ├── post_aggregator.go
│ │ │ ├── post_aggregator_test.go
│ │ │ ├── provider.go
│ │ │ ├── provider_test.go
│ │ │ ├── weightvectorcache.go
│ │ │ └── weightvectorcache_test.go
│ │ ├── aggregator.go
│ │ ├── empty_test.go
│ │ ├── factory.go
│ │ ├── file/
│ │ │ ├── constants.go
│ │ │ ├── fixtures/
│ │ │ │ ├── TestServiceNoPerOperationStrategiesDeprecatedBehavior_ServiceA.json
│ │ │ │ ├── TestServiceNoPerOperationStrategiesDeprecatedBehavior_ServiceB.json
│ │ │ │ ├── TestServiceNoPerOperationStrategies_ServiceA.json
│ │ │ │ ├── TestServiceNoPerOperationStrategies_ServiceB.json
│ │ │ │ ├── bad_strategies.json
│ │ │ │ ├── missing-service-types.json
│ │ │ │ ├── operation_strategies.json
│ │ │ │ ├── service_no_per_operation.json
│ │ │ │ └── strategies.json
│ │ │ ├── options.go
│ │ │ ├── package_test.go
│ │ │ ├── provider.go
│ │ │ ├── provider_test.go
│ │ │ └── strategy.go
│ │ └── provider.go
│ ├── storage/
│ │ ├── cassandra/
│ │ │ ├── config/
│ │ │ │ ├── config.go
│ │ │ │ ├── config_test.go
│ │ │ │ └── package_test.go
│ │ │ ├── empty_test.go
│ │ │ ├── gocql/
│ │ │ │ ├── empty_test.go
│ │ │ │ ├── gocql.go
│ │ │ │ └── testutils/
│ │ │ │ ├── udt.go
│ │ │ │ └── udt_test.go
│ │ │ ├── metrics/
│ │ │ │ ├── table.go
│ │ │ │ └── table_test.go
│ │ │ ├── mocks/
│ │ │ │ └── mocks.go
│ │ │ └── session.go
│ │ ├── distributedlock/
│ │ │ └── cassandra/
│ │ │ ├── lock.go
│ │ │ └── lock_test.go
│ │ ├── elasticsearch/
│ │ │ ├── client/
│ │ │ │ ├── basic_auth.go
│ │ │ │ ├── basic_auth_test.go
│ │ │ │ ├── client.go
│ │ │ │ ├── cluster_client.go
│ │ │ │ ├── cluster_client_test.go
│ │ │ │ ├── ilm_client.go
│ │ │ │ ├── ilm_client_test.go
│ │ │ │ ├── index_client.go
│ │ │ │ ├── index_client_test.go
│ │ │ │ ├── interfaces.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ └── package_test.go
│ │ │ ├── client.go
│ │ │ ├── config/
│ │ │ │ ├── auth_helper.go
│ │ │ │ ├── auth_helper_test.go
│ │ │ │ ├── config.go
│ │ │ │ └── config_test.go
│ │ │ ├── dbmodel/
│ │ │ │ ├── dot_replacer.go
│ │ │ │ ├── dot_replacer_test.go
│ │ │ │ ├── model.go
│ │ │ │ └── package_test.go
│ │ │ ├── empty_test.go
│ │ │ ├── errors.go
│ │ │ ├── errors_test.go
│ │ │ ├── filter/
│ │ │ │ ├── alias.go
│ │ │ │ ├── alias_test.go
│ │ │ │ ├── date.go
│ │ │ │ ├── date_test.go
│ │ │ │ └── package_test.go
│ │ │ ├── mocks/
│ │ │ │ └── mocks.go
│ │ │ ├── query/
│ │ │ │ ├── range_query.go
│ │ │ │ └── range_query_test.go
│ │ │ ├── textTemplate.go
│ │ │ ├── textTemplate_test.go
│ │ │ └── wrapper/
│ │ │ ├── empty_test.go
│ │ │ ├── wrapper.go
│ │ │ └── wrapper_nolint.go
│ │ ├── integration/
│ │ │ ├── badgerstore_test.go
│ │ │ ├── cassandra_test.go
│ │ │ ├── dates.go
│ │ │ ├── dates_test.go
│ │ │ ├── elasticsearch_test.go
│ │ │ ├── es_index_cleaner_test.go
│ │ │ ├── es_index_rollover_test.go
│ │ │ ├── fixtures/
│ │ │ │ ├── grpc_plugin_conf.yaml
│ │ │ │ ├── queries.json
│ │ │ │ ├── queries_es.json
│ │ │ │ └── traces/
│ │ │ │ ├── default.json
│ │ │ │ ├── dur_trace.json
│ │ │ │ ├── example_trace.json
│ │ │ │ ├── log_tags_trace.json
│ │ │ │ ├── max_dur_trace.json
│ │ │ │ ├── multi_index_trace.json
│ │ │ │ ├── multi_spot_tags_trace.json
│ │ │ │ ├── multiple1_trace.json
│ │ │ │ ├── multiple2_trace.json
│ │ │ │ ├── multiple3_trace.json
│ │ │ │ ├── multispottag_dur_trace.json
│ │ │ │ ├── multispottag_maxdur_trace.json
│ │ │ │ ├── multispottag_opname_dur_trace.json
│ │ │ │ ├── multispottag_opname_maxdur_trace.json
│ │ │ │ ├── multispottag_opname_trace.json
│ │ │ │ ├── opname_dur_trace.json
│ │ │ │ ├── opname_maxdur_trace.json
│ │ │ │ ├── opname_trace.json
│ │ │ │ ├── process_tags_trace.json
│ │ │ │ ├── scope_name_version_trace.json
│ │ │ │ ├── span_tags_trace.json
│ │ │ │ ├── tags_dur_trace.json
│ │ │ │ ├── tags_escaped_operator_trace_1.json
│ │ │ │ ├── tags_escaped_operator_trace_2.json
│ │ │ │ ├── tags_maxdur_trace.json
│ │ │ │ ├── tags_opname_dur_trace.json
│ │ │ │ ├── tags_opname_maxdur_trace.json
│ │ │ │ ├── tags_opname_trace.json
│ │ │ │ ├── tags_wildcard_regex_1.json
│ │ │ │ └── tags_wildcard_regex_2.json
│ │ │ ├── grpc_test.go
│ │ │ ├── integration.go
│ │ │ ├── memstore_test.go
│ │ │ ├── package_test.go
│ │ │ ├── remote_memory_storage.go
│ │ │ ├── trace_compare.go
│ │ │ └── trace_compare_test.go
│ │ ├── metricstore/
│ │ │ ├── disabled/
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ └── reader_test.go
│ │ │ ├── elasticsearch/
│ │ │ │ ├── README.md
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── processor.go
│ │ │ │ ├── processor_test.go
│ │ │ │ ├── query_builder.go
│ │ │ │ ├── query_builder_test.go
│ │ │ │ ├── query_logger.go
│ │ │ │ ├── query_logger_test.go
│ │ │ │ ├── reader.go
│ │ │ │ ├── reader_test.go
│ │ │ │ ├── testdata/
│ │ │ │ │ ├── output_call_rate.json
│ │ │ │ │ ├── output_call_rate_operation.json
│ │ │ │ │ ├── output_empty.json
│ │ │ │ │ ├── output_error_es.json
│ │ │ │ │ ├── output_error_latencies.json
│ │ │ │ │ ├── output_errors_rate.json
│ │ │ │ │ ├── output_errors_rate_operation.json
│ │ │ │ │ ├── output_latencies.json
│ │ │ │ │ ├── output_latencies_50.json
│ │ │ │ │ ├── output_latencies_75.json
│ │ │ │ │ ├── output_latencies_95.json
│ │ │ │ │ ├── output_latencies_operation.json
│ │ │ │ │ └── output_valid_es.json
│ │ │ │ ├── to_domain.go
│ │ │ │ └── to_domain_test.go
│ │ │ ├── factory.go
│ │ │ ├── factory_config.go
│ │ │ ├── factory_config_test.go
│ │ │ ├── factory_test.go
│ │ │ ├── package_test.go
│ │ │ └── prometheus/
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── metricstore/
│ │ │ │ ├── dbmodel/
│ │ │ │ │ ├── to_domain.go
│ │ │ │ │ └── to_domain_test.go
│ │ │ │ ├── reader.go
│ │ │ │ ├── reader_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── empty_response.json
│ │ │ │ ├── service_datapoint_response.json
│ │ │ │ ├── service_span_name_datapoint_response.json
│ │ │ │ └── warning_response.json
│ │ │ ├── options.go
│ │ │ └── options_test.go
│ │ ├── v1/
│ │ │ ├── api/
│ │ │ │ ├── README.md
│ │ │ │ ├── dependencystore/
│ │ │ │ │ ├── empty_test.go
│ │ │ │ │ ├── interface.go
│ │ │ │ │ └── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── empty_test.go
│ │ │ │ ├── metricstore/
│ │ │ │ │ ├── empty_test.go
│ │ │ │ │ ├── interface.go
│ │ │ │ │ ├── metricstoremetrics/
│ │ │ │ │ │ ├── decorator.go
│ │ │ │ │ │ └── decorator_test.go
│ │ │ │ │ └── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── samplingstore/
│ │ │ │ │ ├── empty_test.go
│ │ │ │ │ ├── interface.go
│ │ │ │ │ ├── mocks/
│ │ │ │ │ │ └── mocks.go
│ │ │ │ │ └── model/
│ │ │ │ │ ├── empty_test.go
│ │ │ │ │ └── sampling.go
│ │ │ │ └── spanstore/
│ │ │ │ ├── interface.go
│ │ │ │ ├── interface_test.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ └── spanstoremetrics/
│ │ │ │ ├── package_test.go
│ │ │ │ ├── read_metrics.go
│ │ │ │ ├── read_metrics_test.go
│ │ │ │ ├── write_metrics.go
│ │ │ │ └── write_metrics_test.go
│ │ │ ├── badger/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.go
│ │ │ │ ├── config_test.go
│ │ │ │ ├── dependencystore/
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── storage.go
│ │ │ │ │ ├── storage_internal_test.go
│ │ │ │ │ └── storage_test.go
│ │ │ │ ├── docs/
│ │ │ │ │ ├── storage-file-non-root-permission.md
│ │ │ │ │ └── upgrade-v1-to-v3.md
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ ├── lock.go
│ │ │ │ ├── lock_test.go
│ │ │ │ ├── options.go
│ │ │ │ ├── options_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── samplingstore/
│ │ │ │ │ ├── storage.go
│ │ │ │ │ └── storage_test.go
│ │ │ │ ├── spanstore/
│ │ │ │ │ ├── cache.go
│ │ │ │ │ ├── cache_test.go
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── read_write_test.go
│ │ │ │ │ ├── reader.go
│ │ │ │ │ ├── rw_internal_test.go
│ │ │ │ │ └── writer.go
│ │ │ │ ├── stats.go
│ │ │ │ ├── stats_linux.go
│ │ │ │ ├── stats_linux_test.go
│ │ │ │ └── stats_test.go
│ │ │ ├── blackhole/
│ │ │ │ ├── blackhole.go
│ │ │ │ ├── blackhole_test.go
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ └── package_test.go
│ │ │ ├── cassandra/
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── dependencystore/
│ │ │ │ │ ├── bootstrap.go
│ │ │ │ │ ├── bootstrap_test.go
│ │ │ │ │ ├── model.go
│ │ │ │ │ ├── model_test.go
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── storage.go
│ │ │ │ │ └── storage_test.go
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ ├── helper.go
│ │ │ │ ├── options.go
│ │ │ │ ├── options_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── samplingstore/
│ │ │ │ │ ├── storage.go
│ │ │ │ │ └── storage_test.go
│ │ │ │ ├── savetracetest/
│ │ │ │ │ └── main.go
│ │ │ │ ├── schema/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── create.sh
│ │ │ │ │ ├── create.test.sh
│ │ │ │ │ ├── docker.sh
│ │ │ │ │ ├── migration/
│ │ │ │ │ │ ├── V002toV003.sh
│ │ │ │ │ │ ├── v001tov002part1.sh
│ │ │ │ │ │ └── v001tov002part2.sh
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── schema.go
│ │ │ │ │ ├── schema_test.go
│ │ │ │ │ ├── v001.cql.tmpl
│ │ │ │ │ ├── v002.cql.tmpl
│ │ │ │ │ ├── v003.cql.tmpl
│ │ │ │ │ ├── v004-go-tmpl.cql.tmpl
│ │ │ │ │ └── v004.cql.tmpl
│ │ │ │ └── spanstore/
│ │ │ │ ├── dbmodel/
│ │ │ │ │ ├── converter.go
│ │ │ │ │ ├── converter_test.go
│ │ │ │ │ ├── cql_udt.go
│ │ │ │ │ ├── cql_udt_test.go
│ │ │ │ │ ├── ids.go
│ │ │ │ │ ├── ids_test.go
│ │ │ │ │ ├── index_filter.go
│ │ │ │ │ ├── index_filter_test.go
│ │ │ │ │ ├── model.go
│ │ │ │ │ ├── model_test.go
│ │ │ │ │ ├── operation.go
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── tag_filter.go
│ │ │ │ │ ├── tag_filter_drop_all.go
│ │ │ │ │ ├── tag_filter_drop_all_test.go
│ │ │ │ │ ├── tag_filter_exact_match.go
│ │ │ │ │ ├── tag_filter_exact_match_test.go
│ │ │ │ │ ├── tag_filter_test.go
│ │ │ │ │ ├── unique_ids.go
│ │ │ │ │ ├── unique_ids_test.go
│ │ │ │ │ ├── unique_tags.go
│ │ │ │ │ └── unique_tags_test.go
│ │ │ │ ├── matchers_test.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── operation_names.go
│ │ │ │ ├── operation_names_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ ├── reader_test.go
│ │ │ │ ├── service_names.go
│ │ │ │ ├── service_names_test.go
│ │ │ │ ├── writer.go
│ │ │ │ ├── writer_options.go
│ │ │ │ ├── writer_options_test.go
│ │ │ │ └── writer_test.go
│ │ │ ├── configurable.go
│ │ │ ├── elasticsearch/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── README.md
│ │ │ │ ├── dependencystore/
│ │ │ │ │ ├── package_test.go
│ │ │ │ │ ├── storagev1.go
│ │ │ │ │ └── storagev1_test.go
│ │ │ │ ├── factory.go
│ │ │ │ ├── factory_test.go
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── tags_01.txt
│ │ │ │ │ └── tags_02.txt
│ │ │ │ ├── mappings/
│ │ │ │ │ ├── command.go
│ │ │ │ │ ├── command_test.go
│ │ │ │ │ ├── fixtures/
│ │ │ │ │ │ ├── jaeger-dependencies-6.json
│ │ │ │ │ │ ├── jaeger-dependencies-7.json
│ │ │ │ │ │ ├── jaeger-dependencies-8.json
│ │ │ │ │ │ ├── jaeger-sampling-6.json
│ │ │ │ │ │ ├── jaeger-sampling-7.json
│ │ │ │ │ │ ├── jaeger-sampling-8.json
│ │ │ │ │ │ ├── jaeger-service-6.json
│ │ │ │ │ │ ├── jaeger-service-7.json
│ │ │ │ │ │ ├── jaeger-service-8.json
│ │ │ │ │ │ ├── jaeger-span-6.json
│ │ │ │ │ │ ├── jaeger-span-7.json
│ │ │ │ │ │ └── jaeger-span-8.json
│ │ │ │ │ ├── flags.go
│ │ │ │ │ ├── flags_test.go
│ │ │ │ │ ├── jaeger-dependencies-6.json
│ │ │ │ │ ├── jaeger-dependencies-7.json
│ │ │ │ │ ├── jaeger-dependencies-8.json
│ │ │ │ │ ├── jaeger-sampling-6.json
│ │ │ │ │ ├── jaeger-sampling-7.json
│ │ │ │ │ ├── jaeger-sampling-8.json
│ │ │ │ │ ├── jaeger-service-6.json
│ │ │ │ │ ├── jaeger-service-7.json
│ │ │ │ │ ├── jaeger-service-8.json
│ │ │ │ │ ├── jaeger-span-6.json
│ │ │ │ │ ├── jaeger-span-7.json
│ │ │ │ │ ├── jaeger-span-8.json
│ │ │ │ │ ├── mapping.go
│ │ │ │ │ └── mapping_test.go
│ │ │ │ ├── options.go
│ │ │ │ ├── options_test.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── samplingstore/
│ │ │ │ │ ├── dbmodel/
│ │ │ │ │ │ ├── converter.go
│ │ │ │ │ │ ├── converter_test.go
│ │ │ │ │ │ └── model.go
│ │ │ │ │ ├── storage.go
│ │ │ │ │ └── storage_test.go
│ │ │ │ └── spanstore/
│ │ │ │ ├── core_span_reader.go
│ │ │ │ ├── fixtures/
│ │ │ │ │ ├── domain_01.json
│ │ │ │ │ ├── es_01.json
│ │ │ │ │ ├── query_01.json
│ │ │ │ │ ├── query_02.json
│ │ │ │ │ └── query_03.json
│ │ │ │ ├── from_domain.go
│ │ │ │ ├── from_domain_test.go
│ │ │ │ ├── index_utils.go
│ │ │ │ ├── json_span_compare_test.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ ├── reader_test.go
│ │ │ │ ├── readerv1.go
│ │ │ │ ├── readerv1_test.go
│ │ │ │ ├── service_operation.go
│ │ │ │ ├── service_operation_test.go
│ │ │ │ ├── to_domain.go
│ │ │ │ ├── to_domain_test.go
│ │ │ │ ├── writer.go
│ │ │ │ ├── writer_test.go
│ │ │ │ ├── writerv1.go
│ │ │ │ └── writerv1_test.go
│ │ │ ├── factory.go
│ │ │ ├── mocks/
│ │ │ │ └── mocks.go
│ │ │ └── package_test.go
│ │ └── v2/
│ │ ├── api/
│ │ │ ├── depstore/
│ │ │ │ ├── factory.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ └── writer.go
│ │ │ ├── package_test.go
│ │ │ └── tracestore/
│ │ │ ├── empty_test.go
│ │ │ ├── factory.go
│ │ │ ├── mocks/
│ │ │ │ └── mocks.go
│ │ │ ├── reader.go
│ │ │ ├── reader_test.go
│ │ │ ├── tracestoremetrics/
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader_metrics.go
│ │ │ │ └── reader_metrics_test.go
│ │ │ └── writer.go
│ │ ├── badger/
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ └── package_test.go
│ │ ├── cassandra/
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── package_test.go
│ │ │ └── tracestore/
│ │ │ ├── fixtures/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── cas_01.json
│ │ │ │ └── otel_traces_01.json
│ │ │ ├── from_dbmodel.go
│ │ │ ├── from_dbmodel_test.go
│ │ │ ├── package_test.go
│ │ │ ├── reader.go
│ │ │ ├── reader_test.go
│ │ │ ├── to_dbmodel.go
│ │ │ └── to_dbmodel_test.go
│ │ ├── clickhouse/
│ │ │ ├── README.md
│ │ │ ├── clickhousetest/
│ │ │ │ ├── package_test.go
│ │ │ │ └── server.go
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── depstore/
│ │ │ │ ├── package_test.go
│ │ │ │ ├── reader.go
│ │ │ │ └── reader_test.go
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── package_test.go
│ │ │ ├── sql/
│ │ │ │ ├── create_attribute_metadata_mv.sql
│ │ │ │ ├── create_attribute_metadata_table.sql
│ │ │ │ ├── create_event_attribute_metadata_mv.sql
│ │ │ │ ├── create_link_attribute_metadata_mv.sql
│ │ │ │ ├── create_operations_mv.sql
│ │ │ │ ├── create_operations_table.sql
│ │ │ │ ├── create_services_mv.sql
│ │ │ │ ├── create_services_table.sql
│ │ │ │ ├── create_spans_table.sql
│ │ │ │ ├── create_trace_id_timestamps_mv.sql
│ │ │ │ ├── create_trace_id_timestamps_table.sql
│ │ │ │ ├── package_test.go
│ │ │ │ └── queries.go
│ │ │ └── tracestore/
│ │ │ ├── assert_test.go
│ │ │ ├── attribute_metadata.go
│ │ │ ├── attribute_metadata_test.go
│ │ │ ├── dbmodel/
│ │ │ │ ├── attribute_metadata.go
│ │ │ │ ├── dbmodel_test.go
│ │ │ │ ├── from.go
│ │ │ │ ├── from_test.go
│ │ │ │ ├── operation.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── service.go
│ │ │ │ ├── spanrow.go
│ │ │ │ ├── to.go
│ │ │ │ └── to_test.go
│ │ │ ├── driver_test.go
│ │ │ ├── package_test.go
│ │ │ ├── query_builder.go
│ │ │ ├── query_builder_test.go
│ │ │ ├── reader.go
│ │ │ ├── reader_test.go
│ │ │ ├── snapshots/
│ │ │ │ ├── TestFindTraceIDs_1.sql
│ │ │ │ ├── TestFindTraceIDs_2.sql
│ │ │ │ ├── TestFindTraces_Success/
│ │ │ │ │ ├── multiple_spans_1.sql
│ │ │ │ │ └── single_span_1.sql
│ │ │ │ ├── TestFindTraces_WithFilters_1.sql
│ │ │ │ ├── TestFindTraces_WithFilters_2.sql
│ │ │ │ ├── TestGetOperations/
│ │ │ │ │ ├── successfully_returns_operations_by_kind_1.sql
│ │ │ │ │ └── successfully_returns_operations_for_all_kinds_1.sql
│ │ │ │ ├── TestGetServices/
│ │ │ │ │ └── successfully_returns_services_1.sql
│ │ │ │ ├── TestGetTraces_Success/
│ │ │ │ │ ├── multiple_spans_1.sql
│ │ │ │ │ ├── single_span_1.sql
│ │ │ │ │ └── with_time_range_1.sql
│ │ │ │ └── TestWriter_Success_1.sql
│ │ │ ├── spans_test.go
│ │ │ ├── writer.go
│ │ │ └── writer_test.go
│ │ ├── elasticsearch/
│ │ │ ├── depstore/
│ │ │ │ ├── dbmodel/
│ │ │ │ │ ├── converter.go
│ │ │ │ │ ├── converter_test.go
│ │ │ │ │ └── model.go
│ │ │ │ ├── mocks/
│ │ │ │ │ └── mocks.go
│ │ │ │ ├── storage.go
│ │ │ │ ├── storage_test.go
│ │ │ │ ├── storagev2.go
│ │ │ │ └── storagev2_test.go
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── package_test.go
│ │ │ └── tracestore/
│ │ │ ├── fixtures/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── es_01.json
│ │ │ │ ├── es_01_string_tags.json
│ │ │ │ └── otel_traces_01.json
│ │ │ ├── from_dbmodel.go
│ │ │ ├── from_dbmodel_test.go
│ │ │ ├── ids.go
│ │ │ ├── package_test.go
│ │ │ ├── reader.go
│ │ │ ├── reader_test.go
│ │ │ ├── to_dbmodel.go
│ │ │ ├── to_dbmodel_test.go
│ │ │ ├── writer.go
│ │ │ └── writer_test.go
│ │ ├── grpc/
│ │ │ ├── README.md
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── depreader.go
│ │ │ ├── depreader_test.go
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── handler.go
│ │ │ ├── handler_test.go
│ │ │ ├── package_test.go
│ │ │ ├── tracereader.go
│ │ │ ├── tracereader_test.go
│ │ │ ├── tracewriter.go
│ │ │ └── tracewriter_test.go
│ │ ├── memory/
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ ├── factory.go
│ │ │ ├── factory_test.go
│ │ │ ├── fixtures/
│ │ │ │ ├── db_traces_01.json
│ │ │ │ ├── db_traces_02.json
│ │ │ │ └── otel_traces_01.json
│ │ │ ├── lock.go
│ │ │ ├── lock_test.go
│ │ │ ├── memory.go
│ │ │ ├── memory_test.go
│ │ │ ├── package_test.go
│ │ │ ├── sampling.go
│ │ │ ├── sampling_test.go
│ │ │ └── tenant.go
│ │ └── v1adapter/
│ │ ├── README.md
│ │ ├── depreader.go
│ │ ├── depreader_test.go
│ │ ├── factory.go
│ │ ├── factory_test.go
│ │ ├── otelids.go
│ │ ├── otelids_test.go
│ │ ├── package_test.go
│ │ ├── spanreader.go
│ │ ├── spanreader_test.go
│ │ ├── spanwriter.go
│ │ ├── spanwriter_test.go
│ │ ├── tracereader.go
│ │ ├── tracereader_test.go
│ │ ├── tracewriter.go
│ │ ├── tracewriter_test.go
│ │ ├── translator.go
│ │ └── translator_test.go
│ ├── telemetry/
│ │ ├── otelsemconv/
│ │ │ ├── empty_test.go
│ │ │ ├── semconv.go
│ │ │ └── semconv_test.go
│ │ ├── settings.go
│ │ └── settings_test.go
│ ├── tenancy/
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── flags.go
│ │ ├── flags_test.go
│ │ ├── grpc.go
│ │ ├── grpc_test.go
│ │ ├── http.go
│ │ ├── http_test.go
│ │ ├── manage_test.go
│ │ ├── manager.go
│ │ └── package_test.go
│ ├── testutils/
│ │ ├── leakcheck.go
│ │ ├── leakcheck_test.go
│ │ ├── logger.go
│ │ └── logger_test.go
│ ├── tools/
│ │ ├── empty.go
│ │ ├── go.mod
│ │ ├── go.sum
│ │ └── tools.go
│ ├── tracegen/
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── package_test.go
│ │ ├── worker.go
│ │ └── worker_test.go
│ ├── uimodel/
│ │ ├── converter/
│ │ │ └── v1/
│ │ │ └── json/
│ │ │ ├── doc.go
│ │ │ ├── fixtures/
│ │ │ │ ├── domain_01.json
│ │ │ │ ├── domain_es_01.json
│ │ │ │ ├── es_01.json
│ │ │ │ └── ui_01.json
│ │ │ ├── from_domain.go
│ │ │ ├── from_domain_test.go
│ │ │ ├── json_span_compare_test.go
│ │ │ ├── package_test.go
│ │ │ ├── process_hashtable.go
│ │ │ ├── process_hashtable_test.go
│ │ │ ├── sampling.go
│ │ │ └── sampling_test.go
│ │ ├── doc.go
│ │ ├── empty_test.go
│ │ └── model.go
│ └── version/
│ ├── build.go
│ ├── build_test.go
│ ├── command.go
│ ├── command_test.go
│ ├── handler.go
│ ├── handler_test.go
│ └── package_test.go
├── monitoring/
│ └── jaeger-mixin/
│ ├── README.md
│ ├── alerts.libsonnet
│ ├── dashboard-for-grafana.json
│ ├── dashboards.libsonnet
│ ├── jsonnetfile.json
│ ├── mixin.libsonnet
│ ├── monitoring-setup.example.jsonnet
│ ├── prometheus_alerts.yml
│ └── prometheus_alerts_v2.yml
├── ports/
│ ├── ports.go
│ └── ports_test.go
├── renovate.json
└── scripts/
├── build/
│ ├── build-all-in-one-image.sh
│ ├── build-hotrod-image.sh
│ ├── build-upload-a-docker-image.sh
│ ├── build-upload-docker-images.sh
│ ├── clean-binaries.sh
│ ├── docker/
│ │ ├── base/
│ │ │ └── Dockerfile
│ │ └── debug/
│ │ ├── Dockerfile
│ │ ├── go.mod
│ │ ├── go.sum
│ │ └── tools.go
│ ├── package-deploy.sh
│ ├── rebuild-ui.sh
│ └── upload-docker-readme.sh
├── e2e/
│ ├── adaptive-sampling-integration-test.sh
│ ├── cassandra.sh
│ ├── clickhouse.sh
│ ├── compare_metrics.py
│ ├── elasticsearch.sh
│ ├── filter_coverage.py
│ ├── kafka.sh
│ ├── metrics_summary.py
│ ├── metrics_summary.sh
│ └── spm.sh
├── lint/
│ ├── check-go-version.sh
│ ├── check-goleak-files.sh
│ ├── check-jaeger-idl-version.sh
│ ├── check-semconv-version.sh
│ ├── check-test-files.sh
│ ├── dco_check.py
│ ├── import-order-cleanup.py
│ ├── replace_license_headers.py
│ ├── update-semconv-version.sh
│ └── updateLicense.py
├── makefiles/
│ ├── BuildBinaries.mk
│ ├── BuildInfo.mk
│ ├── Docker.mk
│ ├── IntegrationTests.mk
│ ├── Protobuf.mk
│ ├── Tools.mk
│ └── Windows.mk
├── release/
│ ├── draft.py
│ ├── formatter.py
│ ├── notes.py
│ ├── prepare.sh
│ ├── rotate-managers.py
│ ├── start.sh
│ └── update-changelog.py
└── utils/
├── compare_metrics.py
├── compute-tags.sh
├── compute-tags.test.sh
├── compute-version.sh
├── docker-login.sh
├── find-official-remote.sh
├── generate-help-output.sh
├── ids-to-base64.py
├── metrics-md.py
├── platforms-to-gh-matrix.sh
└── run-tests.sh
Showing preview only (710K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7236 symbols across 736 files)
FILE: .github/scripts/ci-summary-report-publish.js
constant COMMENT_TAG (line 30) | const COMMENT_TAG = '<!-- ci-summary-report -->';
function safeNum (line 39) | function safeNum(v) {
constant METRIC_NAME_RE (line 46) | const METRIC_NAME_RE = /^[a-zA-Z_:][a-zA-Z0-9_:]*$/;
constant MAX_METRIC_NAME_LEN (line 47) | const MAX_METRIC_NAME_LEN = 200;
constant MAX_SNAPSHOT_NAME_LEN (line 48) | const MAX_SNAPSHOT_NAME_LEN = 200;
constant MAX_SNAPSHOTS (line 49) | const MAX_SNAPSHOTS = 50;
constant MAX_METRIC_NAMES_PER_SNAPSHOT (line 50) | const MAX_METRIC_NAMES_PER_SNAPSHOT = 200;
constant SNAPSHOT_NAME_RE (line 53) | const SNAPSHOT_NAME_RE = /^[a-zA-Z0-9_.\-]+$/;
function sanitizeMetricName (line 61) | function sanitizeMetricName(name) {
function sanitizeSnapshots (line 74) | function sanitizeSnapshots(raw) {
function computeMetrics (line 111) | function computeMetrics(s) {
function computeCoverage (line 137) | function computeCoverage(s) {
function formatMetricsDetail (line 163) | function formatMetricsDetail(snapshots) {
function buildCommentBody (line 206) | function buildCommentBody(metricsText, coverageText, footer, { metricsSn...
function postCheckRun (line 240) | async function postCheckRun(github, owner, repo, headSha, name, conclusi...
function postOrUpdateComment (line 266) | async function postOrUpdateComment(github, owner, repo, prNumber, body, ...
function handler (line 305) | async function handler({ github, core, fs, inputs }) {
FILE: .github/scripts/list-open-prs-by-author.js
function fetchOpenPRsByAuthor (line 20) | async function fetchOpenPRsByAuthor(octokit, owner, repo) {
function displayResults (line 64) | function displayResults(prsByAuthor) {
function displayCSV (line 108) | function displayCSV(prsByAuthor) {
function main (line 121) | async function main() {
FILE: .github/scripts/pr-quota-manager.js
constant LABEL_NAME (line 15) | const LABEL_NAME = 'pr-quota-reached';
constant LABEL_COLOR (line 16) | const LABEL_COLOR = 'CFD3D7';
function formatStatus (line 24) | function formatStatus(openCount, quota) {
function calculateQuota (line 33) | function calculateQuota(mergedCount) {
function fetchAuthorPRs (line 49) | async function fetchAuthorPRs(octokit, owner, repo, author) {
function processQuotaForAuthor (line 118) | async function processQuotaForAuthor(octokit, owner, repo, author, logge...
function ensureLabelExists (line 206) | async function ensureLabelExists(octokit, owner, repo, logger) {
function addLabel (line 232) | async function addLabel(octokit, owner, repo, issueNumber, logger) {
function removeLabel (line 248) | async function removeLabel(octokit, owner, repo, issueNumber, logger) {
function hasBlockingComment (line 267) | async function hasBlockingComment(octokit, owner, repo, issueNumber) {
function postBlockingComment (line 284) | async function postBlockingComment(octokit, owner, repo, issueNumber, au...
function postUnblockingComment (line 314) | async function postUnblockingComment(octokit, owner, repo, issueNumber, ...
function main (line 337) | async function main() {
function githubActionHandler (line 374) | async function githubActionHandler({github, core, username, owner, repo,...
FILE: .github/scripts/waiting-for-author.js
function addLabel (line 107) | async function addLabel(github, owner, repo, issueNumber, label, logger) {
function removeLabel (line 132) | async function removeLabel(github, owner, repo, issueNumber, label, logg...
function isMaintainer (line 158) | async function isMaintainer(github, owner, repo, username, logger) {
FILE: cmd/anonymizer/app/anonymizer/anonymizer.go
constant PermUserRW (line 32) | PermUserRW = 0o600
type mapping (line 36) | type mapping struct
type Anonymizer (line 46) | type Anonymizer struct
method Stop (line 102) | func (a *Anonymizer) Stop() {
method SaveMapping (line 110) | func (a *Anonymizer) SaveMapping() {
method mapServiceName (line 125) | func (a *Anonymizer) mapServiceName(service string) string {
method mapOperationName (line 129) | func (a *Anonymizer) mapOperationName(service, operation string) string {
method mapString (line 134) | func (a *Anonymizer) mapString(v string, m map[string]string) string {
method AnonymizeSpan (line 152) | func (a *Anonymizer) AnonymizeSpan(span *model.Span) *uimodel.Span {
type Options (line 57) | type Options struct
function New (line 66) | func New(mappingFile string, options Options, logger *zap.Logger) *Anony...
function hash (line 145) | func hash(value string) string {
function filterStandardTags (line 191) | func filterStandardTags(tags []model.KeyValue) []model.KeyValue {
function filterCustomTags (line 215) | func filterCustomTags(tags []model.KeyValue) []model.KeyValue {
function hashTags (line 227) | func hashTags(tags []model.KeyValue) []model.KeyValue {
FILE: cmd/anonymizer/app/anonymizer/anonymizer_test.go
function TestNew (line 70) | func TestNew(t *testing.T) {
function TestAnonymizer_SaveMapping (line 95) | func TestAnonymizer_SaveMapping(t *testing.T) {
function TestAnonymizer_FilterStandardTags (line 128) | func TestAnonymizer_FilterStandardTags(t *testing.T) {
function TestAnonymizer_FilterCustomTags (line 137) | func TestAnonymizer_FilterCustomTags(t *testing.T) {
function TestAnonymizer_Hash (line 145) | func TestAnonymizer_Hash(t *testing.T) {
function TestAnonymizer_AnonymizeSpan_AllTrue (line 152) | func TestAnonymizer_AnonymizeSpan_AllTrue(t *testing.T) {
function TestAnonymizer_AnonymizeSpan_AllFalse (line 171) | func TestAnonymizer_AnonymizeSpan_AllFalse(t *testing.T) {
function TestAnonymizer_MapString_Present (line 190) | func TestAnonymizer_MapString_Present(t *testing.T) {
function TestAnonymizer_MapString_Absent (line 200) | func TestAnonymizer_MapString_Absent(t *testing.T) {
function TestAnonymizer_MapServiceName (line 208) | func TestAnonymizer_MapServiceName(t *testing.T) {
function TestAnonymizer_MapOperationName (line 220) | func TestAnonymizer_MapOperationName(t *testing.T) {
FILE: cmd/anonymizer/app/anonymizer/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/anonymizer/app/flags.go
type Options (line 11) | type Options struct
method AddFlags (line 38) | func (o *Options) AddFlags(command *cobra.Command) {
constant queryGRPCHostPortFlag (line 25) | queryGRPCHostPortFlag = "query-host-port"
constant outputDirFlag (line 26) | outputDirFlag = "output-dir"
constant traceIDFlag (line 27) | traceIDFlag = "trace-id"
constant hashStandardTagsFlag (line 28) | hashStandardTagsFlag = "hash-standard-tags"
constant hashCustomTagsFlag (line 29) | hashCustomTagsFlag = "hash-custom-tags"
constant hashLogsFlag (line 30) | hashLogsFlag = "hash-logs"
constant hashProcessFlag (line 31) | hashProcessFlag = "hash-process"
constant maxSpansCount (line 32) | maxSpansCount = "max-spans-count"
constant startTime (line 33) | startTime = "start-time"
constant endTime (line 34) | endTime = "end-time"
FILE: cmd/anonymizer/app/flags_test.go
function TestOptionsWithDefaultFlags (line 15) | func TestOptionsWithDefaultFlags(t *testing.T) {
function TestOptionsWithFlags (line 31) | func TestOptionsWithFlags(t *testing.T) {
function TestMain (line 61) | func TestMain(m *testing.M) {
FILE: cmd/anonymizer/app/query/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/anonymizer/app/query/query.go
type Query (line 24) | type Query struct
method QueryTrace (line 53) | func (q *Query) QueryTrace(traceID string, startTime time.Time, endTim...
method Close (line 82) | func (q *Query) Close() error {
function New (line 30) | func New(addr string) (*Query, error) {
function unwrapNotFoundErr (line 43) | func unwrapNotFoundErr(err error) error {
FILE: cmd/anonymizer/app/query/query_test.go
type testGRPCHandler (line 52) | type testGRPCHandler struct
method GetTrace (line 60) | func (g *testGRPCHandler) GetTrace(r *api_v2.GetTraceRequest, stream a...
method sendSpanChunks (line 85) | func (*testGRPCHandler) sendSpanChunks(spans []*model.Span, sendFn fun...
type mockQueryClient (line 93) | type mockQueryClient struct
method GetTrace (line 98) | func (m *mockQueryClient) GetTrace(ctx context.Context, in *api_v2.Get...
type testServer (line 105) | type testServer struct
function newTestServer (line 111) | func newTestServer(t *testing.T) *testServer {
function TestNew (line 139) | func TestNew(t *testing.T) {
function TestClose (line 159) | func TestClose(t *testing.T) {
function TestQueryTrace (line 166) | func TestQueryTrace(t *testing.T) {
function TestUnwrapNotFoundErr (line 232) | func TestUnwrapNotFoundErr(t *testing.T) {
FILE: cmd/anonymizer/app/uiconv/extractor.go
type extractor (line 18) | type extractor struct
method Run (line 42) | func (e *extractor) Run() error {
function newExtractor (line 26) | func newExtractor(uiFile string, traceID string, reader *spanReader, log...
FILE: cmd/anonymizer/app/uiconv/extractor_test.go
type UITrace (line 18) | type UITrace struct
function TestExtractorTraceSuccess (line 22) | func TestExtractorTraceSuccess(t *testing.T) {
function TestExtractorTraceOutputFileError (line 51) | func TestExtractorTraceOutputFileError(t *testing.T) {
function TestExtractorTraceScanError (line 72) | func TestExtractorTraceScanError(t *testing.T) {
function loadJSON (line 92) | func loadJSON(t *testing.T, fileName string, i any) {
FILE: cmd/anonymizer/app/uiconv/module.go
type Config (line 11) | type Config struct
function Extract (line 19) | func Extract(config Config, logger *zap.Logger) error {
FILE: cmd/anonymizer/app/uiconv/module_test.go
function TestModule_TraceSuccess (line 17) | func TestModule_TraceSuccess(t *testing.T) {
function TestModule_TraceNonExistent (line 40) | func TestModule_TraceNonExistent(t *testing.T) {
function TestModule_TraceOutputFileError (line 54) | func TestModule_TraceOutputFileError(t *testing.T) {
FILE: cmd/anonymizer/app/uiconv/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/anonymizer/app/uiconv/reader.go
type spanReader (line 21) | type spanReader struct
method NextSpan (line 45) | func (r *spanReader) NextSpan() (*uimodel.Span, error) {
function newSpanReader (line 30) | func newSpanReader(capturedFile string, logger *zap.Logger) (*spanReader...
FILE: cmd/anonymizer/app/uiconv/reader_test.go
function TestReaderTraceSuccess (line 14) | func TestReaderTraceSuccess(t *testing.T) {
function TestReaderTraceNonExistent (line 39) | func TestReaderTraceNonExistent(t *testing.T) {
function TestReaderTraceEmpty (line 45) | func TestReaderTraceEmpty(t *testing.T) {
function TestReaderTraceWrongFormat (line 56) | func TestReaderTraceWrongFormat(t *testing.T) {
function TestReaderTraceInvalidJson (line 67) | func TestReaderTraceInvalidJson(t *testing.T) {
FILE: cmd/anonymizer/app/writer/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/anonymizer/app/writer/writer.go
type Config (line 24) | type Config struct
type Writer (line 33) | type Writer struct
method WriteSpan (line 89) | func (w *Writer) WriteSpan(msg *model.Span) error {
method Close (line 132) | func (w *Writer) Close() {
function New (line 44) | func New(config Config, logger *zap.Logger) (*Writer, error) {
FILE: cmd/anonymizer/app/writer/writer_test.go
function TestNew (line 46) | func TestNew(t *testing.T) {
function TestWriter_WriteSpan (line 83) | func TestWriter_WriteSpan(t *testing.T) {
FILE: cmd/anonymizer/main.go
function main (line 25) | func main() {
function initTime (line 103) | func initTime(ts int64) time.Time {
FILE: cmd/es-index-cleaner/app/cutoff_time.go
function CalculateDeletionCutoff (line 10) | func CalculateDeletionCutoff(currTime time.Time, numOfDays int, relative...
FILE: cmd/es-index-cleaner/app/cutoff_time_test.go
function TestCalculateDeletionCutoff (line 13) | func TestCalculateDeletionCutoff(t *testing.T) {
FILE: cmd/es-index-cleaner/app/flags.go
constant indexPrefix (line 17) | indexPrefix = "index-prefix"
constant archive (line 18) | archive = "archive"
constant rollover (line 19) | rollover = "rollover"
constant timeout (line 20) | timeout = "timeout"
constant indexDateSeparator (line 21) | indexDateSeparator = "index-date-separator"
constant username (line 22) | username = "es.username"
constant password (line 23) | password = "es.password"
type Config (line 29) | type Config struct
method AddFlags (line 42) | func (*Config) AddFlags(flags *flag.FlagSet) {
method InitFromViper (line 55) | func (c *Config) InitFromViper(v *viper.Viper) error {
FILE: cmd/es-index-cleaner/app/flags_test.go
function TestBindFlags (line 16) | func TestBindFlags(t *testing.T) {
function TestInitFromViper_TLSError (line 46) | func TestInitFromViper_TLSError(t *testing.T) {
FILE: cmd/es-index-cleaner/app/index_filter.go
type IndexFilter (line 16) | type IndexFilter struct
method Filter (line 30) | func (i *IndexFilter) Filter(indices []client.Index) []client.Index {
method filterByPattern (line 35) | func (i *IndexFilter) filterByPattern(indices []client.Index) []client...
FILE: cmd/es-index-cleaner/app/index_filter_test.go
function TestIndexFilter (line 15) | func TestIndexFilter(t *testing.T) {
function TestIndexFilterWithPrefix (line 19) | func TestIndexFilterWithPrefix(t *testing.T) {
function runIndexFilterTest (line 23) | func runIndexFilterTest(t *testing.T, prefix string) {
FILE: cmd/es-index-cleaner/app/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/es-index-cleaner/main.go
function init (line 29) | func init() {
function main (line 39) | func main() {
function basicAuth (line 123) | func basicAuth(username, password string) string {
FILE: cmd/es-rollover/app/actions.go
function newESClient (line 19) | func newESClient(endpoint string, cfg *Config, tlsCfg *tls.Config) clien...
type Action (line 35) | type Action interface
type ActionExecuteOptions (line 40) | type ActionExecuteOptions struct
type ActionCreatorFunction (line 47) | type ActionCreatorFunction
function ExecuteAction (line 50) | func ExecuteAction(opts ActionExecuteOptions, createAction ActionCreator...
FILE: cmd/es-rollover/app/actions_test.go
type dummyAction (line 21) | type dummyAction struct
method Do (line 25) | func (a *dummyAction) Do() error {
function TestExecuteAction (line 29) | func TestExecuteAction(t *testing.T) {
function TestExecuteAction_ConfigError (line 103) | func TestExecuteAction_ConfigError(t *testing.T) {
FILE: cmd/es-rollover/app/flags.go
constant indexPrefix (line 18) | indexPrefix = "index-prefix"
constant archive (line 19) | archive = "archive"
constant username (line 20) | username = "es.username"
constant password (line 21) | password = "es.password"
constant useILM (line 22) | useILM = "es.use-ilm"
constant ilmPolicyName (line 23) | ilmPolicyName = "es.ilm-policy-name"
constant timeout (line 24) | timeout = "timeout"
constant skipDependencies (line 25) | skipDependencies = "skip-dependencies"
constant adaptiveSampling (line 26) | adaptiveSampling = "adaptive-sampling"
type Config (line 30) | type Config struct
method InitFromViper (line 59) | func (c *Config) InitFromViper(v *viper.Viper) error {
function AddFlags (line 45) | func AddFlags(flags *flag.FlagSet) {
FILE: cmd/es-rollover/app/flags_test.go
function TestBindFlags (line 16) | func TestBindFlags(t *testing.T) {
function TestInitFromViper_TLSError (line 49) | func TestInitFromViper_TLSError(t *testing.T) {
FILE: cmd/es-rollover/app/index_options.go
constant writeAliasFormat (line 12) | writeAliasFormat = "%s-write"
constant readAliasFormat (line 13) | readAliasFormat = "%s-read"
constant rolloverIndexFormat (line 14) | rolloverIndexFormat = "%s-000001"
type IndexOption (line 18) | type IndexOption struct
method IndexName (line 68) | func (i *IndexOption) IndexName() string {
method ReadAliasName (line 73) | func (i *IndexOption) ReadAliasName() string {
method WriteAliasName (line 78) | func (i *IndexOption) WriteAliasName() string {
method InitialRolloverIndex (line 83) | func (i *IndexOption) InitialRolloverIndex() string {
method TemplateName (line 88) | func (i *IndexOption) TemplateName() string {
function RolloverIndices (line 25) | func RolloverIndices(archive bool, skipDependencies bool, adaptiveSampli...
FILE: cmd/es-rollover/app/index_options_test.go
function TestRolloverIndices (line 12) | func TestRolloverIndices(t *testing.T) {
FILE: cmd/es-rollover/app/init/action.go
constant ilmVersionSupport (line 18) | ilmVersionSupport = 7
type Action (line 21) | type Action struct
method getMapping (line 28) | func (c Action) getMapping(version uint, mappingType mappings.MappingT...
method Do (line 42) | func (c Action) Do() error {
method init (line 86) | func (c Action) init(version uint, indexopt app.IndexOption) error {
function createIndexIfNotExist (line 68) | func createIndexIfNotExist(c client.IndexAPI, index string) error {
FILE: cmd/es-rollover/app/init/action_test.go
function applyTestDefaults (line 19) | func applyTestDefaults(cfg *Config) {
function TestIndexCreateIfNotExist (line 32) | func TestIndexCreateIfNotExist(t *testing.T) {
function TestRolloverAction (line 84) | func TestRolloverAction(t *testing.T) {
FILE: cmd/es-rollover/app/init/flags.go
constant shards (line 16) | shards = "shards"
constant replicas (line 17) | replicas = "replicas"
constant prioritySpanTemplate (line 18) | prioritySpanTemplate = "priority-span-template"
constant priorityServiceTemplate (line 19) | priorityServiceTemplate = "priority-service-template"
constant priorityDependenciesTemplate (line 20) | priorityDependenciesTemplate = "priority-dependencies-template"
constant prioritySamplingTemplate (line 21) | prioritySamplingTemplate = "priority-sampling-template"
type Config (line 26) | type Config struct
method AddFlags (line 32) | func (*Config) AddFlags(flags *flag.FlagSet) {
method InitFromViper (line 42) | func (c *Config) InitFromViper(v *viper.Viper) {
FILE: cmd/es-rollover/app/init/flags_test.go
function TestBindFlags (line 16) | func TestBindFlags(t *testing.T) {
FILE: cmd/es-rollover/app/init/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/es-rollover/app/lookback/action.go
type Action (line 19) | type Action struct
method Do (line 26) | func (a *Action) Do() error {
method lookback (line 36) | func (a *Action) lookback(indexSet app.IndexOption) error {
FILE: cmd/es-rollover/app/lookback/action_test.go
function TestLookBackAction (line 20) | func TestLookBackAction(t *testing.T) {
FILE: cmd/es-rollover/app/lookback/flags.go
constant unit (line 15) | unit = "unit"
constant unitCount (line 16) | unitCount = "unit-count"
constant defaultUnit (line 17) | defaultUnit = "days"
constant defaultUnitCount (line 18) | defaultUnitCount = 1
type Config (line 22) | type Config struct
method AddFlags (line 29) | func (*Config) AddFlags(flags *flag.FlagSet) {
method InitFromViper (line 35) | func (c *Config) InitFromViper(v *viper.Viper) {
FILE: cmd/es-rollover/app/lookback/flags_test.go
function TestBindFlags (line 16) | func TestBindFlags(t *testing.T) {
FILE: cmd/es-rollover/app/lookback/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/es-rollover/app/lookback/time_reference.go
function getTimeReference (line 8) | func getTimeReference(currentTime time.Time, units string, unitCount int...
FILE: cmd/es-rollover/app/lookback/time_reference_test.go
function TestGetTimeReference (line 13) | func TestGetTimeReference(t *testing.T) {
function TestGetTimeReference_DefaultCase (line 74) | func TestGetTimeReference_DefaultCase(t *testing.T) {
FILE: cmd/es-rollover/app/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/es-rollover/app/rollover/action.go
type Action (line 15) | type Action struct
method Do (line 21) | func (a *Action) Do() error {
method rollover (line 31) | func (a *Action) rollover(indexSet app.IndexOption) error {
FILE: cmd/es-rollover/app/rollover/action_test.go
function TestRolloverAction (line 17) | func TestRolloverAction(t *testing.T) {
FILE: cmd/es-rollover/app/rollover/flags.go
constant conditions (line 15) | conditions = "conditions"
constant defaultRollbackCondition (line 16) | defaultRollbackCondition = "{\"max_age\": \"2d\"}"
type Config (line 20) | type Config struct
method AddFlags (line 26) | func (*Config) AddFlags(flags *flag.FlagSet) {
method InitFromViper (line 31) | func (c *Config) InitFromViper(v *viper.Viper) {
FILE: cmd/es-rollover/app/rollover/flags_test.go
function TestBindFlags (line 16) | func TestBindFlags(t *testing.T) {
FILE: cmd/es-rollover/app/rollover/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/es-rollover/main.go
function main (line 22) | func main() {
function addSubCommand (line 137) | func addSubCommand(v *viper.Viper, rootCmd, cmd *cobra.Command, addFlags...
function addPersistentFlags (line 146) | func addPersistentFlags(v *viper.Viper, rootCmd *cobra.Command, inits .....
FILE: cmd/esmapping-generator/main.go
function main (line 14) | func main() {
FILE: cmd/internal/docs/command.go
constant formatFlag (line 17) | formatFlag = "format"
constant dirFlag (line 18) | dirFlag = "dir"
function Command (line 25) | func Command(v *viper.Viper) *cobra.Command {
function flags (line 55) | func flags(flagSet *flag.FlagSet) *flag.FlagSet {
function genMan (line 67) | func genMan(cmd *cobra.Command, dir string) error {
FILE: cmd/internal/docs/command_test.go
function TestOutputFormats (line 18) | func TestOutputFormats(t *testing.T) {
function TestDocsForParent (line 45) | func TestDocsForParent(t *testing.T) {
function TestMain (line 60) | func TestMain(m *testing.M) {
FILE: cmd/internal/featuregate/command.go
function Command (line 11) | func Command() *cobra.Command {
function newCommand (line 18) | func newCommand(otelCmdFn func() *cobra.Command) *cobra.Command {
FILE: cmd/internal/featuregate/command_test.go
function TestCommand (line 13) | func TestCommand(t *testing.T) {
function TestCommand_Panic (line 18) | func TestCommand_Panic(t *testing.T) {
FILE: cmd/internal/featuregate/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/internal/flags/admin.go
constant adminHTTPHostPort (line 29) | adminHTTPHostPort = "admin.http.host-port"
type AdminServer (line 37) | type AdminServer struct
method Host (line 64) | func (s *AdminServer) Host() *HealthHost {
method setLogger (line 69) | func (s *AdminServer) setLogger(logger *zap.Logger) {
method AddFlags (line 74) | func (s *AdminServer) AddFlags(flagSet *flag.FlagSet) {
method initFromViper (line 80) | func (s *AdminServer) initFromViper(v *viper.Viper, logger *zap.Logger...
method Handle (line 94) | func (s *AdminServer) Handle(path string, handler http.Handler) {
method Serve (line 99) | func (s *AdminServer) Serve() error {
method serveWithListener (line 109) | func (s *AdminServer) serveWithListener(l net.Listener) (err error) {
method registerPprofHandlers (line 146) | func (s *AdminServer) registerPprofHandlers() {
method Close (line 159) | func (s *AdminServer) Close() error {
function NewAdminServer (line 47) | func NewAdminServer(hostPort string) *AdminServer {
FILE: cmd/internal/flags/admin_test.go
function TestAdminServerHealthCheck (line 30) | func TestAdminServerHealthCheck(t *testing.T) {
function TestAdminServerHandlesPortZero (line 66) | func TestAdminServerHandlesPortZero(t *testing.T) {
function TestAdminWithFailedFlags (line 88) | func TestAdminWithFailedFlags(t *testing.T) {
function TestAdminServerTLS (line 102) | func TestAdminServerTLS(t *testing.T) {
FILE: cmd/internal/flags/flags.go
constant logLevel (line 19) | logLevel = "log-level"
constant logEncoding (line 20) | logEncoding = "log-encoding"
constant configFile (line 21) | configFile = "config-file"
function AddConfigFileFlag (line 25) | func AddConfigFileFlag(flagSet *flag.FlagSet) {
function TryLoadConfigFile (line 30) | func TryLoadConfigFile(v *viper.Viper) error {
function ParseJaegerTags (line 42) | func ParseJaegerTags(jaegerTags string) (map[string]string, error) {
type SharedFlags (line 84) | type SharedFlags struct
method InitFromViper (line 101) | func (flags *SharedFlags) InitFromViper(v *viper.Viper) *SharedFlags {
method NewLogger (line 108) | func (flags *SharedFlags) NewLogger(conf zap.Config, options ...zap.Op...
type logging (line 89) | type logging struct
function AddLoggingFlags (line 95) | func AddLoggingFlags(flagSet *flag.FlagSet) {
FILE: cmd/internal/flags/flags_test.go
function TestParseJaegerTags (line 15) | func TestParseJaegerTags(t *testing.T) {
function TestParseJaegerTagsError (line 45) | func TestParseJaegerTagsError(t *testing.T) {
FILE: cmd/internal/flags/healthhost.go
type HealthHost (line 21) | type HealthHost struct
method GetExtensions (line 31) | func (*HealthHost) GetExtensions() map[component.ID]component.Component {
method Report (line 36) | func (h *HealthHost) Report(event *componentstatus.Event) {
method Ready (line 46) | func (h *HealthHost) Ready() {
method SetUnavailable (line 51) | func (h *HealthHost) SetUnavailable() {
method Handler (line 57) | func (h *HealthHost) Handler() http.Handler {
function NewHealthHost (line 26) | func NewHealthHost() *HealthHost {
FILE: cmd/internal/flags/healthhost_test.go
function TestHealthHost_Handler (line 15) | func TestHealthHost_Handler(t *testing.T) {
function TestHealthHost_Report (line 38) | func TestHealthHost_Report(t *testing.T) {
function TestHealthHost_GetExtensions (line 68) | func TestHealthHost_GetExtensions(t *testing.T) {
FILE: cmd/internal/flags/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/internal/flags/service.go
type Service (line 26) | type Service struct
method AddFlags (line 54) | func (s *Service) AddFlags(flagSet *flag.FlagSet) {
method Start (line 63) | func (s *Service) Start(v *viper.Viper) error {
method RunAndThen (line 112) | func (s *Service) RunAndThen(shutdown func()) error {
function NewService (line 43) | func NewService(adminPort int) *Service {
FILE: cmd/internal/flags/service_test.go
function TestAddFlags (line 20) | func TestAddFlags(*testing.T) {
function TestStartErrors (line 25) | func TestStartErrors(t *testing.T) {
function waitForEqual (line 89) | func waitForEqual(t *testing.T, expected any, getter func() any) {
FILE: cmd/internal/printconfig/command.go
function printDivider (line 15) | func printDivider(cmd *cobra.Command, n int) {
function printConfigurations (line 19) | func printConfigurations(cmd *cobra.Command, v *viper.Viper, includeEmpt...
function Command (line 62) | func Command(v *viper.Viper) *cobra.Command {
FILE: cmd/internal/printconfig/command_test.go
constant testPluginBinary (line 34) | testPluginBinary = "test-plugin.binary"
constant testPluginConfigurationFile (line 35) | testPluginConfigurationFile = "test-plugin.configuration-file"
constant testPluginLogLevel (line 36) | testPluginLogLevel = "test-plugin.log-level"
constant testRemotePrefix (line 37) | testRemotePrefix = "test-remote"
constant testRemoteServer (line 38) | testRemoteServer = testRemotePrefix + ".server"
constant testRemoteConnectionTimeout (line 39) | testRemoteConnectionTimeout = testRemotePrefix + ".connection-timeout"
constant defaultTestPluginLogLevel (line 40) | defaultTestPluginLogLevel = "warn"
constant defaultTestConnectionTimeout (line 41) | defaultTestConnectionTimeout = time.Duration(5 * time.Second)
function addFlags (line 44) | func addFlags(flagSet *flag.FlagSet) {
function setConfig (line 56) | func setConfig(t *testing.T) *viper.Viper {
function runPrintConfigCommand (line 70) | func runPrintConfigCommand(v *viper.Viper, t *testing.T, allFlag bool) s...
function TestAllFlag (line 86) | func TestAllFlag(t *testing.T) {
function TestPrintConfigCommand (line 112) | func TestPrintConfigCommand(t *testing.T) {
function TestMain (line 131) | func TestMain(m *testing.M) {
FILE: cmd/internal/status/command.go
constant statusHTTPHostPort (line 21) | statusHTTPHostPort = "status.http.host-port"
function Command (line 24) | func Command(v *viper.Viper, adminPort int) *cobra.Command {
function flags (line 52) | func flags(flagSet *flag.FlagSet, adminPort int) *flag.FlagSet {
function convert (line 59) | func convert(httpHostPort string) string {
FILE: cmd/internal/status/command_test.go
function readyHandler (line 18) | func readyHandler(w http.ResponseWriter, _ *http.Request) {
function unavailableHandler (line 23) | func unavailableHandler(w http.ResponseWriter, _ *http.Request) {
function TestReady (line 28) | func TestReady(t *testing.T) {
function TestOnlyPortConfig (line 38) | func TestOnlyPortConfig(t *testing.T) {
function TestUnready (line 48) | func TestUnready(t *testing.T) {
function TestNoService (line 58) | func TestNoService(t *testing.T) {
function TestMain (line 65) | func TestMain(m *testing.M) {
FILE: cmd/internal/storageconfig/config.go
type Config (line 31) | type Config struct
method Validate (line 175) | func (c *Config) Validate() error {
type TraceBackend (line 37) | type TraceBackend struct
method Unmarshal (line 61) | func (cfg *TraceBackend) Unmarshal(conf *confmap.Conf) error {
method Validate (line 102) | func (cfg *TraceBackend) Validate() error {
type MetricBackend (line 48) | type MetricBackend struct
method Unmarshal (line 135) | func (cfg *MetricBackend) Unmarshal(conf *confmap.Conf) error {
method Validate (line 154) | func (cfg *MetricBackend) Validate() error {
type PrometheusConfiguration (line 54) | type PrometheusConfiguration struct
FILE: cmd/internal/storageconfig/config_test.go
function TestConfigValidate (line 20) | func TestConfigValidate(t *testing.T) {
function TestTraceBackendUnmarshal (line 126) | func TestTraceBackendUnmarshal(t *testing.T) {
function TestMetricBackendUnmarshal (line 236) | func TestMetricBackendUnmarshal(t *testing.T) {
function getStorageKeys (line 293) | func getStorageKeys(t reflect.Type) []string {
function TestTraceBackendExclusive (line 304) | func TestTraceBackendExclusive(t *testing.T) {
function TestMetricBackendExclusive (line 327) | func TestMetricBackendExclusive(t *testing.T) {
FILE: cmd/internal/storageconfig/factory.go
type AuthResolver (line 27) | type AuthResolver
function CreateTraceStorageFactory (line 32) | func CreateTraceStorageFactory(
FILE: cmd/internal/storageconfig/factory_test.go
function getTelemetrySettings (line 29) | func getTelemetrySettings() telemetry.Settings {
function setupMockServer (line 33) | func setupMockServer(t *testing.T, response []byte, statusCode int) *htt...
function getVersionResponse (line 44) | func getVersionResponse(t *testing.T) []byte {
function TestCreateTraceStorageFactory_Memory (line 54) | func TestCreateTraceStorageFactory_Memory(t *testing.T) {
function TestCreateTraceStorageFactory_Badger (line 78) | func TestCreateTraceStorageFactory_Badger(t *testing.T) {
function TestCreateTraceStorageFactory_GRPC (line 104) | func TestCreateTraceStorageFactory_GRPC(t *testing.T) {
function TestCreateTraceStorageFactory_Cassandra (line 130) | func TestCreateTraceStorageFactory_Cassandra(t *testing.T) {
function TestCreateTraceStorageFactory_Elasticsearch (line 148) | func TestCreateTraceStorageFactory_Elasticsearch(t *testing.T) {
function TestCreateTraceStorageFactory_ElasticsearchWithAuthResolver (line 174) | func TestCreateTraceStorageFactory_ElasticsearchWithAuthResolver(t *test...
function TestCreateTraceStorageFactory_ElasticsearchAuthResolverError (line 204) | func TestCreateTraceStorageFactory_ElasticsearchAuthResolverError(t *tes...
function TestCreateTraceStorageFactory_Opensearch (line 229) | func TestCreateTraceStorageFactory_Opensearch(t *testing.T) {
function TestCreateTraceStorageFactory_OpensearchWithAuthResolver (line 255) | func TestCreateTraceStorageFactory_OpensearchWithAuthResolver(t *testing...
function TestCreateTraceStorageFactory_OpensearchAuthResolverError (line 285) | func TestCreateTraceStorageFactory_OpensearchAuthResolverError(t *testin...
function TestCreateTraceStorageFactory_ClickHouse (line 310) | func TestCreateTraceStorageFactory_ClickHouse(t *testing.T) {
function TestCreateTraceStorageFactory_ClickHouseError (line 340) | func TestCreateTraceStorageFactory_ClickHouseError(t *testing.T) {
function TestCreateTraceStorageFactory_EmptyBackend (line 358) | func TestCreateTraceStorageFactory_EmptyBackend(t *testing.T) {
FILE: cmd/internal/storageconfig/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/remote-storage/app/config.go
type Config (line 19) | type Config struct
method Validate (line 45) | func (c *Config) Validate() error {
method GetStorageName (line 61) | func (c *Config) GetStorageName() string {
function LoadConfigFromViper (line 28) | func LoadConfigFromViper(v *viper.Viper) (*Config, error) {
function DefaultConfig (line 70) | func DefaultConfig() *Config {
FILE: cmd/remote-storage/app/config_test.go
function TestLoadConfigFromViper (line 16) | func TestLoadConfigFromViper(t *testing.T) {
function TestDefaultConfig (line 168) | func TestDefaultConfig(t *testing.T) {
FILE: cmd/remote-storage/app/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: cmd/remote-storage/app/server.go
type Server (line 31) | type Server struct
method Start (line 122) | func (s *Server) Start(ctx context.Context) error {
method Close (line 140) | func (s *Server) Close() error {
method GRPCAddr (line 147) | func (s *Server) GRPCAddr() string {
function NewServer (line 40) | func NewServer(
function createGRPCServer (line 79) | func createGRPCServer(
FILE: cmd/remote-storage/app/server_test.go
function TestNewServer_CreateStorageErrors (line 37) | func TestNewServer_CreateStorageErrors(t *testing.T) {
function TestServerStart_BadPortErrors (line 73) | func TestServerStart_BadPortErrors(t *testing.T) {
type fakeFactory (line 84) | type fakeFactory struct
method CreateTraceReader (line 94) | func (f *fakeFactory) CreateTraceReader() (tracestore.Reader, error) {
method CreateTraceWriter (line 101) | func (f *fakeFactory) CreateTraceWriter() (tracestore.Writer, error) {
method CreateDependencyReader (line 108) | func (f *fakeFactory) CreateDependencyReader() (depstore.Reader, error) {
method InitArchiveStorage (line 115) | func (*fakeFactory) InitArchiveStorage(*zap.Logger) (spanstore.Reader,...
function TestNewServer_TLSConfigError (line 119) | func TestNewServer_TLSConfigError(t *testing.T) {
type grpcClient (line 278) | type grpcClient struct
function newGRPCClient (line 284) | func newGRPCClient(t *testing.T, addr string, creds credentials.Transpor...
function TestServerGRPCTLS (line 302) | func TestServerGRPCTLS(t *testing.T) {
function TestServerHandlesPortZero (line 367) | func TestServerHandlesPortZero(t *testing.T) {
function validateGRPCServer (line 397) | func validateGRPCServer(t *testing.T, hostPort string) {
FILE: cmd/remote-storage/main.go
constant serviceName (line 34) | serviceName = "jaeger-remote-storage"
function loadConfig (line 37) | func loadConfig(v *viper.Viper, logger *zap.Logger) (*app.Config, error) {
function main (line 47) | func main() {
FILE: cmd/tracegen/main.go
function main (line 35) | func main() {
function createTracers (line 68) | func createTracers(cfg *tracegen.Config, logger *zap.Logger) ([]trace.Tr...
function createOtelExporter (line 125) | func createOtelExporter(exporterType string) (sdktrace.SpanExporter, err...
FILE: empty_test.go
function TestDummy (line 12) | func TestDummy(*testing.T) {
function TestMain (line 17) | func TestMain(m *testing.M) {
FILE: examples/hotrod/cmd/all.go
function init (line 25) | func init() {
FILE: examples/hotrod/cmd/customer.go
function init (line 36) | func init() {
FILE: examples/hotrod/cmd/driver.go
function init (line 36) | func init() {
FILE: examples/hotrod/cmd/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/cmd/flags.go
function addFlags (line 35) | func addFlags(cmd *cobra.Command) {
FILE: examples/hotrod/cmd/frontend.go
function init (line 45) | func init() {
FILE: examples/hotrod/cmd/root.go
function Execute (line 34) | func Execute() {
function init (line 41) | func init() {
function onInitialize (line 47) | func onInitialize() {
function logError (line 113) | func logError(logger *zap.Logger, err error) error {
FILE: examples/hotrod/cmd/route.go
function init (line 36) | func init() {
FILE: examples/hotrod/main.go
function main (line 11) | func main() {
FILE: examples/hotrod/pkg/delay/delay.go
function Sleep (line 15) | func Sleep(mean time.Duration, stdDev time.Duration) {
FILE: examples/hotrod/pkg/delay/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/pkg/httperr/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/pkg/httperr/httperr.go
function HandleError (line 13) | func HandleError(w http.ResponseWriter, err error, statusCode int) bool {
FILE: examples/hotrod/pkg/log/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/pkg/log/factory.go
type Factory (line 17) | type Factory struct
method Bg (line 27) | func (b Factory) Bg() Logger {
method For (line 34) | func (b Factory) For(ctx context.Context) Logger {
method With (line 47) | func (b Factory) With(fields ...zapcore.Field) Factory {
function NewFactory (line 22) | func NewFactory(logger *zap.Logger) Factory {
FILE: examples/hotrod/pkg/log/logger.go
type Logger (line 13) | type Logger interface
type wrapper (line 22) | type wrapper struct
method Debug (line 27) | func (l wrapper) Debug(msg string, fields ...zapcore.Field) {
method Info (line 32) | func (l wrapper) Info(msg string, fields ...zapcore.Field) {
method Error (line 37) | func (l wrapper) Error(msg string, fields ...zapcore.Field) {
method Fatal (line 42) | func (l wrapper) Fatal(msg string, fields ...zapcore.Field) {
method With (line 47) | func (l wrapper) With(fields ...zapcore.Field) Logger {
FILE: examples/hotrod/pkg/log/spanlogger.go
type spanLogger (line 19) | type spanLogger struct
method Debug (line 25) | func (sl spanLogger) Debug(msg string, fields ...zapcore.Field) {
method Info (line 30) | func (sl spanLogger) Info(msg string, fields ...zapcore.Field) {
method Error (line 35) | func (sl spanLogger) Error(msg string, fields ...zapcore.Field) {
method Fatal (line 40) | func (sl spanLogger) Fatal(msg string, fields ...zapcore.Field) {
method With (line 47) | func (sl spanLogger) With(fields ...zapcore.Field) Logger {
method logToSpan (line 51) | func (sl spanLogger) logToSpan(level, msg string, fields ...zapcore.Fi...
function logFieldsToOTelAttrs (line 59) | func logFieldsToOTelAttrs(fields []zapcore.Field) []attribute.KeyValue {
type bridgeFieldEncoder (line 67) | type bridgeFieldEncoder struct
method AddArray (line 71) | func (e *bridgeFieldEncoder) AddArray(key string, marshaler zapcore.Ar...
method AddObject (line 76) | func (e *bridgeFieldEncoder) AddObject(key string, marshaler zapcore.O...
method AddBinary (line 81) | func (e *bridgeFieldEncoder) AddBinary(key string, value []byte) {
method AddByteString (line 85) | func (e *bridgeFieldEncoder) AddByteString(key string, value []byte) {
method AddBool (line 89) | func (e *bridgeFieldEncoder) AddBool(key string, value bool) {
method AddComplex128 (line 93) | func (e *bridgeFieldEncoder) AddComplex128(key string, value complex12...
method AddComplex64 (line 97) | func (e *bridgeFieldEncoder) AddComplex64(key string, value complex64) {
method AddDuration (line 101) | func (e *bridgeFieldEncoder) AddDuration(key string, value time.Durati...
method AddFloat64 (line 105) | func (e *bridgeFieldEncoder) AddFloat64(key string, value float64) {
method AddFloat32 (line 109) | func (e *bridgeFieldEncoder) AddFloat32(key string, value float32) {
method AddInt (line 113) | func (e *bridgeFieldEncoder) AddInt(key string, value int) {
method AddInt64 (line 117) | func (e *bridgeFieldEncoder) AddInt64(key string, value int64) {
method AddInt32 (line 121) | func (e *bridgeFieldEncoder) AddInt32(key string, value int32) {
method AddInt16 (line 125) | func (e *bridgeFieldEncoder) AddInt16(key string, value int16) {
method AddInt8 (line 129) | func (e *bridgeFieldEncoder) AddInt8(key string, value int8) {
method AddString (line 133) | func (e *bridgeFieldEncoder) AddString(key, value string) {
method AddTime (line 137) | func (e *bridgeFieldEncoder) AddTime(key string, value time.Time) {
method AddUint (line 141) | func (e *bridgeFieldEncoder) AddUint(key string, value uint) {
method AddUint64 (line 145) | func (e *bridgeFieldEncoder) AddUint64(key string, value uint64) {
method AddUint32 (line 149) | func (e *bridgeFieldEncoder) AddUint32(key string, value uint32) {
method AddUint16 (line 153) | func (e *bridgeFieldEncoder) AddUint16(key string, value uint16) {
method AddUint8 (line 157) | func (e *bridgeFieldEncoder) AddUint8(key string, value uint8) {
method AddUintptr (line 161) | func (e *bridgeFieldEncoder) AddUintptr(key string, value uintptr) {
method AddReflected (line 165) | func (*bridgeFieldEncoder) AddReflected(string /* key */, any /* value...
method OpenNamespace (line 166) | func (*bridgeFieldEncoder) OpenNamespace(string /* key */) ...
FILE: examples/hotrod/pkg/pool/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/pkg/pool/pool.go
type Pool (line 8) | type Pool struct
method Execute (line 36) | func (p *Pool) Execute(job func()) {
function New (line 14) | func New(workers int) *Pool {
FILE: examples/hotrod/pkg/tracing/baggage.go
function BaggageItem (line 12) | func BaggageItem(ctx context.Context, key string) string {
FILE: examples/hotrod/pkg/tracing/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/pkg/tracing/http.go
type HTTPClient (line 19) | type HTTPClient struct
method GetJSON (line 38) | func (c *HTTPClient) GetJSON(ctx context.Context, _ string /* endpoint...
function NewHTTPClient (line 24) | func NewHTTPClient(tp trace.TracerProvider) *HTTPClient {
FILE: examples/hotrod/pkg/tracing/init.go
function InitOTEL (line 35) | func InitOTEL(serviceName string, exporterType string, metricsFactory me...
function withSecure (line 74) | func withSecure() bool {
function createOtelExporter (line 79) | func createOtelExporter(exporterType string) (sdktrace.SpanExporter, err...
FILE: examples/hotrod/pkg/tracing/mutex.go
type Mutex (line 21) | type Mutex struct
method Lock (line 33) | func (sm *Mutex) Lock(ctx context.Context) {
method Unlock (line 64) | func (sm *Mutex) Unlock() {
FILE: examples/hotrod/pkg/tracing/mux.go
function NewServeMux (line 19) | func NewServeMux(copyBaggage bool, tracer trace.TracerProvider, logger l...
type TracedServeMux (line 29) | type TracedServeMux struct
method Handle (line 37) | func (tm *TracedServeMux) Handle(pattern string, handler http.Handler) {
method ServeHTTP (line 49) | func (tm *TracedServeMux) ServeHTTP(w http.ResponseWriter, r *http.Req...
function traceResponseHandler (line 55) | func traceResponseHandler(handler http.Handler) http.Handler {
FILE: examples/hotrod/pkg/tracing/rpcmetrics/endpoints.go
type normalizedEndpoints (line 10) | type normalizedEndpoints struct
method normalize (line 28) | func (n *normalizedEndpoints) normalize(name string) string {
method normalizeWithLock (line 42) | func (n *normalizedEndpoints) normalizeWithLock(name string) string {
function newNormalizedEndpoints (line 17) | func newNormalizedEndpoints(maxSize int, normalizer NameNormalizer) *nor...
FILE: examples/hotrod/pkg/tracing/rpcmetrics/endpoints_test.go
function TestNormalizedEndpoints (line 13) | func TestNormalizedEndpoints(t *testing.T) {
function TestNormalizedEndpointsDoubleLocking (line 29) | func TestNormalizedEndpointsDoubleLocking(t *testing.T) {
FILE: examples/hotrod/pkg/tracing/rpcmetrics/metrics.go
constant otherEndpointsPlaceholder (line 15) | otherEndpointsPlaceholder = "other"
constant endpointNameMetricTag (line 16) | endpointNameMetricTag = "endpoint"
type Metrics (line 21) | type Metrics struct
method recordHTTPStatusCode (line 47) | func (m *Metrics) recordHTTPStatusCode(statusCode int64) {
type MetricsByEndpoint (line 65) | type MetricsByEndpoint struct
method get (line 84) | func (m *MetricsByEndpoint) get(endpoint string) *Metrics {
method getWithWriteLock (line 100) | func (m *MetricsByEndpoint) getWithWriteLock(safeName string) *Metrics {
function newMetricsByEndpoint (line 72) | func newMetricsByEndpoint(
FILE: examples/hotrod/pkg/tracing/rpcmetrics/metrics_test.go
function tags (line 16) | func tags(kv ...string) map[string]string {
function endpointTags (line 24) | func endpointTags(endpoint string, kv ...string) map[string]string {
function TestMetricsByEndpoint (line 28) | func TestMetricsByEndpoint(t *testing.T) {
function TestRecordHTTPStatusCode_DefaultCase (line 53) | func TestRecordHTTPStatusCode_DefaultCase(t *testing.T) {
FILE: examples/hotrod/pkg/tracing/rpcmetrics/normalizer.go
type NameNormalizer (line 9) | type NameNormalizer interface
type SimpleNameNormalizer (line 28) | type SimpleNameNormalizer struct
method Normalize (line 60) | func (n *SimpleNameNormalizer) Normalize(name string) string {
method safeByte (line 83) | func (n *SimpleNameNormalizer) safeByte(b byte) bool {
type SafeCharacterSet (line 34) | type SafeCharacterSet interface
type Range (line 39) | type Range struct
method IsSafe (line 44) | func (r *Range) IsSafe(c byte) bool {
type Char (line 49) | type Char struct
method IsSafe (line 54) | func (ch *Char) IsSafe(c byte) bool {
FILE: examples/hotrod/pkg/tracing/rpcmetrics/normalizer_test.go
function TestSimpleNameNormalizer (line 13) | func TestSimpleNameNormalizer(t *testing.T) {
FILE: examples/hotrod/pkg/tracing/rpcmetrics/observer.go
constant defaultMaxNumberOfEndpoints (line 20) | defaultMaxNumberOfEndpoints = 200
type Observer (line 25) | type Observer struct
method OnStart (line 40) | func (*Observer) OnStart(context.Context /* parent */, sdktrace.ReadWr...
method OnEnd (line 42) | func (o *Observer) OnEnd(sp sdktrace.ReadOnlySpan) {
method Shutdown (line 75) | func (*Observer) Shutdown(context.Context) error {
method ForceFlush (line 79) | func (*Observer) ForceFlush(context.Context) error {
function NewObserver (line 30) | func NewObserver(metricsFactory metrics.Factory, normalizer NameNormaliz...
FILE: examples/hotrod/pkg/tracing/rpcmetrics/observer_test.go
type testTracer (line 23) | type testTracer struct
function withTestTracer (line 28) | func withTestTracer(runTest func(tt *testTracer)) {
function TestObserver (line 46) | func TestObserver(t *testing.T) {
function TestTags (line 93) | func TestTags(t *testing.T) {
FILE: examples/hotrod/pkg/tracing/rpcmetrics/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/services/config/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/services/customer/client.go
type Client (line 19) | type Client struct
method Get (line 35) | func (c *Client) Get(ctx context.Context, customerID int) (*Customer, ...
function NewClient (line 26) | func NewClient(tracer trace.TracerProvider, logger log.Factory, hostPort...
FILE: examples/hotrod/services/customer/database.go
type database (line 24) | type database struct
method Get (line 64) | func (d *database) Get(ctx context.Context, customerID int) (*Customer...
function newDatabase (line 31) | func newDatabase(tracer trace.Tracer, logger log.Factory) *database {
FILE: examples/hotrod/services/customer/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/services/customer/interface.go
type Customer (line 12) | type Customer struct
type Interface (line 19) | type Interface interface
FILE: examples/hotrod/services/customer/server.go
type Server (line 23) | type Server struct
method Run (line 44) | func (s *Server) Run() error {
method createServeMux (line 55) | func (s *Server) createServeMux() http.Handler {
method customer (line 61) | func (s *Server) customer(w http.ResponseWriter, r *http.Request) {
function NewServer (line 31) | func NewServer(hostPort string, otelExporter string, metricsFactory metr...
FILE: examples/hotrod/services/driver/client.go
type Client (line 22) | type Client struct
method FindNearest (line 48) | func (c *Client) FindNearest(ctx context.Context, location string) ([]...
function NewClient (line 28) | func NewClient(tracerProvider trace.TracerProvider, logger log.Factory, ...
function fromProto (line 59) | func fromProto(response *DriverLocationResponse) []Driver {
FILE: examples/hotrod/services/driver/driver.pb.go
constant _ (line 25) | _ = proto.GoGoProtoPackageIsVersion3
type DriverLocationRequest (line 27) | type DriverLocationRequest struct
method Reset (line 34) | func (m *DriverLocationRequest) Reset() { *m = DriverLocationR...
method String (line 35) | func (m *DriverLocationRequest) String() string { return proto.Compact...
method ProtoMessage (line 36) | func (*DriverLocationRequest) ProtoMessage() {}
method Descriptor (line 37) | func (*DriverLocationRequest) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 40) | func (m *DriverLocationRequest) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 43) | func (m *DriverLocationRequest) XXX_Marshal(b []byte, deterministic bo...
method XXX_Merge (line 46) | func (m *DriverLocationRequest) XXX_Merge(src proto.Message) {
method XXX_Size (line 49) | func (m *DriverLocationRequest) XXX_Size() int {
method XXX_DiscardUnknown (line 52) | func (m *DriverLocationRequest) XXX_DiscardUnknown() {
method GetLocation (line 58) | func (m *DriverLocationRequest) GetLocation() string {
type DriverLocation (line 65) | type DriverLocation struct
method Reset (line 73) | func (m *DriverLocation) Reset() { *m = DriverLocation{} }
method String (line 74) | func (m *DriverLocation) String() string { return proto.CompactTextStr...
method ProtoMessage (line 75) | func (*DriverLocation) ProtoMessage() {}
method Descriptor (line 76) | func (*DriverLocation) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 79) | func (m *DriverLocation) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 82) | func (m *DriverLocation) XXX_Marshal(b []byte, deterministic bool) ([]...
method XXX_Merge (line 85) | func (m *DriverLocation) XXX_Merge(src proto.Message) {
method XXX_Size (line 88) | func (m *DriverLocation) XXX_Size() int {
method XXX_DiscardUnknown (line 91) | func (m *DriverLocation) XXX_DiscardUnknown() {
method GetDriverID (line 97) | func (m *DriverLocation) GetDriverID() string {
method GetLocation (line 104) | func (m *DriverLocation) GetLocation() string {
type DriverLocationResponse (line 111) | type DriverLocationResponse struct
method Reset (line 118) | func (m *DriverLocationResponse) Reset() { *m = DriverLocation...
method String (line 119) | func (m *DriverLocationResponse) String() string { return proto.Compac...
method ProtoMessage (line 120) | func (*DriverLocationResponse) ProtoMessage() {}
method Descriptor (line 121) | func (*DriverLocationResponse) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 124) | func (m *DriverLocationResponse) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 127) | func (m *DriverLocationResponse) XXX_Marshal(b []byte, deterministic b...
method XXX_Merge (line 130) | func (m *DriverLocationResponse) XXX_Merge(src proto.Message) {
method XXX_Size (line 133) | func (m *DriverLocationResponse) XXX_Size() int {
method XXX_DiscardUnknown (line 136) | func (m *DriverLocationResponse) XXX_DiscardUnknown() {
method GetLocations (line 142) | func (m *DriverLocationResponse) GetLocations() []*DriverLocation {
function init (line 149) | func init() {
function init (line 155) | func init() {
constant _ (line 182) | _ = grpc.SupportPackageIsVersion4
type DriverServiceClient (line 187) | type DriverServiceClient interface
type driverServiceClient (line 191) | type driverServiceClient struct
method FindNearest (line 199) | func (c *driverServiceClient) FindNearest(ctx context.Context, in *Dri...
function NewDriverServiceClient (line 195) | func NewDriverServiceClient(cc *grpc.ClientConn) DriverServiceClient {
type DriverServiceServer (line 209) | type DriverServiceServer interface
type UnimplementedDriverServiceServer (line 214) | type UnimplementedDriverServiceServer struct
method FindNearest (line 217) | func (*UnimplementedDriverServiceServer) FindNearest(ctx context.Conte...
function RegisterDriverServiceServer (line 221) | func RegisterDriverServiceServer(s *grpc.Server, srv DriverServiceServer) {
function _DriverService_FindNearest_Handler (line 225) | func _DriverService_FindNearest_Handler(srv interface{}, ctx context.Con...
FILE: examples/hotrod/services/driver/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/services/driver/interface.go
type Driver (line 12) | type Driver struct
type Interface (line 18) | type Interface interface
FILE: examples/hotrod/services/driver/redis.go
type Redis (line 27) | type Redis struct
method FindDriverIDs (line 42) | func (r *Redis) FindDriverIDs(ctx context.Context, location string) []...
method GetDriver (line 60) | func (r *Redis) GetDriver(ctx context.Context, driverID string) (Drive...
function newRedis (line 33) | func newRedis(otelExporter string, metricsFactory metrics.Factory, logge...
type errorSimulator (line 85) | type errorSimulator struct
method checkError (line 90) | func (es *errorSimulator) checkError() error {
FILE: examples/hotrod/services/driver/server.go
type Server (line 23) | type Server struct
method Run (line 50) | func (s *Server) Run() error {
method FindNearest (line 65) | func (s *Server) FindNearest(ctx context.Context, location *DriverLoca...
function NewServer (line 33) | func NewServer(hostPort string, otelExporter string, metricsFactory metr...
function toJSON (line 97) | func toJSON(v any) string {
FILE: examples/hotrod/services/frontend/best_eta.go
type bestETA (line 26) | type bestETA struct
method Get (line 62) | func (eta *bestETA) Get(ctx context.Context, customerID int) (*Respons...
method getRoutes (line 114) | func (eta *bestETA) getRoutes(ctx context.Context, cust *customer.Cust...
type Response (line 35) | type Response struct
function newBestETA (line 40) | func newBestETA(tracer trace.TracerProvider, logger log.Factory, options...
type routeResult (line 107) | type routeResult struct
FILE: examples/hotrod/services/frontend/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/services/frontend/server.go
type Server (line 30) | type Server struct
method Run (line 65) | func (s *Server) Run() error {
method createServeMux (line 76) | func (s *Server) createServeMux() http.Handler {
method config (line 87) | func (s *Server) config(w http.ResponseWriter, r *http.Request) {
method dispatch (line 94) | func (s *Server) dispatch(w http.ResponseWriter, r *http.Request) {
method writeResponse (line 123) | func (s *Server) writeResponse(response any, w http.ResponseWriter, r ...
type ConfigOptions (line 42) | type ConfigOptions struct
function NewServer (line 52) | func NewServer(options ConfigOptions, tracer trace.TracerProvider, logge...
FILE: examples/hotrod/services/route/client.go
type Client (line 19) | type Client struct
method FindRoute (line 35) | func (c *Client) FindRoute(ctx context.Context, pickup, dropoff string...
function NewClient (line 26) | func NewClient(tracer trace.TracerProvider, logger log.Factory, hostPort...
FILE: examples/hotrod/services/route/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: examples/hotrod/services/route/interface.go
type Route (line 13) | type Route struct
type Interface (line 20) | type Interface interface
FILE: examples/hotrod/services/route/server.go
type Server (line 26) | type Server struct
method Run (line 42) | func (s *Server) Run() error {
method createServeMux (line 53) | func (s *Server) createServeMux() http.Handler {
method route (line 65) | func (s *Server) route(w http.ResponseWriter, r *http.Request) {
function NewServer (line 33) | func NewServer(hostPort string, tracer trace.TracerProvider, logger log....
function movedToFrontend (line 61) | func movedToFrontend(w http.ResponseWriter, _ *http.Request) {
function computeRoute (line 97) | func computeRoute(ctx context.Context, pickup, dropoff string) *Route {
FILE: examples/hotrod/services/route/stats.go
function updateCalcStats (line 34) | func updateCalcStats(ctx context.Context, delay time.Duration) {
FILE: internal/auth/apikey/apikey-context.go
type apiKeyContextKey (line 9) | type apiKeyContextKey struct
function GetAPIKey (line 12) | func GetAPIKey(ctx context.Context) (string, bool) {
function ContextWithAPIKey (line 24) | func ContextWithAPIKey(ctx context.Context, apiKey string) context.Conte...
FILE: internal/auth/apikey/apikey-context_test.go
function TestGetAPIKey (line 13) | func TestGetAPIKey(t *testing.T) {
function TestContextWithAPIKey (line 40) | func TestContextWithAPIKey(t *testing.T) {
FILE: internal/auth/apikey/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: internal/auth/bearertoken/context.go
type contextKeyType (line 8) | type contextKeyType
constant contextKey (line 10) | contextKey = contextKeyType(iota)
constant StoragePropagationKey (line 13) | StoragePropagationKey = "storage.propagate.token"
function ContextWithBearerToken (line 16) | func ContextWithBearerToken(ctx context.Context, token string) context.C...
function GetBearerToken (line 24) | func GetBearerToken(ctx context.Context) (string, bool) {
FILE: internal/auth/bearertoken/context_test.go
function Test_GetBearerToken (line 13) | func Test_GetBearerToken(t *testing.T) {
FILE: internal/auth/bearertoken/grpc.go
constant Key (line 14) | Key = "bearer.token"
type tokenatedServerStream (line 16) | type tokenatedServerStream struct
method Context (line 21) | func (tss *tokenatedServerStream) Context() context.Context {
function ValidTokenFromGRPCMetadata (line 26) | func ValidTokenFromGRPCMetadata(ctx context.Context, bearerHeader string...
function NewStreamServerInterceptor (line 43) | func NewStreamServerInterceptor() grpc.StreamServerInterceptor {
function NewUnaryServerInterceptor (line 62) | func NewUnaryServerInterceptor() grpc.UnaryServerInterceptor {
function NewUnaryClientInterceptor (line 78) | func NewUnaryClientInterceptor() grpc.UnaryClientInterceptor {
function NewStreamClientInterceptor (line 108) | func NewStreamClientInterceptor() grpc.StreamClientInterceptor {
FILE: internal/auth/bearertoken/grpc_test.go
type mockServerStream (line 16) | type mockServerStream struct
method Context (line 21) | func (s *mockServerStream) Context() context.Context {
function TestClientInterceptors (line 25) | func TestClientInterceptors(t *testing.T) {
function TestServerInterceptors (line 99) | func TestServerInterceptors(t *testing.T) {
function TestTokenatedServerStream (line 178) | func TestTokenatedServerStream(t *testing.T) {
FILE: internal/auth/bearertoken/http.go
function PropagationHandler (line 16) | func PropagationHandler(logger *zap.Logger, h http.Handler) http.Handler {
FILE: internal/auth/bearertoken/http_test.go
function Test_PropagationHandler (line 18) | func Test_PropagationHandler(t *testing.T) {
FILE: internal/auth/bearertoken/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: internal/auth/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: internal/auth/tokenloader.go
function cachedFileTokenLoader (line 20) | func cachedFileTokenLoader(path string, interval time.Duration, timeFn f...
function TokenProvider (line 52) | func TokenProvider(path string, interval time.Duration, logger *zap.Logg...
function TokenProviderWithTime (line 57) | func TokenProviderWithTime(path string, interval time.Duration, logger *...
FILE: internal/auth/tokenloader_test.go
function TestCachedFileTokenLoader_Deterministic (line 21) | func TestCachedFileTokenLoader_Deterministic(t *testing.T) {
function TestCachedFileTokenLoader_ExactBoundaries (line 51) | func TestCachedFileTokenLoader_ExactBoundaries(t *testing.T) {
function TestCachedFileTokenLoader_ZeroInterval (line 89) | func TestCachedFileTokenLoader_ZeroInterval(t *testing.T) {
function TestNewTokenProvider_InitialLoad (line 125) | func TestNewTokenProvider_InitialLoad(t *testing.T) {
function TestNewTokenProvider_ReloadErrors_Deterministic (line 151) | func TestNewTokenProvider_ReloadErrors_Deterministic(t *testing.T) {
function TestTokenProviderWithTime_DirectCall (line 186) | func TestTokenProviderWithTime_DirectCall(t *testing.T) {
function TestNewTokenProvider_WithZapLogger (line 216) | func TestNewTokenProvider_WithZapLogger(t *testing.T) {
function TestCachedFileTokenLoader_FilePermissions (line 252) | func TestCachedFileTokenLoader_FilePermissions(t *testing.T) {
function TestTokenProvider_Wrapper (line 279) | func TestTokenProvider_Wrapper(t *testing.T) {
function createTempTokenFile (line 294) | func createTempTokenFile(t *testing.T, content string) string {
function updateTokenFile (line 311) | func updateTokenFile(t *testing.T, filename, content string) {
FILE: internal/auth/transport.go
type Method (line 14) | type Method struct
type RoundTripper (line 27) | type RoundTripper struct
method RoundTrip (line 35) | func (tr RoundTripper) RoundTrip(r *http.Request) (*http.Response, err...
FILE: internal/auth/transport_test.go
type roundTripFunc (line 18) | type roundTripFunc
method RoundTrip (line 20) | func (s roundTripFunc) RoundTrip(r *http.Request) (*http.Response, err...
function TestRoundTripper (line 24) | func TestRoundTripper(t *testing.T) {
FILE: internal/cache/cache.go
type Cache (line 13) | type Cache interface
type Options (line 33) | type Options struct
type EvictCallback (line 50) | type EvictCallback
FILE: internal/cache/lru.go
type LRU (line 14) | type LRU struct
method Get (line 43) | func (c *LRU) Get(key string) any {
method Put (line 68) | func (c *LRU) Put(key string, value any) any {
method CompareAndSwap (line 77) | func (c *LRU) CompareAndSwap(key string, oldValue, newValue any) (item...
method putWithMutexHold (line 100) | func (c *LRU) putWithMutexHold(key string, value any, elt *list.Elemen...
method Delete (line 133) | func (c *LRU) Delete(key string) {
method Size (line 148) | func (c *LRU) Size() int {
function NewLRUWithOptions (line 25) | func NewLRUWithOptions(maxSize int, opts *Options) *LRU {
type cacheEntry (line 155) | type cacheEntry struct
FILE: internal/cache/lru_test.go
function TestLRU (line 17) | func TestLRU(t *testing.T) {
function TestCompareAndSwap (line 55) | func TestCompareAndSwap(t *testing.T) {
function TestLRUWithTTL (line 99) | func TestLRUWithTTL(t *testing.T) {
function TestDefaultClock (line 120) | func TestDefaultClock(t *testing.T) {
function TestLRUCacheConcurrentAccess (line 131) | func TestLRUCacheConcurrentAccess(*testing.T) {
function TestRemoveFunc (line 161) | func TestRemoveFunc(t *testing.T) {
function TestRemovedFuncWithTTL (line 186) | func TestRemovedFuncWithTTL(t *testing.T) {
type simulatedClock (line 213) | type simulatedClock struct
method Now (line 218) | func (c *simulatedClock) Now() time.Time {
method Elapse (line 224) | func (c *simulatedClock) Elapse(d time.Duration) time.Time {
function TestMain (line 231) | func TestMain(m *testing.M) {
FILE: internal/config/config.go
function Viperize (line 18) | func Viperize(inits ...func(*flag.FlagSet)) (*viper.Viper, *cobra.Comman...
function AddFlags (line 23) | func AddFlags(v *viper.Viper, command *cobra.Command, inits ...func(*fla...
function configureViper (line 35) | func configureViper(v *viper.Viper) {
FILE: internal/config/config_test.go
function TestViperize (line 16) | func TestViperize(t *testing.T) {
function TestEnv (line 43) | func TestEnv(t *testing.T) {
FILE: internal/config/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: internal/config/promcfg/config.go
type Configuration (line 14) | type Configuration struct
method Validate (line 32) | func (c *Configuration) Validate() error {
FILE: internal/config/promcfg/config_test.go
function TestValidate (line 14) | func TestValidate(t *testing.T) {
function TestMain (line 25) | func TestMain(m *testing.M) {
FILE: internal/config/string_slice.go
type StringSlice (line 12) | type StringSlice
method String (line 15) | func (l *StringSlice) String() string {
method Set (line 24) | func (l *StringSlice) Set(value string) error {
method Type (line 30) | func (*StringSlice) Type() string {
FILE: internal/config/string_slice_test.go
function TestStringSlice (line 15) | func TestStringSlice(t *testing.T) {
function TestStringSliceTreatedAsStringSlice (line 31) | func TestStringSliceTreatedAsStringSlice(t *testing.T) {
FILE: internal/config/tlscfg/flags.go
constant tlsPrefix (line 18) | tlsPrefix = ".tls"
constant tlsEnabled (line 19) | tlsEnabled = tlsPrefix + ".enabled"
constant tlsCA (line 20) | tlsCA = tlsPrefix + ".ca"
constant tlsCert (line 21) | tlsCert = tlsPrefix + ".cert"
constant tlsKey (line 22) | tlsKey = tlsPrefix + ".key"
constant tlsServerName (line 23) | tlsServerName = tlsPrefix + ".server-name"
constant tlsClientCA (line 24) | tlsClientCA = tlsPrefix + ".client-ca"
constant tlsSkipHostVerify (line 25) | tlsSkipHostVerify = tlsPrefix + ".skip-host-verify"
constant tlsCipherSuites (line 26) | tlsCipherSuites = tlsPrefix + ".cipher-suites"
constant tlsMinVersion (line 27) | tlsMinVersion = tlsPrefix + ".min-version"
constant tlsMaxVersion (line 28) | tlsMaxVersion = tlsPrefix + ".max-version"
constant tlsReloadInterval (line 29) | tlsReloadInterval = tlsPrefix + ".reload-interval"
type ClientFlagsConfig (line 33) | type ClientFlagsConfig struct
method AddFlags (line 43) | func (c ClientFlagsConfig) AddFlags(flags *flag.FlagSet) {
method InitFromViper (line 65) | func (c ClientFlagsConfig) InitFromViper(v *viper.Viper) (configtls.Cl...
type ServerFlagsConfig (line 38) | type ServerFlagsConfig struct
method AddFlags (line 53) | func (c ServerFlagsConfig) AddFlags(flags *flag.FlagSet) {
method InitFromViper (line 85) | func (c ServerFlagsConfig) InitFromViper(v *viper.Viper) (configoption...
function stripWhiteSpace (line 109) | func stripWhiteSpace(str string) string {
FILE: internal/config/tlscfg/flags_test.go
function TestClientFlags (line 21) | func TestClientFlags(t *testing.T) {
function TestServerFlags (line 74) | func TestServerFlags(t *testing.T) {
function TestServerCertReloadInterval (line 129) | func TestServerCertReloadInterval(t *testing.T) {
function TestFailedTLSFlags (line 146) | func TestFailedTLSFlags(t *testing.T) {
FILE: internal/config/tlscfg/options.go
type options (line 14) | type options struct
method ToOtelClientConfig (line 28) | func (o *options) ToOtelClientConfig() configtls.ClientConfig {
method ToOtelServerConfig (line 50) | func (o *options) ToOtelServerConfig() configoptional.Optional[configt...
FILE: internal/config/tlscfg/options_test.go
function TestToOtelClientConfig (line 15) | func TestToOtelClientConfig(t *testing.T) {
function TestToOtelServerConfig (line 69) | func TestToOtelServerConfig(t *testing.T) {
FILE: internal/config/tlscfg/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: internal/converter/empty_test.go
function TestDummy (line 12) | func TestDummy(*testing.T) {
function TestMain (line 17) | func TestMain(m *testing.M) {
FILE: internal/converter/thrift/empty_test.go
function TestDummy (line 12) | func TestDummy(*testing.T) {
function TestMain (line 17) | func TestMain(m *testing.M) {
FILE: internal/converter/thrift/jaeger/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: internal/converter/thrift/jaeger/sampling_from_domain.go
function ConvertSamplingResponseFromDomain (line 15) | func ConvertSamplingResponseFromDomain(r *api_v2.SamplingStrategyRespons...
function convertProbabilisticFromDomain (line 33) | func convertProbabilisticFromDomain(s *api_v2.ProbabilisticSamplingStrat...
function convertRateLimitingFromDomain (line 40) | func convertRateLimitingFromDomain(s *api_v2.RateLimitingSamplingStrateg...
function convertPerOperationFromDomain (line 53) | func convertPerOperationFromDomain(s *api_v2.PerOperationSamplingStrateg...
function convertOperationFromDomain (line 72) | func convertOperationFromDomain(s *api_v2.OperationSamplingStrategy) *sa...
function convertStrategyTypeFromDomain (line 82) | func convertStrategyTypeFromDomain(s api_v2.SamplingStrategyType) (sampl...
FILE: internal/converter/thrift/jaeger/sampling_from_domain_test.go
function TestConvertStrategyTypeFromDomain (line 17) | func TestConvertStrategyTypeFromDomain(t *testing.T) {
function TestConvertProbabilisticFromDomain (line 38) | func TestConvertProbabilisticFromDomain(t *testing.T) {
function TestConvertRateLimitingFromDomain (line 52) | func TestConvertRateLimitingFromDomain(t *testing.T) {
function TestConvertOperationStrategyFromDomain (line 74) | func TestConvertOperationStrategyFromDomain(t *testing.T) {
function TestConvertPerOperationStrategyFromDomain (line 92) | func TestConvertPerOperationStrategyFromDomain(t *testing.T) {
function TestConvertSamplingResponseFromDomain (line 122) | func TestConvertSamplingResponseFromDomain(t *testing.T) {
FILE: internal/converter/thrift/jaeger/sampling_to_domain.go
function ConvertSamplingResponseToDomain (line 14) | func ConvertSamplingResponseToDomain(r *sampling.SamplingStrategyRespons...
function convertRateLimitingToDomain (line 31) | func convertRateLimitingToDomain(s *sampling.RateLimitingSamplingStrateg...
function convertProbabilisticToDomain (line 38) | func convertProbabilisticToDomain(s *sampling.ProbabilisticSamplingStrat...
function convertPerOperationToDomain (line 45) | func convertPerOperationToDomain(s *sampling.PerOperationSamplingStrateg...
function convertStrategyTypeToDomain (line 64) | func convertStrategyTypeToDomain(t sampling.SamplingStrategyType) (api_v...
FILE: internal/converter/thrift/jaeger/sampling_to_domain_test.go
function TestConvertStrategyTypeToDomain (line 17) | func TestConvertStrategyTypeToDomain(t *testing.T) {
function TestConvertProbabilisticToDomain (line 38) | func TestConvertProbabilisticToDomain(t *testing.T) {
function TestConvertRateLimitingToDomain (line 52) | func TestConvertRateLimitingToDomain(t *testing.T) {
function TestConvertPerOperationStrategyToDomain (line 66) | func TestConvertPerOperationStrategyToDomain(t *testing.T) {
function TestConvertSamplingResponseToDomain (line 90) | func TestConvertSamplingResponseToDomain(t *testing.T) {
FILE: internal/converter/thrift/jaeger/to_domain.go
function ToDomain (line 17) | func ToDomain(jSpans []*jaeger.Span, jProcess *jaeger.Process) []*model....
function ToDomainSpan (line 24) | func ToDomainSpan(jSpan *jaeger.Span, jProcess *jaeger.Process) *model.S...
function ToDomainProcess (line 29) | func ToDomainProcess(jProcess *jaeger.Process) *model.Process {
type toDomain (line 33) | type toDomain struct
method ToDomain (line 35) | func (td toDomain) ToDomain(jSpans []*jaeger.Span, jProcess *jaeger.Pr...
method ToDomainSpan (line 44) | func (td toDomain) ToDomainSpan(jSpan *jaeger.Span, jProcess *jaeger.P...
method transformSpan (line 49) | func (td toDomain) transformSpan(jSpan *jaeger.Span, mProcess *model.P...
method getReferences (line 81) | func (toDomain) getReferences(jRefs []*jaeger.SpanRef) []model.SpanRef {
method getProcess (line 103) | func (td toDomain) getProcess(jProcess *jaeger.Process) *model.Process {
method getTags (line 117) | func (td toDomain) getTags(tags []*jaeger.Tag, extraSpace int) model.K...
method getTag (line 128) | func (toDomain) getTag(tag *jaeger.Tag) model.KeyValue {
method getLogs (line 145) | func (td toDomain) getLogs(logs []*jaeger.Log) []model.Log {
FILE: internal/converter/thrift/jaeger/to_domain_test.go
constant NumberOfFixtures (line 24) | NumberOfFixtures = 2
function TestToDomain (line 26) | func TestToDomain(t *testing.T) {
function loadSpans (line 62) | func loadSpans(t *testing.T, file string) []*model.Span {
function loadJSONPB (line 68) | func loadJSONPB(t *testing.T, fileName string, obj proto.Message) {
function loadBatch (line 74) | func loadBatch(t *testing.T, file string) *jaeger.Batch {
function loadJSON (line 80) | func loadJSON(t *testing.T, fileName string, obj any) {
function TestUnknownJaegerType (line 88) | func TestUnknownJaegerType(t *testing.T) {
function TestToDomain_ToDomainProcess (line 97) | func TestToDomain_ToDomainProcess(t *testing.T) {
function TestToDomain_ToDomainSpanProcessNull (line 102) | func TestToDomain_ToDomainSpanProcessNull(t *testing.T) {
FILE: internal/distributedlock/empty_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: internal/distributedlock/interface.go
type Lock (line 12) | type Lock interface
FILE: internal/distributedlock/mocks/mocks.go
function NewLock (line 20) | func NewLock(t interface {
type Lock (line 33) | type Lock struct
method EXPECT (line 41) | func (_m *Lock) EXPECT() *Lock_Expecter {
method Acquire (line 46) | func (_mock *Lock) Acquire(resource string, ttl time.Duration) (bool, ...
method Forfeit (line 112) | func (_mock *Lock) Forfeit(resource string) (bool, error) {
type Lock_Expecter (line 37) | type Lock_Expecter struct
method Acquire (line 79) | func (_e *Lock_Expecter) Acquire(resource interface{}, ttl interface{}...
method Forfeit (line 144) | func (_e *Lock_Expecter) Forfeit(resource interface{}) *Lock_Forfeit_C...
type Lock_Acquire_Call (line 72) | type Lock_Acquire_Call struct
method Run (line 83) | func (_c *Lock_Acquire_Call) Run(run func(resource string, ttl time.Du...
method Return (line 101) | func (_c *Lock_Acquire_Call) Return(acquired bool, err error) *Lock_Ac...
method RunAndReturn (line 106) | func (_c *Lock_Acquire_Call) RunAndReturn(run func(resource string, tt...
type Lock_Forfeit_Call (line 138) | type Lock_Forfeit_Call struct
method Run (line 148) | func (_c *Lock_Forfeit_Call) Run(run func(resource string)) *Lock_Forf...
method Return (line 161) | func (_c *Lock_Forfeit_Call) Return(forfeited bool, err error) *Lock_F...
method RunAndReturn (line 166) | func (_c *Lock_Forfeit_Call) RunAndReturn(run func(resource string) (b...
FILE: internal/fswatcher/fswatcher.go
type FSWatcher (line 20) | type FSWatcher struct
method setupWatchedPaths (line 72) | func (w *FSWatcher) setupWatchedPaths(filepaths []string) error {
method watch (line 100) | func (w *FSWatcher) watch() {
method Close (line 131) | func (w *FSWatcher) Close() error {
method isModified (line 136) | func (w *FSWatcher) isModified(filePathName string, previousHash strin...
function New (line 50) | func New(filepaths []string, onChange func(), logger *zap.Logger) (*FSWa...
function hashFile (line 146) | func hashFile(file string) (string, error) {
FILE: internal/fswatcher/fswatcher_test.go
function createTestFiles (line 22) | func createTestFiles(t *testing.T) (file1 string, file2 string, file3 st...
function TestFSWatcherAddFiles (line 42) | func TestFSWatcherAddFiles(t *testing.T) {
function TestFSWatcherWithMultipleFiles (line 78) | func TestFSWatcherWithMultipleFiles(t *testing.T) {
function TestFSWatcherWithSymlinkAndRepoChanges (line 143) | func TestFSWatcherWithSymlinkAndRepoChanges(t *testing.T) {
function createTimestampDir (line 203) | func createTimestampDir(t *testing.T, dir string) {
type delayedFormat (line 212) | type delayedFormat struct
method String (line 216) | func (df delayedFormat) String() string {
function assertLogs (line 220) | func assertLogs(t *testing.T, f func() bool, errorMsg string, logObserve...
function TestMain (line 230) | func TestMain(m *testing.M) {
FILE: internal/gogocodec/codec.go
constant jaegerProtoGenPkgPath (line 18) | jaegerProtoGenPkgPath = "github.com/jaegertracing/jaeger-idl/proto-gen"
constant jaegerModelPkgPath (line 19) | jaegerModelPkgPath = "github.com/jaegertracing/jaeger-idl/model/v1"
constant jaegerProtoGenPkgPathOld (line 21) | jaegerProtoGenPkgPathOld = "github.com/jaegertracing/jaeger/internal/pro...
constant jaegerModelPkgPathOld (line 22) | jaegerModelPkgPathOld = "github.com/jaegertracing/jaeger-idl/model/v1"
type CustomType (line 29) | type CustomType interface
function init (line 40) | func init() {
type gogoCodec (line 48) | type gogoCodec struct
method Name (line 57) | func (*gogoCodec) Name() string {
method Marshal (line 62) | func (*gogoCodec) Marshal(v any) (mem.BufferSlice, error) {
method Unmarshal (line 74) | func (*gogoCodec) Unmarshal(data mem.BufferSlice, v any) error {
function newCodec (line 52) | func newCodec() *gogoCodec {
function useGogo (line 84) | func useGogo(t reflect.Type) bool {
FILE: internal/gogocodec/codec_test.go
function TestCodecMarshallAndUnmarshall_jaeger_type (line 23) | func TestCodecMarshallAndUnmarshall_jaeger_type(t *testing.T) {
function TestCodecMarshallAndUnmarshall_no_jaeger_type (line 35) | func TestCodecMarshallAndUnmarshall_no_jaeger_type(t *testing.T) {
function TestWireCompatibility (line 53) | func TestWireCompatibility(t *testing.T) {
function TestUseGogo (line 72) | func TestUseGogo(t *testing.T) {
function BenchmarkCodecUnmarshal25Spans (line 78) | func BenchmarkCodecUnmarshal25Spans(b *testing.B) {
function TestMain (line 101) | func TestMain(m *testing.M) {
FILE: internal/grpctest/reflection.go
type ReflectionServiceValidator (line 18) | type ReflectionServiceValidator struct
method Execute (line 24) | func (v ReflectionServiceValidator) Execute(t *testing.T) {
FILE: internal/grpctest/reflection_test.go
function TestReflectionServiceValidator (line 18) | func TestReflectionServiceValidator(t *testing.T) {
function TestMain (line 38) | func TestMain(m *testing.M) {
FILE: internal/gzipfs/gzip.go
constant suffix (line 14) | suffix = ".gz"
type file (line 16) | type file struct
method Stat (line 31) | func (f file) Stat() (fs.FileInfo, error) {
method Read (line 42) | func (f *file) Read(buf []byte) (int, error) {
method Close (line 55) | func (f file) Close() error {
type fileInfo (line 22) | type fileInfo struct
method Name (line 59) | func (fi fileInfo) Name() string {
method Size (line 64) | func (fi fileInfo) Size() int64 { return fi.size }
method Mode (line 66) | func (fi fileInfo) Mode() fs.FileMode { return fi.info.Mode() }
method ModTime (line 68) | func (fi fileInfo) ModTime() time.Time { return fi.info.ModTime() }
method IsDir (line 70) | func (fi fileInfo) IsDir() bool { return fi.info.IsDir() }
method Sys (line 72) | func (fileInfo) Sys() any { return nil }
type fileSystem (line 27) | type fileSystem struct
method Open (line 80) | func (cfs fileSystem) Open(path string) (fs.File, error) {
function New (line 76) | func New(fileSys fs.FS) fs.FS {
FILE: internal/gzipfs/gzip_test.go
type mockFile (line 25) | type mockFile struct
method Stat (line 29) | func (f *mockFile) Stat() (fs.FileInfo, error) {
method Read (line 33) | func (f *mockFile) Read([]byte) (int, error) {
method Close (line 37) | func (f *mockFile) Close() error {
function TestFS (line 41) | func TestFS(t *testing.T) {
function TestFileStatError (line 130) | func TestFileStatError(t *testing.T) {
function TestFileRead (line 136) | func TestFileRead(t *testing.T) {
function TestMain (line 144) | func TestMain(m *testing.M) {
FILE: internal/hostname/hostname.go
type hostname (line 13) | type hostname struct
function AsIdentifier (line 24) | func AsIdentifier() (string, error) {
FILE: internal/hostname/hostname_test.go
function TestAsIdentifier (line 17) | func TestAsIdentifier(t *testing.T) {
function TestMain (line 39) | func TestMain(m *testing.M) {
FILE: internal/httpfs/prefixed.go
function PrefixedFS (line 12) | func PrefixedFS(prefix string, fs http.FileSystem) http.FileSystem {
type prefixedFS (line 19) | type prefixedFS struct
method Open (line 24) | func (fs *prefixedFS) Open(name string) (http.File, error) {
FILE: internal/httpfs/prefixed_test.go
function TestPrefixedFS (line 19) | func TestPrefixedFS(t *testing.T) {
function TestMain (line 40) | func TestMain(m *testing.M) {
FILE: internal/jaegerclientenv2otel/envvars.go
function MapJaegerToOtelEnvVars (line 37) | func MapJaegerToOtelEnvVars(logger *zap.Logger) {
FILE: internal/jaegerclientenv2otel/envvars_test.go
function TestMapJaegerToOtelEnvVars (line 15) | func TestMapJaegerToOtelEnvVars(t *testing.T) {
function TestMain (line 27) | func TestMain(m *testing.M) {
FILE: internal/jiter/iter.go
function CollectWithErrors (line 11) | func CollectWithErrors[V any](seq iter.Seq2[V, error]) ([]V, error) {
function FlattenWithErrors (line 22) | func FlattenWithErrors[V any](seq iter.Seq2[[]V, error]) ([]V, error) {
FILE: internal/jiter/iter_test.go
function TestCollectWithErrors (line 13) | func TestCollectWithErrors(t *testing.T) {
function TestFlattenWithErrors (line 82) | func TestFlattenWithErrors(t *testing.T) {
FILE: internal/jiter/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: internal/jptrace/aggregator.go
function AggregateTraces (line 17) | func AggregateTraces(tracesSeq iter.Seq2[[]ptrace.Traces, error]) iter.S...
function AggregateTracesWithLimit (line 26) | func AggregateTracesWithLimit(tracesSeq iter.Seq2[[]ptrace.Traces, error...
function mergeTracesWithLimit (line 90) | func mergeTracesWithLimit(dest ptrace.Traces, destCount int, src ptrace....
function copySpansUpToLimit (line 107) | func copySpansUpToLimit(dest, src ptrace.Traces, limit int) {
function MergeTraces (line 151) | func MergeTraces(dest, src ptrace.Traces) {
function markTraceTruncated (line 159) | func markTraceTruncated(trace ptrace.Traces, maxSize int) {
FILE: internal/jptrace/aggregator_test.go
function TestAggregateTraces_AggregatesSpansWithSameTraceID (line 16) | func TestAggregateTraces_AggregatesSpansWithSameTraceID(t *testing.T) {
function TestAggregateTraces_YieldsErrorFromTracesSeq (line 79) | func TestAggregateTraces_YieldsErrorFromTracesSeq(t *testing.T) {
function TestAggregateTraces_RespectsEarlyReturn (line 109) | func TestAggregateTraces_RespectsEarlyReturn(t *testing.T) {
function TestAggregateTracesWithLimit (line 139) | func TestAggregateTracesWithLimit(t *testing.T) {
function TestCopySpansUpToLimit (line 189) | func TestCopySpansUpToLimit(t *testing.T) {
function TestCopySpansUpToLimit_MultipleResourceSpans (line 202) | func TestCopySpansUpToLimit_MultipleResourceSpans(t *testing.T) {
function TestCopySpansUpToLimit_MultipleScopeSpans (line 222) | func TestCopySpansUpToLimit_MultipleScopeSpans(t *testing.T) {
function TestCopySpansUpToLimit_NoEmptyContainers (line 243) | func TestCopySpansUpToLimit_NoEmptyContainers(t *testing.T) {
function TestAggregateTracesWithLimit_MultiBatch (line 260) | func TestAggregateTracesWithLimit_MultiBatch(t *testing.T) {
function TestAggregateTracesWithLimit_ExactLimitThenOverflow (line 303) | func TestAggregateTracesWithLimit_ExactLimitThenOverflow(t *testing.T) {
function TestMarkAndCheckTruncated (line 338) | func TestMarkAndCheckTruncated(t *testing.T) {
function TestAggregateTraces_HandlesEmptyTraces (line 349) | func TestAggregateTraces_HandlesEmptyTraces(t *testing.T) {
function TestAggregateTraces_DoesNotYieldAfterConsumerStops (line 379) | func TestAggregateTraces_DoesNotYieldAfterConsumerStops(t *testing.T) {
FILE: internal/jptrace/attributes.go
constant WarningsAttribute (line 14) | WarningsAttribute = "@jaeger@warnings"
constant FormatAttribute (line 18) | FormatAttribute = "@jaeger@format"
function PcommonMapToPlainMap (line 21) | func PcommonMapToPlainMap(attributes pcommon.Map) map[string]string {
function PlainMapToPcommonMap (line 30) | func PlainMapToPcommonMap(attributesMap map[string]string) pcommon.Map {
FILE: internal/jptrace/attributes_test.go
function TestPcommonMapToPlainMap (line 13) | func TestPcommonMapToPlainMap(t *testing.T) {
function TestPlainMapToPcommonMap (line 63) | func TestPlainMapToPcommonMap(t *testing.T) {
FILE: internal/jptrace/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: internal/jptrace/sanitizer/emptyservicename.go
constant emptyServiceName (line 14) | emptyServiceName = "empty-service-name"
constant serviceNameWrongType (line 15) | serviceNameWrongType = "service-name-wrong-type"
constant missingServiceName (line 16) | missingServiceName = "missing-service-name"
function NewEmptyServiceNameSanitizer (line 21) | func NewEmptyServiceNameSanitizer() Func {
function sanitizeEmptyServiceName (line 25) | func sanitizeEmptyServiceName(traces ptrace.Traces) ptrace.Traces {
FILE: internal/jptrace/sanitizer/emptyservicename_test.go
function TestEmptyServiceNameSanitizer_SubstitutesCorrectlyForStrings (line 13) | func TestEmptyServiceNameSanitizer_SubstitutesCorrectlyForStrings(t *tes...
function TestEmptyServiceNameSanitizer_SubstitutesCorrectlyForNonStringType (line 62) | func TestEmptyServiceNameSanitizer_SubstitutesCorrectlyForNonStringType(...
function TestEmptyServiceNameSanitizer_DefaultCases (line 82) | func TestEmptyServiceNameSanitizer_DefaultCases(t *testing.T) {
FILE: internal/jptrace/sanitizer/emptyspanname.go
constant emptySpanName (line 11) | emptySpanName = "empty-span-name"
function NewEmptySpanNameSanitizer (line 16) | func NewEmptySpanNameSanitizer() Func {
function sanitizeEmptySpanName (line 20) | func sanitizeEmptySpanName(traces ptrace.Traces) ptrace.Traces {
function tracesNeedSpanNameSanitization (line 47) | func tracesNeedSpanNameSanitization(traces ptrace.Traces) bool {
FILE: internal/jptrace/sanitizer/emptyspanname_test.go
function TestEmptySpanNameSanitizer (line 14) | func TestEmptySpanNameSanitizer(t *testing.T) {
function TestEmptySpanNameSanitizer_ReadOnly (line 59) | func TestEmptySpanNameSanitizer_ReadOnly(t *testing.T) {
function TestEmptySpanNameSanitizer_NoModificationNeeded (line 81) | func TestEmptySpanNameSanitizer_NoModificationNeeded(t *testing.T) {
FILE: internal/jptrace/sanitizer/negative_duration_santizer.go
constant minDuration (line 16) | minDuration = time.Duration(1)
function NewNegativeDurationSanitizer (line 24) | func NewNegativeDurationSanitizer() Func {
function sanitizeNegativeDuration (line 28) | func sanitizeNegativeDuration(traces ptrace.Traces) ptrace.Traces {
function tracesNeedDurationSanitization (line 53) | func tracesNeedDurationSanitization(traces ptrace.Traces) bool {
function spanNeedsDurationSanitization (line 66) | func spanNeedsDurationSanitization(span ptrace.Span) bool {
function sanitizeDuration (line 72) | func sanitizeDuration(span *ptrace.Span) {
FILE: internal/jptrace/sanitizer/negative_duration_santizer_test.go
function TestNegativeDurationSanitizer (line 18) | func TestNegativeDurationSanitizer(t *testing.T) {
FILE: internal/jptrace/sanitizer/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: internal/jptrace/sanitizer/readonly_test.go
function TestSanitizersWithReadOnlyTraces (line 19) | func TestSanitizersWithReadOnlyTraces(t *testing.T) {
function TestSanitizersWithReadOnlyTracesNoModification (line 96) | func TestSanitizersWithReadOnlyTracesNoModification(t *testing.T) {
function TestChainedSanitizerWithReadOnlyTraces (line 163) | func TestChainedSanitizerWithReadOnlyTraces(t *testing.T) {
FILE: internal/jptrace/sanitizer/sanitizer.go
type Func (line 11) | type Func
function NewStandardSanitizers (line 18) | func NewStandardSanitizers() []Func {
function NewChainedSanitizer (line 29) | func NewChainedSanitizer(sanitizers ...Func) Func {
FILE: internal/jptrace/sanitizer/sanitizer_test.go
function TestNewStandardSanitizers (line 13) | func TestNewStandardSanitizers(t *testing.T) {
function TestNewChainedSanitizer (line 18) | func TestNewChainedSanitizer(t *testing.T) {
FILE: internal/jptrace/sanitizer/utf8.go
constant invalidSpanName (line 15) | invalidSpanName = "invalid-span-name"
constant invalidTagKey (line 16) | invalidTagKey = "invalid-tag-key"
function NewUTF8Sanitizer (line 26) | func NewUTF8Sanitizer() Func {
function sanitizeUTF8 (line 30) | func sanitizeUTF8(traces ptrace.Traces) ptrace.Traces {
function tracesNeedUTF8Sanitization (line 74) | func tracesNeedUTF8Sanitization(traces ptrace.Traces) bool {
function attributesNeedUTF8Sanitization (line 95) | func attributesNeedUTF8Sanitization(attributes pcommon.Map) bool {
function sanitizeAttributes (line 110) | func sanitizeAttributes(attributes pcommon.Map) {
FILE: internal/jptrace/sanitizer/utf8_test.go
function invalidUTF8 (line 16) | func invalidUTF8() string {
function getBytesValueFromString (line 21) | func getBytesValueFromString(s string) pcommon.Value {
function TestUTF8Sanitizer_SanitizesResourceSpanAttributes (line 64) | func TestUTF8Sanitizer_SanitizesResourceSpanAttributes(t *testing.T) {
function TestUTF8Sanitizer_SanitizesScopeSpanAttributes (line 89) | func TestUTF8Sanitizer_SanitizesScopeSpanAttributes(t *testing.T) {
function TestUTF8Sanitizer_SanitizesSpanAttributes (line 118) | func TestUTF8Sanitizer_SanitizesSpanAttributes(t *testing.T) {
function TestUTF8Sanitizer_SanitizesInvalidSpanName (line 149) | func TestUTF8Sanitizer_SanitizesInvalidSpanName(t *testing.T) {
function TestUTF8Sanitizer_DoesNotSanitizeValidSpanName (line 172) | func TestUTF8Sanitizer_DoesNotSanitizeValidSpanName(t *testing.T) {
function TestUTF8Sanitizer_RemovesInvalidKeys (line 195) | func TestUTF8Sanitizer_RemovesInvalidKeys(t *testing.T) {
function TestUTF8Sanitizer_DoesNotSanitizeNonStringAttributeValue (line 230) | func TestUTF8Sanitizer_DoesNotSanitizeNonStringAttributeValue(t *testing...
function TestUTF8Sanitizer_SanitizesNonStringAttributeValueWithInvalidKey (line 250) | func TestUTF8Sanitizer_SanitizesNonStringAttributeValueWithInvalidKey(t ...
function TestUTF8Sanitizer_SanitizesMultipleAttributesWithInvalidKeys (line 270) | func TestUTF8Sanitizer_SanitizesMultipleAttributesWithInvalidKeys(t *tes...
FILE: internal/jptrace/spaniter.go
type SpanIterPos (line 13) | type SpanIterPos struct
function SpanIter (line 21) | func SpanIter(traces ptrace.Traces) iter.Seq2[SpanIterPos, ptrace.Span] {
function GetTraceID (line 43) | func GetTraceID(traces ptrace.Traces) pcommon.TraceID {
FILE: internal/jptrace/spaniter_test.go
function TestSpanIter (line 14) | func TestSpanIter(t *testing.T) {
function TestSpanIterStopIteration (line 74) | func TestSpanIterStopIteration(t *testing.T) {
function TestGetTraceID (line 97) | func TestGetTraceID(t *testing.T) {
FILE: internal/jptrace/spankind.go
function StringToSpanKind (line 12) | func StringToSpanKind(sk string) ptrace.SpanKind {
function SpanKindToString (line 29) | func SpanKindToString(sk ptrace.SpanKind) string {
FILE: internal/jptrace/spankind_test.go
function TestStringToSpanKind (line 13) | func TestStringToSpanKind(t *testing.T) {
function TestSpanKindToString (line 62) | func TestSpanKindToString(t *testing.T) {
FILE: internal/jptrace/spanmap.go
function SpanMap (line 11) | func SpanMap[K comparable](traces ptrace.Traces, keyFn func(ptrace.Span)...
FILE: internal/jptrace/spanmap_test.go
function TestSpanMap (line 13) | func TestSpanMap(t *testing.T) {
FILE: internal/jptrace/statuscode.go
function StringToStatusCode (line 8) | func StringToStatusCode(sc string) ptrace.StatusCode {
FILE: internal/jptrace/statuscode_test.go
function TestConvertStatusCode (line 13) | func TestConvertStatusCode(t *testing.T) {
FILE: internal/jptrace/traces.go
type TracesData (line 19) | type TracesData
method ToTraces (line 26) | func (td TracesData) ToTraces() ptrace.Traces {
method Marshal (line 31) | func (td *TracesData) Marshal() ([]byte, error) {
method MarshalTo (line 36) | func (td *TracesData) MarshalTo(buf []byte) (n int, err error) {
method MarshalToSizedBuffer (line 41) | func (td *TracesData) MarshalToSizedBuffer(buf []byte) (int, error) {
method MarshalJSONPB (line 51) | func (td *TracesData) MarshalJSONPB(*jsonpb.Marshaler) ([]byte, error) {
method UnmarshalJSONPB (line 56) | func (td *TracesData) UnmarshalJSONPB(_ *jsonpb.Unmarshaler, data []by...
method Size (line 66) | func (td *TracesData) Size() int {
method Unmarshal (line 71) | func (td *TracesData) Unmarshal(data []byte) error {
method ProtoMessage (line 81) | func (*TracesData) ProtoMessage() {
method Reset (line 86) | func (td *TracesData) Reset() {
method String (line 91) | func (*TracesData) String() string {
FILE: internal/jptrace/traces_test.go
function TestTracesData (line 14) | func TestTracesData(t *testing.T) {
FILE: internal/jptrace/valuetype.go
function StringToValueType (line 12) | func StringToValueType(vt string) pcommon.ValueType {
function ValueTypeToString (line 33) | func ValueTypeToString(vt pcommon.ValueType) string {
FILE: internal/jptrace/valuetype_test.go
function TestStringToValueType (line 13) | func TestStringToValueType(t *testing.T) {
function TestValueTypeToString (line 79) | func TestValueTypeToString(t *testing.T) {
function TestStringToValueTypeToString (line 135) | func TestStringToValueTypeToString(t *testing.T) {
FILE: internal/jptrace/warning.go
function AddWarnings (line 11) | func AddWarnings(span ptrace.Span, warnings ...string) {
function GetWarnings (line 23) | func GetWarnings(span ptrace.Span) []string {
FILE: internal/jptrace/warning_test.go
function TestAddWarning (line 14) | func TestAddWarning(t *testing.T) {
function TestAddWarning_MultipleWarnings (line 61) | func TestAddWarning_MultipleWarnings(t *testing.T) {
function TestGetWarnings (line 70) | func TestGetWarnings(t *testing.T) {
function TestGetWarnings_EmptySpan (line 108) | func TestGetWarnings_EmptySpan(t *testing.T) {
FILE: internal/jtracer/jtracer.go
function NewProvider (line 26) | func NewProvider(ctx context.Context, serviceName string) (trace.TracerP...
function newProviderHelper (line 30) | func newProviderHelper(
function initOTEL (line 49) | func initOTEL(ctx context.Context, svc string) (*sdktrace.TracerProvider...
function initHelper (line 53) | func initHelper(
function otelResource (line 100) | func otelResource(ctx context.Context, svc string) (*resource.Resource, ...
function defaultGRPCOptions (line 112) | func defaultGRPCOptions() []otlptracegrpc.Option {
function otelExporter (line 120) | func otelExporter(ctx context.Context) (sdktrace.SpanExporter, error) {
FILE: internal/jtracer/jtracer_test.go
function TestNewProvider (line 18) | func TestNewProvider(t *testing.T) {
function TestNewHelperProviderError (line 26) | func TestNewHelperProviderError(t *testing.T) {
function TestInitHelperExporterError (line 38) | func TestInitHelperExporterError(t *testing.T) {
function TestInitHelperResourceError (line 54) | func TestInitHelperResourceError(t *testing.T) {
function TestMain (line 69) | func TestMain(m *testing.M) {
FILE: internal/leaderelection/leader_election.go
constant acquireLockErrMsg (line 18) | acquireLockErrMsg = "Failed to acquire lock"
type ElectionParticipant (line 22) | type ElectionParticipant interface
type DistributedElectionParticipant (line 30) | type DistributedElectionParticipant struct
method Start (line 57) | func (p *DistributedElectionParticipant) Start() error {
method Close (line 64) | func (p *DistributedElectionParticipant) Close() error {
method IsLeader (line 71) | func (p *DistributedElectionParticipant) IsLeader() bool {
method runAcquireLockLoop (line 77) | func (p *DistributedElectionParticipant) runAcquireLockLoop() {
method acquireLock (line 93) | func (p *DistributedElectionParticipant) acquireLock() time.Duration {
method setLeader (line 108) | func (p *DistributedElectionParticipant) setLeader(isLeader bool) {
type ElectionParticipantOptions (line 40) | type ElectionParticipantOptions struct
function NewElectionParticipant (line 47) | func NewElectionParticipant(lock dl.Lock, resourceName string, options E...
FILE: internal/leaderelection/leader_election_test.go
function TestAcquireLock (line 24) | func TestAcquireLock(t *testing.T) {
function TestRunAcquireLockLoopFollowerOnly (line 68) | func TestRunAcquireLockLoopFollowerOnly(t *testing.T) {
function TestMain (line 98) | func TestMain(m *testing.M) {
FILE: internal/leaderelection/mocks/mocks.go
function NewElectionParticipant (line 18) | func NewElectionParticipant(t interface {
type ElectionParticipant (line 31) | type ElectionParticipant struct
method EXPECT (line 39) | func (_m *ElectionParticipant) EXPECT() *ElectionParticipant_Expecter {
method Close (line 44) | func (_mock *ElectionParticipant) Close() error {
method IsLeader (line 88) | func (_mock *ElectionParticipant) IsLeader() bool {
method Start (line 132) | func (_mock *ElectionParticipant) Start() error {
type ElectionParticipant_Expecter (line 35) | type ElectionParticipant_Expecter struct
method Close (line 66) | func (_e *ElectionParticipant_Expecter) Close() *ElectionParticipant_C...
method IsLeader (line 110) | func (_e *ElectionParticipant_Expecter) IsLeader() *ElectionParticipan...
method Start (line 154) | func (_e *ElectionParticipant_Expecter) Start() *ElectionParticipant_S...
type ElectionParticipant_Close_Call (line 61) | type ElectionParticipant_Close_Call struct
method Run (line 70) | func (_c *ElectionParticipant_Close_Call) Run(run func()) *ElectionPar...
method Return (line 77) | func (_c *ElectionParticipant_Close_Call) Return(err error) *ElectionP...
method RunAndReturn (line 82) | func (_c *ElectionParticipant_Close_Call) RunAndReturn(run func() erro...
type ElectionParticipant_IsLeader_Call (line 105) | type ElectionParticipant_IsLeader_Call struct
method Run (line 114) | func (_c *ElectionParticipant_IsLeader_Call) Run(run func()) *Election...
method Return (line 121) | func (_c *ElectionParticipant_IsLeader_Call) Return(b bool) *ElectionP...
method RunAndReturn (line 126) | func (_c *ElectionParticipant_IsLeader_Call) RunAndReturn(run func() b...
type ElectionParticipant_Start_Call (line 149) | type ElectionParticipant_Start_Call struct
method Run (line 158) | func (_c *ElectionParticipant_Start_Call) Run(run func()) *ElectionPar...
method Return (line 165) | func (_c *ElectionParticipant_Start_Call) Return(err error) *ElectionP...
method RunAndReturn (line 170) | func (_c *ElectionParticipant_Start_Call) RunAndReturn(run func() erro...
FILE: internal/metrics/benchmark/benchmark_test.go
function TestMain (line 20) | func TestMain(m *testing.M) {
function setupPrometheusFactory (line 24) | func setupPrometheusFactory() metrics.Factory {
function setupOTELFactory (line 29) | func setupOTELFactory(b *testing.B) metrics.Factory {
function benchmarkCounter (line 39) | func benchmarkCounter(b *testing.B, factory metrics.Factory) {
function benchmarkGauge (line 50) | func benchmarkGauge(b *testing.B, factory metrics.Factory) {
function benchmarkTimer (line 61) | func benchmarkTimer(b *testing.B, factory metrics.Factory) {
function benchmarkHistogram (line 72) | func benchmarkHistogram(b *testing.B, factory metrics.Factory) {
function BenchmarkPrometheusCounter (line 83) | func BenchmarkPrometheusCounter(b *testing.B) {
function BenchmarkOTELCounter (line 87) | func BenchmarkOTELCounter(b *testing.B) {
function BenchmarkPrometheusGauge (line 91) | func BenchmarkPrometheusGauge(b *testing.B) {
function BenchmarkOTELGauge (line 95) | func BenchmarkOTELGauge(b *testing.B) {
function BenchmarkPrometheusTimer (line 99) | func BenchmarkPrometheusTimer(b *testing.B) {
function BenchmarkOTELTimer (line 103) | func BenchmarkOTELTimer(b *testing.B) {
function BenchmarkPrometheusHistogram (line 107) | func BenchmarkPrometheusHistogram(b *testing.B) {
function BenchmarkOTELHistogram (line 111) | func BenchmarkOTELHistogram(b *testing.B) {
FILE: internal/metrics/counter.go
type Counter (line 8) | type Counter interface
type nullCounter (line 16) | type nullCounter struct
method Inc (line 18) | func (nullCounter) Inc(int64) {}
FILE: internal/metrics/factory.go
type NSOptions (line 12) | type NSOptions struct
type Options (line 18) | type Options struct
type TimerOptions (line 25) | type TimerOptions struct
type HistogramOptions (line 33) | type HistogramOptions struct
type Factory (line 41) | type Factory interface
type nullFactory (line 54) | type nullFactory struct
method Counter (line 56) | func (nullFactory) Counter(Options) Counter {
method Timer (line 60) | func (nullFactory) Timer(TimerOptions) Timer {
method Gauge (line 64) | func (nullFactory) Gauge(Options) Gauge {
method Histogram (line 68) | func (nullFactory) Histogram(HistogramOptions) Histogram {
method Namespace (line 71) | func (nullFactory) Namespace(NSOptions /* scope */) Factory { return N...
FILE: internal/metrics/gauge.go
type Gauge (line 8) | type Gauge interface
type nullGauge (line 16) | type nullGauge struct
method Update (line 18) | func (nullGauge) Update(int64) {}
FILE: internal/metrics/histogram.go
type Histogram (line 7) | type Histogram interface
type nullHistogram (line 15) | type nullHistogram struct
method Record (line 17) | func (nullHistogram) Record(float64) {}
FILE: internal/metrics/metrics.go
function MustInit (line 25) | func MustInit(metrics any, factory Factory, globalTags map[string]string) {
function Init (line 33) | func Init(m any, factory Factory, globalTags map[string]string) error {
FILE: internal/metrics/metrics_test.go
function TestInitMetrics (line 19) | func TestInitMetrics(t *testing.T) {
function TestInitMetricsFailures (line 87) | func TestInitMetricsFailures(t *testing.T) {
function TestInitPanic (line 106) | func TestInitPanic(t *testing.T) {
function TestNullMetrics (line 116) | func TestNullMetrics(*testing.T) {
function TestMain (line 137) | func TestMain(m *testing.M) {
FILE: internal/metrics/metricsbuilder/builder.go
constant metricsBackend (line 21) | metricsBackend = "metrics-backend"
constant metricsHTTPRoute (line 22) | metricsHTTPRoute = "metrics-http-route"
constant defaultMetricsBackend (line 23) | defaultMetricsBackend = "prometheus"
constant defaultMetricsRoute (line 24) | defaultMetricsRoute = "/metrics"
type Builder (line 30) | type Builder struct
method InitFromViper (line 49) | func (b *Builder) InitFromViper(v *viper.Viper) *Builder {
method CreateMetricsFactory (line 58) | func (b *Builder) CreateMetricsFactory(namespace string) (metrics.Fact...
method Handler (line 71) | func (b *Builder) Handler() http.Handler {
function AddFlags (line 37) | func AddFlags(flags *flag.FlagSet) {
FILE: internal/metrics/metricsbuilder/builder_test.go
function TestAddFlags (line 21) | func TestAddFlags(t *testing.T) {
function TestBuilder (line 41) | func TestBuilder(t *testing.T) {
function TestMain (line 101) | func TestMain(m *testing.M) {
FILE: internal/metrics/otelmetrics/counter.go
type otelCounter (line 12) | type otelCounter struct
method Inc (line 18) | func (c *otelCounter) Inc(value int64) {
FILE: internal/metrics/otelmetrics/factory.go
type otelFactory (line 18) | type otelFactory struct
method Counter (line 35) | func (f *otelFactory) Counter(opts metrics.Options) metrics.Counter {
method Gauge (line 48) | func (f *otelFactory) Gauge(opts metrics.Options) metrics.Gauge {
method Histogram (line 63) | func (f *otelFactory) Histogram(opts metrics.HistogramOptions) metrics...
method Timer (line 78) | func (f *otelFactory) Timer(opts metrics.TimerOptions) metrics.Timer {
method Namespace (line 92) | func (f *otelFactory) Namespace(opts metrics.NSOptions) metrics.Factory {
method subScope (line 102) | func (f *otelFactory) subScope(name string) string {
method normalize (line 112) | func (f *otelFactory) normalize(v string) string {
method mergeTags (line 116) | func (f *otelFactory) mergeTags(tags map[string]string) map[string]str...
function NewFactory (line 26) | func NewFactory(meterProvider metric.MeterProvider) metrics.Factory {
function attributeSetOption (line 123) | func attributeSetOption(tags map[string]string) metric.MeasurementOption {
FILE: internal/metrics/otelmetrics/factory_test.go
function TestMain (line 22) | func TestMain(m *testing.M) {
function newTestFactory (line 26) | func newTestFactory(t *testing.T, registry *promreg.Registry) metrics.Fa...
function findMetric (line 36) | func findMetric(t *testing.T, registry *promreg.Registry, name string) *...
function promLabelsToMap (line 51) | func promLabelsToMap(labels []*prommodel.LabelPair) map[string]string {
function TestInvalidCounter (line 59) | func TestInvalidCounter(t *testing.T) {
function TestInvalidGauge (line 67) | func TestInvalidGauge(t *testing.T) {
function TestInvalidHistogram (line 75) | func TestInvalidHistogram(t *testing.T) {
function TestInvalidTimer (line 83) | func TestInvalidTimer(t *testing.T) {
function TestCounter (line 91) | func TestCounter(t *testing.T) {
function TestGauge (line 111) | func TestGauge(t *testing.T) {
function TestHistogram (line 131) | func TestHistogram(t *testing.T) {
function TestTimer (line 151) | func TestTimer(t *testing.T) {
function TestNamespace (line 171) | func TestNamespace(t *testing.T) {
function TestNormalization (line 243) | func TestNormalization(t *testing.T) {
FILE: internal/metrics/otelmetrics/gauge.go
type otelGauge (line 12) | type otelGauge struct
method Update (line 18) | func (g *otelGauge) Update(value int64) {
FILE: internal/metrics/otelmetrics/histogram.go
type otelHistogram (line 12) | type otelHistogram struct
method Record (line 18) | func (h *otelHistogram) Record(value float64) {
FILE: internal/metrics/otelmetrics/timer.go
type otelTimer (line 13) | type otelTimer struct
method Record (line 19) | func (t *otelTimer) Record(d time.Duration) {
FILE: internal/metrics/prometheus/cache.go
type vectorCache (line 14) | type vectorCache struct
method getOrMakeCounterVec (line 31) | func (c *vectorCache) getOrMakeCounterVec(opts prometheus.CounterOpts,...
method getOrMakeGaugeVec (line 45) | func (c *vectorCache) getOrMakeGaugeVec(opts prometheus.GaugeOpts, lab...
method getOrMakeHistogramVec (line 59) | func (c *vectorCache) getOrMakeHistogramVec(opts prometheus.HistogramO...
method getCacheKey (line 73) | func (*vectorCache) getCacheKey(name string, labels []string) string {
function newVectorCache (line 22) | func newVectorCache(registerer prometheus.Registerer) *vectorCache {
FILE: internal/metrics/prometheus/factory.go
type Factory (line 18) | type Factory struct
method Counter (line 120) | func (f *Factory) Counter(options metrics.Options) metrics.Counter {
method Gauge (line 145) | func (f *Factory) Gauge(options metrics.Options) metrics.Gauge {
method Timer (line 169) | func (f *Factory) Timer(options metrics.TimerOptions) metrics.Timer {
method Histogram (line 203) | func (f *Factory) Histogram(options metrics.HistogramOptions) metrics....
method Namespace (line 230) | func (f *Factory) Namespace(scope metrics.NSOptions) metrics.Factory {
method subScope (line 270) | func (f *Factory) subScope(name string) string {
method normalize (line 280) | func (f *Factory) normalize(v string) string {
method mergeTags (line 284) | func (f *Factory) mergeTags(tags map[string]string) map[string]string {
method tagNames (line 291) | func (*Factory) tagNames(tags map[string]string) []string {
method tagsAsLabelValues (line 300) | func (*Factory) tagsAsLabelValues(labels []string, tags map[string]str...
method selectBuckets (line 308) | func (f *Factory) selectBuckets(buckets []float64) []float64 {
type options (line 29) | type options struct
type Separator (line 36) | type Separator
constant SeparatorUnderscore (line 40) | SeparatorUnderscore Separator = '_'
constant SeparatorColon (line 43) | SeparatorColon = ':'
type Option (line 47) | type Option
function WithRegisterer (line 51) | func WithRegisterer(registerer prometheus.Registerer) Option {
function WithBuckets (line 59) | func WithBuckets(buckets []float64) Option {
function WithSeparator (line 67) | func WithSeparator(separator Separator) Option {
function applyOptions (line 73) | func applyOptions(opts []Option) *options {
function New (line 95) | func New(opts ...Option) *Factory {
function newFactory (line 108) | func newFactory(parent *Factory, scope string, tags map[string]string) *...
function asFloatBuckets (line 194) | func asFloatBuckets(buckets []time.Duration) []float64 {
type counter (line 234) | type counter struct
method Inc (line 238) | func (c *counter) Inc(v int64) {
type gauge (line 242) | type gauge struct
method Update (line 246) | func (g *gauge) Update(v int64) {
type observer (line 250) | type observer interface
type timer (line 254) | type timer struct
method Record (line 258) | func (t *timer) Record(v time.Duration) {
type histogram (line 262) | type histogram struct
method Record (line 266) | func (h *histogram) Record(v float64) {
function counterNamingConvention (line 315) | func counterNamingConvention(name string) string {
FILE: internal/metrics/prometheus/factory_test.go
function TestOptions (line 20) | func TestOptions(t *testing.T) {
function TestSeparator (line 25) | func TestSeparator(t *testing.T) {
function TestCounter (line 42) | func TestCounter(t *testing.T) {
function TestCounterDefaultHelp (line 84) | func TestCounterDefaultHelp(t *testing.T) {
function TestCounterNotValidLabel (line 99) | func TestCounterNotValidLabel(t *testing.T) {
function TestGauge (line 111) | func TestGauge(t *testing.T) {
function TestGaugeDefaultHelp (line 153) | func TestGaugeDefaultHelp(t *testing.T) {
function TestGaugeNotValidLabel (line 168) | func TestGaugeNotValidLabel(t *testing.T) {
function TestTimer (line 180) | func TestTimer(t *testing.T) {
function TestTimerDefaultHelp (line 244) | func TestTimerDefaultHelp(t *testing.T) {
function TestTimerNotValidLabel (line 259) | func TestTimerNotValidLabel(t *testing.T) {
function TestTimerCustomBuckets (line 271) | func TestTimerCustomBuckets(t *testing.T) {
function TestTimerDefaultBuckets (line 292) | func TestTimerDefaultBuckets(t *testing.T) {
function TestHistogram (line 313) | func TestHistogram(t *testing.T) {
function TestHistogramDefaultHelp (line 377) | func TestHistogramDefaultHelp(t *testing.T) {
function TestHistogramCustomBuckets (line 392) | func TestHistogramCustomBuckets(t *testing.T) {
function TestHistogramNotValidLabel (line 413) | func TestHistogramNotValidLabel(t *testing.T) {
function TestHistogramDefaultBuckets (line 425) | func TestHistogramDefaultBuckets(t *testing.T) {
function findMetric (line 446) | func findMetric(t *testing.T, snapshot []*prommodel.MetricFamily, name s...
function TestMain (line 475) | func TestMain(m *testing.M) {
FILE: internal/metrics/stopwatch.go
function StartStopwatch (line 15) | func StartStopwatch(timer Timer) Stopwatch {
type Stopwatch (line 20) | type Stopwatch struct
method Stop (line 26) | func (s Stopwatch) Stop() {
method ElapsedTime (line 31) | func (s Stopwatch) ElapsedTime() time.Duration {
FILE: internal/metrics/timer.go
type Timer (line 13) | type Timer interface
type nullTimer (line 21) | type nullTimer struct
method Record (line 23) | func (nullTimer) Record(time.Duration) {}
FILE: internal/metricstest/keys.go
function GetKey (line 14) | func GetKey(name string, tags map[string]string, tagsSep string, tagKVSe...
FILE: internal/metricstest/local.go
type numeric (line 22) | type numeric interface
type simpleHistogram (line 29) | type simpleHistogram struct
method record (line 34) | func (h *simpleHistogram[T]) record(v T) {
method valueAtPercentile (line 40) | func (h *simpleHistogram[T]) valueAtPercentile(q float64) int64 {
type Backend (line 55) | type Backend struct
method Clear (line 82) | func (b *Backend) Clear() {
method IncCounter (line 98) | func (b *Backend) IncCounter(name string, tags map[string]string, delt...
method UpdateGauge (line 112) | func (b *Backend) UpdateGauge(name string, tags map[string]string, val...
method RecordHistogram (line 126) | func (b *Backend) RecordHistogram(name string, tags map[string]string,...
method findOrCreateHistogram (line 132) | func (b *Backend) findOrCreateHistogram(name string) *simpleHistogram[...
method RecordTimer (line 144) | func (b *Backend) RecordTimer(name string, tags map[string]string, d t...
method findOrCreateTimer (line 150) | func (b *Backend) findOrCreateTimer(name string) *simpleHistogram[int6...
method Snapshot (line 171) | func (b *Backend) Snapshot() (counters, gauges map[string]int64) {
method Stop (line 214) | func (*Backend) Stop() {}
function NewBackend (line 70) | func NewBackend(_ time.Duration) *Backend {
type stats (line 216) | type stats struct
type localTimer (line 224) | type localTimer struct
method Record (line 228) | func (l *localTimer) Record(d time.Duration) {
type localHistogram (line 232) | type localHistogram struct
method Record (line 236) | func (l *localHistogram) Record(v float64) {
type localCounter (line 240) | type localCounter struct
method Inc (line 244) | func (l *localCounter) Inc(delta int64) {
type localGauge (line 248) | type localGauge struct
method Update (line 252) | func (l *localGauge) Update(value int64) {
type Factory (line 257) | type Factory struct
method appendTags (line 271) | func (f *Factory) appendTags(tags map[string]string) map[string]string {
method newNamespace (line 278) | func (f *Factory) newNamespace(name string) string {
method Counter (line 291) | func (f *Factory) Counter(options metrics.Options) metrics.Counter {
method Timer (line 302) | func (f *Factory) Timer(options metrics.TimerOptions) metrics.Timer {
method Gauge (line 314) | func (f *Factory) Gauge(options metrics.Options) metrics.Gauge {
method Histogram (line 325) | func (f *Factory) Histogram(options metrics.HistogramOptions) metrics....
method Namespace (line 337) | func (f *Factory) Namespace(scope metrics.NSOptions) metrics.Factory {
method Stop (line 345) | func (f *Factory) Stop() {
function NewFactory (line 264) | func NewFactory(collectionInterval time.Duration) *Factory {
FILE: internal/metricstest/local_test.go
function TestLocalMetrics (line 16) | func TestLocalMetrics(t *testing.T) {
function TestLocalMetricsInterval (line 128) | func TestLocalMetricsInterval(t *testing.T) {
FILE: internal/metricstest/metricstest.go
type ExpectedMetric (line 14) | type ExpectedMetric struct
type ExpectedTimerMetric (line 21) | type ExpectedTimerMetric struct
method AssertTimerMetrics (line 29) | func (f *Factory) AssertTimerMetrics(t *testing.T, expectedMetrics ...Ex...
method AssertCounterMetrics (line 44) | func (f *Factory) AssertCounterMetrics(t *testing.T, expectedMetrics ......
method AssertGaugeMetrics (line 50) | func (f *Factory) AssertGaugeMetrics(t *testing.T, expectedMetrics ...Ex...
function assertMetrics (line 55) | func assertMetrics(t *testing.T, actualMetrics map[string]int64, expecte...
FILE: internal/metricstest/metricstest_test.go
function TestAssertMetrics (line 11) | func TestAssertMetrics(t *testing.T) {
function TestAssertTimerMetrics (line 21) | func TestAssertTimerMetrics(t *testing.T) {
FILE: internal/metricstest/package_test.go
function TestMain (line 12) | func TestMain(m *testing.M) {
FILE: internal/proto-gen/api_v2/metrics/openmetrics.pb.go
constant _ (line 30) | _ = proto.GoGoProtoPackageIsVersion3
type MetricType (line 33) | type MetricType
method String (line 76) | func (x MetricType) String() string {
method EnumDescriptor (line 80) | func (MetricType) EnumDescriptor() ([]byte, []int) {
constant MetricType_UNKNOWN (line 37) | MetricType_UNKNOWN MetricType = 0
constant MetricType_GAUGE (line 39) | MetricType_GAUGE MetricType = 1
constant MetricType_COUNTER (line 41) | MetricType_COUNTER MetricType = 2
constant MetricType_STATE_SET (line 43) | MetricType_STATE_SET MetricType = 3
constant MetricType_INFO (line 45) | MetricType_INFO MetricType = 4
constant MetricType_HISTOGRAM (line 47) | MetricType_HISTOGRAM MetricType = 5
constant MetricType_GAUGE_HISTOGRAM (line 49) | MetricType_GAUGE_HISTOGRAM MetricType = 6
constant MetricType_SUMMARY (line 51) | MetricType_SUMMARY MetricType = 7
type MetricSet (line 85) | type MetricSet struct
method Reset (line 93) | func (m *MetricSet) Reset() { *m = MetricSet{} }
method String (line 94) | func (m *MetricSet) String() string { return proto.CompactTextString(m) }
method ProtoMessage (line 95) | func (*MetricSet) ProtoMessage() {}
method Descriptor (line 96) | func (*MetricSet) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 99) | func (m *MetricSet) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 102) | func (m *MetricSet) XXX_Marshal(b []byte, deterministic bool) ([]byte,...
method XXX_Merge (line 114) | func (m *MetricSet) XXX_Merge(src proto.Message) {
method XXX_Size (line 117) | func (m *MetricSet) XXX_Size() int {
method XXX_DiscardUnknown (line 120) | func (m *MetricSet) XXX_DiscardUnknown() {
method GetMetricFamilies (line 126) | func (m *MetricSet) GetMetricFamilies() []*MetricFamily {
method Marshal (line 1466) | func (m *MetricSet) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1476) | func (m *MetricSet) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1481) | func (m *MetricSet) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2541) | func (m *MetricSet) Size() (n int) {
method Unmarshal (line 3064) | func (m *MetricSet) Unmarshal(dAtA []byte) error {
type MetricFamily (line 135) | type MetricFamily struct
method Reset (line 151) | func (m *MetricFamily) Reset() { *m = MetricFamily{} }
method String (line 152) | func (m *MetricFamily) String() string { return proto.CompactTextStrin...
method ProtoMessage (line 153) | func (*MetricFamily) ProtoMessage() {}
method Descriptor (line 154) | func (*MetricFamily) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 157) | func (m *MetricFamily) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 160) | func (m *MetricFamily) XXX_Marshal(b []byte, deterministic bool) ([]by...
method XXX_Merge (line 172) | func (m *MetricFamily) XXX_Merge(src proto.Message) {
method XXX_Size (line 175) | func (m *MetricFamily) XXX_Size() int {
method XXX_DiscardUnknown (line 178) | func (m *MetricFamily) XXX_DiscardUnknown() {
method GetName (line 184) | func (m *MetricFamily) GetName() string {
method GetType (line 191) | func (m *MetricFamily) GetType() MetricType {
method GetUnit (line 198) | func (m *MetricFamily) GetUnit() string {
method GetHelp (line 205) | func (m *MetricFamily) GetHelp() string {
method GetMetrics (line 212) | func (m *MetricFamily) GetMetrics() []*Metric {
method Marshal (line 1507) | func (m *MetricFamily) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1517) | func (m *MetricFamily) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1522) | func (m *MetricFamily) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2559) | func (m *MetricFamily) Size() (n int) {
method Unmarshal (line 3149) | func (m *MetricFamily) Unmarshal(dAtA []byte) error {
type Metric (line 220) | type Metric struct
method Reset (line 230) | func (m *Metric) Reset() { *m = Metric{} }
method String (line 231) | func (m *Metric) String() string { return proto.CompactTextString(m) }
method ProtoMessage (line 232) | func (*Metric) ProtoMessage() {}
method Descriptor (line 233) | func (*Metric) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 236) | func (m *Metric) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 239) | func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, er...
method XXX_Merge (line 251) | func (m *Metric) XXX_Merge(src proto.Message) {
method XXX_Size (line 254) | func (m *Metric) XXX_Size() int {
method XXX_DiscardUnknown (line 257) | func (m *Metric) XXX_DiscardUnknown() {
method GetLabels (line 263) | func (m *Metric) GetLabels() []*Label {
method GetMetricPoints (line 270) | func (m *Metric) GetMetricPoints() []*MetricPoint {
method Marshal (line 1574) | func (m *Metric) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1584) | func (m *Metric) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1589) | func (m *Metric) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2592) | func (m *Metric) Size() (n int) {
method Unmarshal (line 3349) | func (m *Metric) Unmarshal(dAtA []byte) error {
type Label (line 279) | type Label struct
method Reset (line 289) | func (m *Label) Reset() { *m = Label{} }
method String (line 290) | func (m *Label) String() string { return proto.CompactTextString(m) }
method ProtoMessage (line 291) | func (*Label) ProtoMessage() {}
method Descriptor (line 292) | func (*Label) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 295) | func (m *Label) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 298) | func (m *Label) XXX_Marshal(b []byte, deterministic bool) ([]byte, err...
method XXX_Merge (line 310) | func (m *Label) XXX_Merge(src proto.Message) {
method XXX_Size (line 313) | func (m *Label) XXX_Size() int {
method XXX_DiscardUnknown (line 316) | func (m *Label) XXX_DiscardUnknown() {
method GetName (line 322) | func (m *Label) GetName() string {
method GetValue (line 329) | func (m *Label) GetValue() string {
method Marshal (line 1629) | func (m *Label) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1639) | func (m *Label) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1644) | func (m *Label) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2616) | func (m *Label) Size() (n int) {
method Unmarshal (line 3468) | func (m *Label) Unmarshal(dAtA []byte) error {
type MetricPoint (line 337) | type MetricPoint struct
method Reset (line 356) | func (m *MetricPoint) Reset() { *m = MetricPoint{} }
method String (line 357) | func (m *MetricPoint) String() string { return proto.CompactTextString...
method ProtoMessage (line 358) | func (*MetricPoint) ProtoMessage() {}
method Descriptor (line 359) | func (*MetricPoint) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 362) | func (m *MetricPoint) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 365) | func (m *MetricPoint) XXX_Marshal(b []byte, deterministic bool) ([]byt...
method XXX_Merge (line 377) | func (m *MetricPoint) XXX_Merge(src proto.Message) {
method XXX_Size (line 380) | func (m *MetricPoint) XXX_Size() int {
method XXX_DiscardUnknown (line 383) | func (m *MetricPoint) XXX_DiscardUnknown() {
method GetValue (line 425) | func (m *MetricPoint) GetValue() isMetricPoint_Value {
method GetUnknownValue (line 432) | func (m *MetricPoint) GetUnknownValue() *UnknownValue {
method GetGaugeValue (line 439) | func (m *MetricPoint) GetGaugeValue() *GaugeValue {
method GetCounterValue (line 446) | func (m *MetricPoint) GetCounterValue() *CounterValue {
method GetHistogramValue (line 453) | func (m *MetricPoint) GetHistogramValue() *HistogramValue {
method GetStateSetValue (line 460) | func (m *MetricPoint) GetStateSetValue() *StateSetValue {
method GetInfoValue (line 467) | func (m *MetricPoint) GetInfoValue() *InfoValue {
method GetSummaryValue (line 474) | func (m *MetricPoint) GetSummaryValue() *SummaryValue {
method GetTimestamp (line 481) | func (m *MetricPoint) GetTimestamp() *types.Timestamp {
method XXX_OneofWrappers (line 489) | func (*MetricPoint) XXX_OneofWrappers() []interface{} {
method Marshal (line 1670) | func (m *MetricPoint) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1680) | func (m *MetricPoint) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1685) | func (m *MetricPoint) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2636) | func (m *MetricPoint) Size() (n int) {
method Unmarshal (line 3583) | func (m *MetricPoint) Unmarshal(dAtA []byte) error {
type isMetricPoint_Value (line 389) | type isMetricPoint_Value interface
type MetricPoint_UnknownValue (line 395) | type MetricPoint_UnknownValue struct
method isMetricPoint_Value (line 417) | func (*MetricPoint_UnknownValue) isMetricPoint_Value() {}
method MarshalTo (line 1718) | func (m *MetricPoint_UnknownValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1723) | func (m *MetricPoint_UnknownValue) MarshalToSizedBuffer(dAtA []byte) (...
method Size (line 2655) | func (m *MetricPoint_UnknownValue) Size() (n int) {
type MetricPoint_GaugeValue (line 398) | type MetricPoint_GaugeValue struct
method isMetricPoint_Value (line 418) | func (*MetricPoint_GaugeValue) isMetricPoint_Value() {}
method MarshalTo (line 1739) | func (m *MetricPoint_GaugeValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1744) | func (m *MetricPoint_GaugeValue) MarshalToSizedBuffer(dAtA []byte) (in...
method Size (line 2667) | func (m *MetricPoint_GaugeValue) Size() (n int) {
type MetricPoint_CounterValue (line 401) | type MetricPoint_CounterValue struct
method isMetricPoint_Value (line 419) | func (*MetricPoint_CounterValue) isMetricPoint_Value() {}
method MarshalTo (line 1760) | func (m *MetricPoint_CounterValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1765) | func (m *MetricPoint_CounterValue) MarshalToSizedBuffer(dAtA []byte) (...
method Size (line 2679) | func (m *MetricPoint_CounterValue) Size() (n int) {
type MetricPoint_HistogramValue (line 404) | type MetricPoint_HistogramValue struct
method isMetricPoint_Value (line 420) | func (*MetricPoint_HistogramValue) isMetricPoint_Value() {}
method MarshalTo (line 1781) | func (m *MetricPoint_HistogramValue) MarshalTo(dAtA []byte) (int, erro...
method MarshalToSizedBuffer (line 1786) | func (m *MetricPoint_HistogramValue) MarshalToSizedBuffer(dAtA []byte)...
method Size (line 2691) | func (m *MetricPoint_HistogramValue) Size() (n int) {
type MetricPoint_StateSetValue (line 407) | type MetricPoint_StateSetValue struct
method isMetricPoint_Value (line 421) | func (*MetricPoint_StateSetValue) isMetricPoint_Value() {}
method MarshalTo (line 1802) | func (m *MetricPoint_StateSetValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1807) | func (m *MetricPoint_StateSetValue) MarshalToSizedBuffer(dAtA []byte) ...
method Size (line 2703) | func (m *MetricPoint_StateSetValue) Size() (n int) {
type MetricPoint_InfoValue (line 410) | type MetricPoint_InfoValue struct
method isMetricPoint_Value (line 422) | func (*MetricPoint_InfoValue) isMetricPoint_Value() {}
method MarshalTo (line 1823) | func (m *MetricPoint_InfoValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1828) | func (m *MetricPoint_InfoValue) MarshalToSizedBuffer(dAtA []byte) (int...
method Size (line 2715) | func (m *MetricPoint_InfoValue) Size() (n int) {
type MetricPoint_SummaryValue (line 413) | type MetricPoint_SummaryValue struct
method isMetricPoint_Value (line 423) | func (*MetricPoint_SummaryValue) isMetricPoint_Value() {}
method MarshalTo (line 1844) | func (m *MetricPoint_SummaryValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1849) | func (m *MetricPoint_SummaryValue) MarshalToSizedBuffer(dAtA []byte) (...
method Size (line 2727) | func (m *MetricPoint_SummaryValue) Size() (n int) {
type UnknownValue (line 502) | type UnknownValue struct
method Reset (line 514) | func (m *UnknownValue) Reset() { *m = UnknownValue{} }
method String (line 515) | func (m *UnknownValue) String() string { return proto.CompactTextStrin...
method ProtoMessage (line 516) | func (*UnknownValue) ProtoMessage() {}
method Descriptor (line 517) | func (*UnknownValue) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 520) | func (m *UnknownValue) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 523) | func (m *UnknownValue) XXX_Marshal(b []byte, deterministic bool) ([]by...
method XXX_Merge (line 535) | func (m *UnknownValue) XXX_Merge(src proto.Message) {
method XXX_Size (line 538) | func (m *UnknownValue) XXX_Size() int {
method XXX_DiscardUnknown (line 541) | func (m *UnknownValue) XXX_DiscardUnknown() {
method GetValue (line 563) | func (m *UnknownValue) GetValue() isUnknownValue_Value {
method GetDoubleValue (line 570) | func (m *UnknownValue) GetDoubleValue() float64 {
method GetIntValue (line 577) | func (m *UnknownValue) GetIntValue() int64 {
method XXX_OneofWrappers (line 585) | func (*UnknownValue) XXX_OneofWrappers() []interface{} {
method Marshal (line 1865) | func (m *UnknownValue) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1875) | func (m *UnknownValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1880) | func (m *UnknownValue) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2739) | func (m *UnknownValue) Size() (n int) {
method Unmarshal (line 3915) | func (m *UnknownValue) Unmarshal(dAtA []byte) error {
type isUnknownValue_Value (line 547) | type isUnknownValue_Value interface
type UnknownValue_DoubleValue (line 553) | type UnknownValue_DoubleValue struct
method isUnknownValue_Value (line 560) | func (*UnknownValue_DoubleValue) isUnknownValue_Value() {}
method MarshalTo (line 1901) | func (m *UnknownValue_DoubleValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1906) | func (m *UnknownValue_DoubleValue) MarshalToSizedBuffer(dAtA []byte) (...
method Size (line 2754) | func (m *UnknownValue_DoubleValue) Size() (n int) {
type UnknownValue_IntValue (line 556) | type UnknownValue_IntValue struct
method isUnknownValue_Value (line 561) | func (*UnknownValue_IntValue) isUnknownValue_Value() {}
method MarshalTo (line 1914) | func (m *UnknownValue_IntValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1919) | func (m *UnknownValue_IntValue) MarshalToSizedBuffer(dAtA []byte) (int...
method Size (line 2763) | func (m *UnknownValue_IntValue) Size() (n int) {
type GaugeValue (line 593) | type GaugeValue struct
method Reset (line 605) | func (m *GaugeValue) Reset() { *m = GaugeValue{} }
method String (line 606) | func (m *GaugeValue) String() string { return proto.CompactTextString(...
method ProtoMessage (line 607) | func (*GaugeValue) ProtoMessage() {}
method Descriptor (line 608) | func (*GaugeValue) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 611) | func (m *GaugeValue) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 614) | func (m *GaugeValue) XXX_Marshal(b []byte, deterministic bool) ([]byte...
method XXX_Merge (line 626) | func (m *GaugeValue) XXX_Merge(src proto.Message) {
method XXX_Size (line 629) | func (m *GaugeValue) XXX_Size() int {
method XXX_DiscardUnknown (line 632) | func (m *GaugeValue) XXX_DiscardUnknown() {
method GetValue (line 654) | func (m *GaugeValue) GetValue() isGaugeValue_Value {
method GetDoubleValue (line 661) | func (m *GaugeValue) GetDoubleValue() float64 {
method GetIntValue (line 668) | func (m *GaugeValue) GetIntValue() int64 {
method XXX_OneofWrappers (line 676) | func (*GaugeValue) XXX_OneofWrappers() []interface{} {
method Marshal (line 1926) | func (m *GaugeValue) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1936) | func (m *GaugeValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1941) | func (m *GaugeValue) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2772) | func (m *GaugeValue) Size() (n int) {
method Unmarshal (line 3997) | func (m *GaugeValue) Unmarshal(dAtA []byte) error {
type isGaugeValue_Value (line 638) | type isGaugeValue_Value interface
type GaugeValue_DoubleValue (line 644) | type GaugeValue_DoubleValue struct
method isGaugeValue_Value (line 651) | func (*GaugeValue_DoubleValue) isGaugeValue_Value() {}
method MarshalTo (line 1962) | func (m *GaugeValue_DoubleValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1967) | func (m *GaugeValue_DoubleValue) MarshalToSizedBuffer(dAtA []byte) (in...
method Size (line 2787) | func (m *GaugeValue_DoubleValue) Size() (n int) {
type GaugeValue_IntValue (line 647) | type GaugeValue_IntValue struct
method isGaugeValue_Value (line 652) | func (*GaugeValue_IntValue) isGaugeValue_Value() {}
method MarshalTo (line 1975) | func (m *GaugeValue_IntValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1980) | func (m *GaugeValue_IntValue) MarshalToSizedBuffer(dAtA []byte) (int, ...
method Size (line 2796) | func (m *GaugeValue_IntValue) Size() (n int) {
type CounterValue (line 684) | type CounterValue struct
method Reset (line 701) | func (m *CounterValue) Reset() { *m = CounterValue{} }
method String (line 702) | func (m *CounterValue) String() string { return proto.CompactTextStrin...
method ProtoMessage (line 703) | func (*CounterValue) ProtoMessage() {}
method Descriptor (line 704) | func (*CounterValue) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 707) | func (m *CounterValue) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 710) | func (m *CounterValue) XXX_Marshal(b []byte, deterministic bool) ([]by...
method XXX_Merge (line 722) | func (m *CounterValue) XXX_Merge(src proto.Message) {
method XXX_Size (line 725) | func (m *CounterValue) XXX_Size() int {
method XXX_DiscardUnknown (line 728) | func (m *CounterValue) XXX_DiscardUnknown() {
method GetTotal (line 750) | func (m *CounterValue) GetTotal() isCounterValue_Total {
method GetDoubleValue (line 757) | func (m *CounterValue) GetDoubleValue() float64 {
method GetIntValue (line 764) | func (m *CounterValue) GetIntValue() uint64 {
method GetCreated (line 771) | func (m *CounterValue) GetCreated() *types.Timestamp {
method GetExemplar (line 778) | func (m *CounterValue) GetExemplar() *Exemplar {
method XXX_OneofWrappers (line 786) | func (*CounterValue) XXX_OneofWrappers() []interface{} {
method Marshal (line 1987) | func (m *CounterValue) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1997) | func (m *CounterValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2002) | func (m *CounterValue) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2805) | func (m *CounterValue) Size() (n int) {
method Unmarshal (line 4079) | func (m *CounterValue) Unmarshal(dAtA []byte) error {
type isCounterValue_Total (line 734) | type isCounterValue_Total interface
type CounterValue_DoubleValue (line 740) | type CounterValue_DoubleValue struct
method isCounterValue_Total (line 747) | func (*CounterValue_DoubleValue) isCounterValue_Total() {}
method MarshalTo (line 2047) | func (m *CounterValue_DoubleValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2052) | func (m *CounterValue_DoubleValue) MarshalToSizedBuffer(dAtA []byte) (...
method Size (line 2828) | func (m *CounterValue_DoubleValue) Size() (n int) {
type CounterValue_IntValue (line 743) | type CounterValue_IntValue struct
method isCounterValue_Total (line 748) | func (*CounterValue_IntValue) isCounterValue_Total() {}
method MarshalTo (line 2060) | func (m *CounterValue_IntValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2065) | func (m *CounterValue_IntValue) MarshalToSizedBuffer(dAtA []byte) (int...
method Size (line 2837) | func (m *CounterValue_IntValue) Size() (n int) {
type HistogramValue (line 794) | type HistogramValue struct
method Reset (line 813) | func (m *HistogramValue) Reset() { *m = HistogramValue{} }
method String (line 814) | func (m *HistogramValue) String() string { return proto.CompactTextStr...
method ProtoMessage (line 815) | func (*HistogramValue) ProtoMessage() {}
method Descriptor (line 816) | func (*HistogramValue) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 819) | func (m *HistogramValue) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 822) | func (m *HistogramValue) XXX_Marshal(b []byte, deterministic bool) ([]...
method XXX_Merge (line 834) | func (m *HistogramValue) XXX_Merge(src proto.Message) {
method XXX_Size (line 837) | func (m *HistogramValue) XXX_Size() int {
method XXX_DiscardUnknown (line 840) | func (m *HistogramValue) XXX_DiscardUnknown() {
method GetSum (line 862) | func (m *HistogramValue) GetSum() isHistogramValue_Sum {
method GetDoubleValue (line 869) | func (m *HistogramValue) GetDoubleValue() float64 {
method GetIntValue (line 876) | func (m *HistogramValue) GetIntValue() int64 {
method GetCount (line 883) | func (m *HistogramValue) GetCount() uint64 {
method GetCreated (line 890) | func (m *HistogramValue) GetCreated() *types.Timestamp {
method GetBuckets (line 897) | func (m *HistogramValue) GetBuckets() []*HistogramValue_Bucket {
method XXX_OneofWrappers (line 905) | func (*HistogramValue) XXX_OneofWrappers() []interface{} {
method Marshal (line 2072) | func (m *HistogramValue) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 2082) | func (m *HistogramValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2087) | func (m *HistogramValue) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2846) | func (m *HistogramValue) Size() (n int) {
method Unmarshal (line 4233) | func (m *HistogramValue) Unmarshal(dAtA []byte) error {
type isHistogramValue_Sum (line 846) | type isHistogramValue_Sum interface
type HistogramValue_DoubleValue (line 852) | type HistogramValue_DoubleValue struct
method isHistogramValue_Sum (line 859) | func (*HistogramValue_DoubleValue) isHistogramValue_Sum() {}
method MarshalTo (line 2139) | func (m *HistogramValue_DoubleValue) MarshalTo(dAtA []byte) (int, erro...
method MarshalToSizedBuffer (line 2144) | func (m *HistogramValue_DoubleValue) MarshalToSizedBuffer(dAtA []byte)...
method Size (line 2874) | func (m *HistogramValue_DoubleValue) Size() (n int) {
type HistogramValue_IntValue (line 855) | type HistogramValue_IntValue struct
method isHistogramValue_Sum (line 860) | func (*HistogramValue_IntValue) isHistogramValue_Sum() {}
method MarshalTo (line 2152) | func (m *HistogramValue_IntValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2157) | func (m *HistogramValue_IntValue) MarshalToSizedBuffer(dAtA []byte) (i...
method Size (line 2883) | func (m *HistogramValue_IntValue) Size() (n int) {
type HistogramValue_Bucket (line 914) | type HistogramValue_Bucket struct
method Reset (line 926) | func (m *HistogramValue_Bucket) Reset() { *m = HistogramValue_...
method String (line 927) | func (m *HistogramValue_Bucket) String() string { return proto.Compact...
method ProtoMessage (line 928) | func (*HistogramValue_Bucket) ProtoMessage() {}
method Descriptor (line 929) | func (*HistogramValue_Bucket) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 932) | func (m *HistogramValue_Bucket) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 935) | func (m *HistogramValue_Bucket) XXX_Marshal(b []byte, deterministic bo...
method XXX_Merge (line 947) | func (m *HistogramValue_Bucket) XXX_Merge(src proto.Message) {
method XXX_Size (line 950) | func (m *HistogramValue_Bucket) XXX_Size() int {
method XXX_DiscardUnknown (line 953) | func (m *HistogramValue_Bucket) XXX_DiscardUnknown() {
method GetCount (line 959) | func (m *HistogramValue_Bucket) GetCount() uint64 {
method GetUpperBound (line 966) | func (m *HistogramValue_Bucket) GetUpperBound() float64 {
method GetExemplar (line 973) | func (m *HistogramValue_Bucket) GetExemplar() *Exemplar {
method Marshal (line 2164) | func (m *HistogramValue_Bucket) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 2174) | func (m *HistogramValue_Bucket) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2179) | func (m *HistogramValue_Bucket) MarshalToSizedBuffer(dAtA []byte) (int...
method Size (line 2892) | func (m *HistogramValue_Bucket) Size() (n int) {
method Unmarshal (line 4404) | func (m *HistogramValue_Bucket) Unmarshal(dAtA []byte) error {
type Exemplar (line 980) | type Exemplar struct
method Reset (line 993) | func (m *Exemplar) Reset() { *m = Exemplar{} }
method String (line 994) | func (m *Exemplar) String() string { return proto.CompactTextString(m) }
method ProtoMessage (line 995) | func (*Exemplar) ProtoMessage() {}
method Descriptor (line 996) | func (*Exemplar) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 999) | func (m *Exemplar) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 1002) | func (m *Exemplar) XXX_Marshal(b []byte, deterministic bool) ([]byte, ...
method XXX_Merge (line 1014) | func (m *Exemplar) XXX_Merge(src proto.Message) {
method XXX_Size (line 1017) | func (m *Exemplar) XXX_Size() int {
method XXX_DiscardUnknown (line 1020) | func (m *Exemplar) XXX_DiscardUnknown() {
method GetValue (line 1026) | func (m *Exemplar) GetValue() float64 {
method GetTimestamp (line 1033) | func (m *Exemplar) GetTimestamp() *types.Timestamp {
method GetLabel (line 1040) | func (m *Exemplar) GetLabel() []*Label {
method Marshal (line 2214) | func (m *Exemplar) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 2224) | func (m *Exemplar) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2229) | func (m *Exemplar) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2914) | func (m *Exemplar) Size() (n int) {
method Unmarshal (line 4521) | func (m *Exemplar) Unmarshal(dAtA []byte) error {
type StateSetValue (line 1048) | type StateSetValue struct
method Reset (line 1056) | func (m *StateSetValue) Reset() { *m = StateSetValue{} }
method String (line 1057) | func (m *StateSetValue) String() string { return proto.CompactTextStri...
method ProtoMessage (line 1058) | func (*StateSetValue) ProtoMessage() {}
method Descriptor (line 1059) | func (*StateSetValue) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 1062) | func (m *StateSetValue) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 1065) | func (m *StateSetValue) XXX_Marshal(b []byte, deterministic bool) ([]b...
method XXX_Merge (line 1077) | func (m *StateSetValue) XXX_Merge(src proto.Message) {
method XXX_Size (line 1080) | func (m *StateSetValue) XXX_Size() int {
method XXX_DiscardUnknown (line 1083) | func (m *StateSetValue) XXX_DiscardUnknown() {
method GetStates (line 1089) | func (m *StateSetValue) GetStates() []*StateSetValue_State {
method Marshal (line 2273) | func (m *StateSetValue) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 2283) | func (m *StateSetValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2288) | func (m *StateSetValue) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2939) | func (m *StateSetValue) Size() (n int) {
method Unmarshal (line 4653) | func (m *StateSetValue) Unmarshal(dAtA []byte) error {
type StateSetValue_State (line 1096) | type StateSetValue_State struct
method Reset (line 1106) | func (m *StateSetValue_State) Reset() { *m = StateSetValue_Sta...
method String (line 1107) | func (m *StateSetValue_State) String() string { return proto.CompactTe...
method ProtoMessage (line 1108) | func (*StateSetValue_State) ProtoMessage() {}
method Descriptor (line 1109) | func (*StateSetValue_State) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 1112) | func (m *StateSetValue_State) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 1115) | func (m *StateSetValue_State) XXX_Marshal(b []byte, deterministic bool...
method XXX_Merge (line 1127) | func (m *StateSetValue_State) XXX_Merge(src proto.Message) {
method XXX_Size (line 1130) | func (m *StateSetValue_State) XXX_Size() int {
method XXX_DiscardUnknown (line 1133) | func (m *StateSetValue_State) XXX_DiscardUnknown() {
method GetEnabled (line 1139) | func (m *StateSetValue_State) GetEnabled() bool {
method GetName (line 1146) | func (m *StateSetValue_State) GetName() string {
method Marshal (line 2314) | func (m *StateSetValue_State) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 2324) | func (m *StateSetValue_State) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2329) | func (m *StateSetValue_State) MarshalToSizedBuffer(dAtA []byte) (int, ...
method Size (line 2957) | func (m *StateSetValue_State) Size() (n int) {
method Unmarshal (line 4738) | func (m *StateSetValue_State) Unmarshal(dAtA []byte) error {
type InfoValue (line 1154) | type InfoValue struct
method Reset (line 1162) | func (m *InfoValue) Reset() { *m = InfoValue{} }
method String (line 1163) | func (m *InfoValue) String() string { return proto.CompactTextString(m) }
method ProtoMessage (line 1164) | func (*InfoValue) ProtoMessage() {}
method Descriptor (line 1165) | func (*InfoValue) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 1168) | func (m *InfoValue) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 1171) | func (m *InfoValue) XXX_Marshal(b []byte, deterministic bool) ([]byte,...
method XXX_Merge (line 1183) | func (m *InfoValue) XXX_Merge(src proto.Message) {
method XXX_Size (line 1186) | func (m *InfoValue) XXX_Size() int {
method XXX_DiscardUnknown (line 1189) | func (m *InfoValue) XXX_DiscardUnknown() {
method GetInfo (line 1195) | func (m *InfoValue) GetInfo() []*Label {
method Marshal (line 2358) | func (m *InfoValue) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 2368) | func (m *InfoValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2373) | func (m *InfoValue) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2976) | func (m *InfoValue) Size() (n int) {
method Unmarshal (line 4841) | func (m *InfoValue) Unmarshal(dAtA []byte) error {
type SummaryValue (line 1203) | type SummaryValue struct
method Reset (line 1222) | func (m *SummaryValue) Reset() { *m = SummaryValue{} }
method String (line 1223) | func (m *SummaryValue) String() string { return proto.CompactTextStrin...
method ProtoMessage (line 1224) | func (*SummaryValue) ProtoMessage() {}
method Descriptor (line 1225) | func (*SummaryValue) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 1228) | func (m *SummaryValue) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 1231) | func (m *SummaryValue) XXX_Marshal(b []byte, deterministic bool) ([]by...
method XXX_Merge (line 1243) | func (m *SummaryValue) XXX_Merge(src proto.Message) {
method XXX_Size (line 1246) | func (m *SummaryValue) XXX_Size() int {
method XXX_DiscardUnknown (line 1249) | func (m *SummaryValue) XXX_DiscardUnknown() {
method GetSum (line 1271) | func (m *SummaryValue) GetSum() isSummaryValue_Sum {
method GetDoubleValue (line 1278) | func (m *SummaryValue) GetDoubleValue() float64 {
method GetIntValue (line 1285) | func (m *SummaryValue) GetIntValue() int64 {
method GetCount (line 1292) | func (m *SummaryValue) GetCount() uint64 {
method GetCreated (line 1299) | func (m *SummaryValue) GetCreated() *types.Timestamp {
method GetQuantile (line 1306) | func (m *SummaryValue) GetQuantile() []*SummaryValue_Quantile {
method XXX_OneofWrappers (line 1314) | func (*SummaryValue) XXX_OneofWrappers() []interface{} {
method Marshal (line 2399) | func (m *SummaryValue) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 2409) | func (m *SummaryValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2414) | func (m *SummaryValue) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2994) | func (m *SummaryValue) Size() (n int) {
method Unmarshal (line 4926) | func (m *SummaryValue) Unmarshal(dAtA []byte) error {
type isSummaryValue_Sum (line 1255) | type isSummaryValue_Sum interface
type SummaryValue_DoubleValue (line 1261) | type SummaryValue_DoubleValue struct
method isSummaryValue_Sum (line 1268) | func (*SummaryValue_DoubleValue) isSummaryValue_Sum() {}
method MarshalTo (line 2466) | func (m *SummaryValue_DoubleValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2471) | func (m *SummaryValue_DoubleValue) MarshalToSizedBuffer(dAtA []byte) (...
method Size (line 3022) | func (m *SummaryValue_DoubleValue) Size() (n int) {
type SummaryValue_IntValue (line 1264) | type SummaryValue_IntValue struct
method isSummaryValue_Sum (line 1269) | func (*SummaryValue_IntValue) isSummaryValue_Sum() {}
method MarshalTo (line 2479) | func (m *SummaryValue_IntValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2484) | func (m *SummaryValue_IntValue) MarshalToSizedBuffer(dAtA []byte) (int...
method Size (line 3031) | func (m *SummaryValue_IntValue) Size() (n int) {
type SummaryValue_Quantile (line 1321) | type SummaryValue_Quantile struct
method Reset (line 1331) | func (m *SummaryValue_Quantile) Reset() { *m = SummaryValue_Qu...
method String (line 1332) | func (m *SummaryValue_Quantile) String() string { return proto.Compact...
method ProtoMessage (line 1333) | func (*SummaryValue_Quantile) ProtoMessage() {}
method Descriptor (line 1334) | func (*SummaryValue_Quantile) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 1337) | func (m *SummaryValue_Quantile) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 1340) | func (m *SummaryValue_Quantile) XXX_Marshal(b []byte, deterministic bo...
method XXX_Merge (line 1352) | func (m *SummaryValue_Quantile) XXX_Merge(src proto.Message) {
method XXX_Size (line 1355) | func (m *SummaryValue_Quantile) XXX_Size() int {
method XXX_DiscardUnknown (line 1358) | func (m *SummaryValue_Quantile) XXX_DiscardUnknown() {
method GetQuantile (line 1364) | func (m *SummaryValue_Quantile) GetQuantile() float64 {
method GetValue (line 1371) | func (m *SummaryValue_Quantile) GetValue() float64 {
method Marshal (line 2491) | func (m *SummaryValue_Quantile) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 2501) | func (m *SummaryValue_Quantile) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2506) | func (m *SummaryValue_Quantile) MarshalToSizedBuffer(dAtA []byte) (int...
method Size (line 3040) | func (m *SummaryValue_Quantile) Size() (n int) {
method Unmarshal (line 5097) | func (m *SummaryValue_Quantile) Unmarshal(dAtA []byte) error {
function init (line 1378) | func init() {
function init (line 1398) | func init() { proto.RegisterFile("openmetrics.proto", fileDescriptor_0b8...
function encodeVarintOpenmetrics (line 2530) | func encodeVarintOpenmetrics(dAtA []byte, offset int, v uint64) int {
function sovOpenmetrics (line 3058) | func sovOpenmetrics(x uint64) (n int) {
function sozOpenmetrics (line 3061) | func sozOpenmetrics(x uint64) (n int) {
function skipOpenmetrics (line 5170) | func skipOpenmetrics(dAtA []byte) (n int, err error) {
FILE: internal/proto-gen/api_v2/metrics/otelspankind.pb.go
constant _ (line 22) | _ = proto.GoGoProtoPackageIsVersion3
type SpanKind (line 26) | type SpanKind
method String (line 69) | func (x SpanKind) String() string {
method EnumDescriptor (line 73) | func (SpanKind) EnumDescriptor() ([]byte, []int) {
constant SpanKind_SPAN_KIND_UNSPECIFIED (line 31) | SpanKind_SPAN_KIND_UNSPECIFIED SpanKind = 0
constant SpanKind_SPAN_KIND_INTERNAL (line 34) | SpanKind_SPAN_KIND_INTERNAL SpanKind = 1
constant SpanKind_SPAN_KIND_SERVER (line 37) | SpanKind_SPAN_KIND_SERVER SpanKind = 2
constant SpanKind_SPAN_KIND_CLIENT (line 39) | SpanKind_SPAN_KIND_CLIENT SpanKind = 3
constant SpanKind_SPAN_KIND_PRODUCER (line 44) | SpanKind_SPAN_KIND_PRODUCER SpanKind = 4
constant SpanKind_SPAN_KIND_CONSUMER (line 48) | SpanKind_SPAN_KIND_CONSUMER SpanKind = 5
function init (line 77) | func init() {
function init (line 81) | func init() { proto.RegisterFile("otelspankind.proto", fileDescriptor_77...
FILE: internal/proto-gen/storage/v2/dependency_storage.pb.go
constant _ (line 32) | _ = proto.GoGoProtoPackageIsVersion3
type GetDependenciesRequest (line 34) | type GetDependenciesRequest struct
method Reset (line 44) | func (m *GetDependenciesRequest) Reset() { *m = GetDependencie...
method String (line 45) | func (m *GetDependenciesRequest) String() string { return proto.Compac...
method ProtoMessage (line 46) | func (*GetDependenciesRequest) ProtoMessage() {}
method Descriptor (line 47) | func (*GetDependenciesRequest) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 50) | func (m *GetDependenciesRequest) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 53) | func (m *GetDependenciesRequest) XXX_Marshal(b []byte, deterministic b...
method XXX_Merge (line 65) | func (m *GetDependenciesRequest) XXX_Merge(src proto.Message) {
method XXX_Size (line 68) | func (m *GetDependenciesRequest) XXX_Size() int {
method XXX_DiscardUnknown (line 71) | func (m *GetDependenciesRequest) XXX_DiscardUnknown() {
method GetStartTime (line 77) | func (m *GetDependenciesRequest) GetStartTime() time.Time {
method GetEndTime (line 84) | func (m *GetDependenciesRequest) GetEndTime() time.Time {
method Marshal (line 330) | func (m *GetDependenciesRequest) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 340) | func (m *GetDependenciesRequest) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 345) | func (m *GetDependenciesRequest) MarshalToSizedBuffer(dAtA []byte) (in...
method Size (line 478) | func (m *GetDependenciesRequest) Size() (n int) {
method Unmarshal (line 545) | func (m *GetDependenciesRequest) Unmarshal(dAtA []byte) error {
type Dependency (line 92) | type Dependency struct
method Reset (line 106) | func (m *Dependency) Reset() { *m = Dependency{} }
method String (line 107) | func (m *Dependency) String() string { return proto.CompactTextString(...
method ProtoMessage (line 108) | func (*Dependency) ProtoMessage() {}
method Descriptor (line 109) | func (*Dependency) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 112) | func (m *Dependency) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 115) | func (m *Dependency) XXX_Marshal(b []byte, deterministic bool) ([]byte...
method XXX_Merge (line 127) | func (m *Dependency) XXX_Merge(src proto.Message) {
method XXX_Size (line 130) | func (m *Dependency) XXX_Size() int {
method XXX_DiscardUnknown (line 133) | func (m *Dependency) XXX_DiscardUnknown() {
method GetParent (line 139) | func (m *Dependency) GetParent() string {
method GetChild (line 146) | func (m *Dependency) GetChild() string {
method GetCallCount (line 153) | func (m *Dependency) GetCallCount() uint64 {
method GetSource (line 160) | func (m *Dependency) GetSource() string {
method Marshal (line 373) | func (m *Dependency) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 383) | func (m *Dependency) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 388) | func (m *Dependency) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 494) | func (m *Dependency) Size() (n int) {
method Unmarshal (line 662) | func (m *Dependency) Unmarshal(dAtA []byte) error {
type GetDependenciesResponse (line 167) | type GetDependenciesResponse struct
method Reset (line 174) | func (m *GetDependenciesResponse) Reset() { *m = GetDependenci...
method String (line 175) | func (m *GetDependenciesResponse) String() string { return proto.Compa...
method ProtoMessage (line 176) | func (*GetDependenciesResponse) ProtoMessage() {}
method Descriptor (line 177) | func (*GetDependenciesResponse) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 180) | func (m *GetDependenciesResponse) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 183) | func (m *GetDependenciesResponse) XXX_Marshal(b []byte, deterministic ...
method XXX_Merge (line 195) | func (m *GetDependenciesResponse) XXX_Merge(src proto.Message) {
method XXX_Size (line 198) | func (m *GetDependenciesResponse) XXX_Size() int {
method XXX_DiscardUnknown (line 201) | func (m *GetDependenciesResponse) XXX_DiscardUnknown() {
method GetDependencies (line 207) | func (m *GetDependenciesResponse) GetDependencies() []*Dependency {
method Marshal (line 426) | func (m *GetDependenciesResponse) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 436) | func (m *GetDependenciesResponse) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 441) | func (m *GetDependenciesResponse) MarshalToSizedBuffer(dAtA []byte) (i...
method Size (line 521) | func (m *GetDependenciesResponse) Size() (n int) {
method Unmarshal (line 828) | func (m *GetDependenciesResponse) Unmarshal(dAtA []byte) error {
function init (line 214) | func init() {
function init (line 220) | func init() { proto.RegisterFile("dependency_storage.proto", fileDescrip...
constant _ (line 254) | _ = grpc.SupportPackageIsVersion4
type DependencyReaderClient (line 259) | type DependencyReaderClient interface
type dependencyReaderClient (line 264) | type dependencyReaderClient struct
method GetDependencies (line 272) | func (c *dependencyReaderClient) GetDependencies(ctx context.Context, ...
function NewDependencyReaderClient (line 268) | func NewDependencyReaderClient(cc *grpc.ClientConn) DependencyReaderClie...
type DependencyReaderServer (line 282) | type DependencyReaderServer interface
type UnimplementedDependencyReaderServer (line 288) | type UnimplementedDependencyReaderServer struct
method GetDependencies (line 291) | func (*UnimplementedDependencyReaderServer) GetDependencies(ctx contex...
function RegisterDependencyReaderServer (line 295) | func RegisterDependencyReaderServer(s *grpc.Server, srv DependencyReader...
function _DependencyReader_GetDependencies_Handler (line 299) | func _DependencyReader_GetDependencies_Handler(srv interface{}, ctx cont...
function encodeVarintDependencyStorage (line 467) | func encodeVarintDependencyStorage(dAtA []byte, offset int, v uint64) int {
function sovDependencyStorage (line 539) | func sovDependencyStorage(x uint64) (n int) {
function sozDependencyStorage (line 542) | func sozDependencyStorage(x uint64) (n int) {
function skipDependencyStorage (line 913) | func skipDependencyStorage(dAtA []byte) (n int, err error) {
FILE: internal/proto-gen/storage/v2/trace_storage.pb.go
constant _ (line 34) | _ = proto.GoGoProtoPackageIsVersion3
type GetTraceParams (line 37) | type GetTraceParams struct
method Reset (line 53) | func (m *GetTraceParams) Reset() { *m = GetTraceParams{} }
method String (line 54) | func (m *GetTraceParams) String() string { return proto.CompactTextStr...
method ProtoMessage (line 55) | func (*GetTraceParams) ProtoMessage() {}
method Descriptor (line 56) | func (*GetTraceParams) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 59) | func (m *GetTraceParams) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 62) | func (m *GetTraceParams) XXX_Marshal(b []byte, deterministic bool) ([]...
method XXX_Merge (line 74) | func (m *GetTraceParams) XXX_Merge(src proto.Message) {
method XXX_Size (line 77) | func (m *GetTraceParams) XXX_Size() int {
method XXX_DiscardUnknown (line 80) | func (m *GetTraceParams) XXX_DiscardUnknown() {
method GetTraceId (line 86) | func (m *GetTraceParams) GetTraceId() []byte {
method GetStartTime (line 93) | func (m *GetTraceParams) GetStartTime() time.Time {
method GetEndTime (line 100) | func (m *GetTraceParams) GetEndTime() time.Time {
method Marshal (line 1407) | func (m *GetTraceParams) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1417) | func (m *GetTraceParams) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1422) | func (m *GetTraceParams) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2195) | func (m *GetTraceParams) Size() (n int) {
method Unmarshal (line 2562) | func (m *GetTraceParams) Unmarshal(dAtA []byte) error {
type GetTracesRequest (line 108) | type GetTracesRequest struct
method Reset (line 115) | func (m *GetTracesRequest) Reset() { *m = GetTracesRequest{} }
method String (line 116) | func (m *GetTracesRequest) String() string { return proto.CompactTextS...
method ProtoMessage (line 117) | func (*GetTracesRequest) ProtoMessage() {}
method Descriptor (line 118) | func (*GetTracesRequest) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 121) | func (m *GetTracesRequest) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 124) | func (m *GetTracesRequest) XXX_Marshal(b []byte, deterministic bool) (...
method XXX_Merge (line 136) | func (m *GetTracesRequest) XXX_Merge(src proto.Message) {
method XXX_Size (line 139) | func (m *GetTracesRequest) XXX_Size() int {
method XXX_DiscardUnknown (line 142) | func (m *GetTracesRequest) XXX_DiscardUnknown() {
method GetQuery (line 148) | func (m *GetTracesRequest) GetQuery() []*GetTraceParams {
method Marshal (line 1457) | func (m *GetTracesRequest) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1467) | func (m *GetTracesRequest) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1472) | func (m *GetTracesRequest) MarshalToSizedBuffer(dAtA []byte) (int, err...
method Size (line 2215) | func (m *GetTracesRequest) Size() (n int) {
method Unmarshal (line 2713) | func (m *GetTracesRequest) Unmarshal(dAtA []byte) error {
type GetServicesRequest (line 156) | type GetServicesRequest struct
method Reset (line 162) | func (m *GetServicesRequest) Reset() { *m = GetServicesRequest...
method String (line 163) | func (m *GetServicesRequest) String() string { return proto.CompactTex...
method ProtoMessage (line 164) | func (*GetServicesRequest) ProtoMessage() {}
method Descriptor (line 165) | func (*GetServicesRequest) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 168) | func (m *GetServicesRequest) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 171) | func (m *GetServicesRequest) XXX_Marshal(b []byte, deterministic bool)...
method XXX_Merge (line 183) | func (m *GetServicesRequest) XXX_Merge(src proto.Message) {
method XXX_Size (line 186) | func (m *GetServicesRequest) XXX_Size() int {
method XXX_DiscardUnknown (line 189) | func (m *GetServicesRequest) XXX_DiscardUnknown() {
method Marshal (line 1498) | func (m *GetServicesRequest) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1508) | func (m *GetServicesRequest) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1513) | func (m *GetServicesRequest) MarshalToSizedBuffer(dAtA []byte) (int, e...
method Size (line 2233) | func (m *GetServicesRequest) Size() (n int) {
method Unmarshal (line 2798) | func (m *GetServicesRequest) Unmarshal(dAtA []byte) error {
type GetServicesResponse (line 196) | type GetServicesResponse struct
method Reset (line 203) | func (m *GetServicesResponse) Reset() { *m = GetServicesRespon...
method String (line 204) | func (m *GetServicesResponse) String() string { return proto.CompactTe...
method ProtoMessage (line 205) | func (*GetServicesResponse) ProtoMessage() {}
method Descriptor (line 206) | func (*GetServicesResponse) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 209) | func (m *GetServicesResponse) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 212) | func (m *GetServicesResponse) XXX_Marshal(b []byte, deterministic bool...
method XXX_Merge (line 224) | func (m *GetServicesResponse) XXX_Merge(src proto.Message) {
method XXX_Size (line 227) | func (m *GetServicesResponse) XXX_Size() int {
method XXX_DiscardUnknown (line 230) | func (m *GetServicesResponse) XXX_DiscardUnknown() {
method GetServices (line 236) | func (m *GetServicesResponse) GetServices() []string {
method Marshal (line 1525) | func (m *GetServicesResponse) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1535) | func (m *GetServicesResponse) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1540) | func (m *GetServicesResponse) MarshalToSizedBuffer(dAtA []byte) (int, ...
method Size (line 2245) | func (m *GetServicesResponse) Size() (n int) {
method Unmarshal (line 2849) | func (m *GetServicesResponse) Unmarshal(dAtA []byte) error {
type GetOperationsRequest (line 244) | type GetOperationsRequest struct
method Reset (line 259) | func (m *GetOperationsRequest) Reset() { *m = GetOperationsReq...
method String (line 260) | func (m *GetOperationsRequest) String() string { return proto.CompactT...
method ProtoMessage (line 261) | func (*GetOperationsRequest) ProtoMessage() {}
method Descriptor (line 262) | func (*GetOperationsRequest) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 265) | func (m *GetOperationsRequest) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 268) | func (m *GetOperationsRequest) XXX_Marshal(b []byte, deterministic boo...
method XXX_Merge (line 280) | func (m *GetOperationsRequest) XXX_Merge(src proto.Message) {
method XXX_Size (line 283) | func (m *GetOperationsRequest) XXX_Size() int {
method XXX_DiscardUnknown (line 286) | func (m *GetOperationsRequest) XXX_DiscardUnknown() {
method GetService (line 292) | func (m *GetOperationsRequest) GetService() string {
method GetSpanKind (line 299) | func (m *GetOperationsRequest) GetSpanKind() string {
method Marshal (line 1561) | func (m *GetOperationsRequest) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1571) | func (m *GetOperationsRequest) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1576) | func (m *GetOperationsRequest) MarshalToSizedBuffer(dAtA []byte) (int,...
method Size (line 2263) | func (m *GetOperationsRequest) Size() (n int) {
method Unmarshal (line 2932) | func (m *GetOperationsRequest) Unmarshal(dAtA []byte) error {
type Operation (line 307) | type Operation struct
method Reset (line 315) | func (m *Operation) Reset() { *m = Operation{} }
method String (line 316) | func (m *Operation) String() string { return proto.CompactTextString(m) }
method ProtoMessage (line 317) | func (*Operation) ProtoMessage() {}
method Descriptor (line 318) | func (*Operation) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 321) | func (m *Operation) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 324) | func (m *Operation) XXX_Marshal(b []byte, deterministic bool) ([]byte,...
method XXX_Merge (line 336) | func (m *Operation) XXX_Merge(src proto.Message) {
method XXX_Size (line 339) | func (m *Operation) XXX_Size() int {
method XXX_DiscardUnknown (line 342) | func (m *Operation) XXX_DiscardUnknown() {
method GetName (line 348) | func (m *Operation) GetName() string {
method GetSpanKind (line 355) | func (m *Operation) GetSpanKind() string {
method Marshal (line 1602) | func (m *Operation) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1612) | func (m *Operation) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1617) | func (m *Operation) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2283) | func (m *Operation) Size() (n int) {
method Unmarshal (line 3047) | func (m *Operation) Unmarshal(dAtA []byte) error {
type GetOperationsResponse (line 363) | type GetOperationsResponse struct
method Reset (line 370) | func (m *GetOperationsResponse) Reset() { *m = GetOperationsRe...
method String (line 371) | func (m *GetOperationsResponse) String() string { return proto.Compact...
method ProtoMessage (line 372) | func (*GetOperationsResponse) ProtoMessage() {}
method Descriptor (line 373) | func (*GetOperationsResponse) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 376) | func (m *GetOperationsResponse) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 379) | func (m *GetOperationsResponse) XXX_Marshal(b []byte, deterministic bo...
method XXX_Merge (line 391) | func (m *GetOperationsResponse) XXX_Merge(src proto.Message) {
method XXX_Size (line 394) | func (m *GetOperationsResponse) XXX_Size() int {
method XXX_DiscardUnknown (line 397) | func (m *GetOperationsResponse) XXX_DiscardUnknown() {
method GetOperations (line 403) | func (m *GetOperationsResponse) GetOperations() []*Operation {
method Marshal (line 1643) | func (m *GetOperationsResponse) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1653) | func (m *GetOperationsResponse) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1658) | func (m *GetOperationsResponse) MarshalToSizedBuffer(dAtA []byte) (int...
method Size (line 2303) | func (m *GetOperationsResponse) Size() (n int) {
method Unmarshal (line 3162) | func (m *GetOperationsResponse) Unmarshal(dAtA []byte) error {
type KeyValue (line 413) | type KeyValue struct
method Reset (line 421) | func (m *KeyValue) Reset() { *m = KeyValue{} }
method String (line 422) | func (m *KeyValue) String() string { return proto.CompactTextString(m) }
method ProtoMessage (line 423) | func (*KeyValue) ProtoMessage() {}
method Descriptor (line 424) | func (*KeyValue) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 427) | func (m *KeyValue) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 430) | func (m *KeyValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, ...
method XXX_Merge (line 442) | func (m *KeyValue) XXX_Merge(src proto.Message) {
method XXX_Size (line 445) | func (m *KeyValue) XXX_Size() int {
method XXX_DiscardUnknown (line 448) | func (m *KeyValue) XXX_DiscardUnknown() {
method GetKey (line 454) | func (m *KeyValue) GetKey() string {
method GetValue (line 461) | func (m *KeyValue) GetValue() *AnyValue {
method Marshal (line 1684) | func (m *KeyValue) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1694) | func (m *KeyValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1699) | func (m *KeyValue) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2321) | func (m *KeyValue) Size() (n int) {
method Unmarshal (line 3247) | func (m *KeyValue) Unmarshal(dAtA []byte) error {
type AnyValue (line 468) | type AnyValue struct
method Reset (line 483) | func (m *AnyValue) Reset() { *m = AnyValue{} }
method String (line 484) | func (m *AnyValue) String() string { return proto.CompactTextString(m) }
method ProtoMessage (line 485) | func (*AnyValue) ProtoMessage() {}
method Descriptor (line 486) | func (*AnyValue) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 489) | func (m *AnyValue) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 492) | func (m *AnyValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, ...
method XXX_Merge (line 504) | func (m *AnyValue) XXX_Merge(src proto.Message) {
method XXX_Size (line 507) | func (m *AnyValue) XXX_Size() int {
method XXX_DiscardUnknown (line 510) | func (m *AnyValue) XXX_DiscardUnknown() {
method GetValue (line 552) | func (m *AnyValue) GetValue() isAnyValue_Value {
method GetStringValue (line 559) | func (m *AnyValue) GetStringValue() string {
method GetBoolValue (line 566) | func (m *AnyValue) GetBoolValue() bool {
method GetIntValue (line 573) | func (m *AnyValue) GetIntValue() int64 {
method GetDoubleValue (line 580) | func (m *AnyValue) GetDoubleValue() float64 {
method GetArrayValue (line 587) | func (m *AnyValue) GetArrayValue() *ArrayValue {
method GetKvlistValue (line 594) | func (m *AnyValue) GetKvlistValue() *KeyValueList {
method GetBytesValue (line 601) | func (m *AnyValue) GetBytesValue() []byte {
method XXX_OneofWrappers (line 609) | func (*AnyValue) XXX_OneofWrappers() []interface{} {
method Marshal (line 1730) | func (m *AnyValue) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1740) | func (m *AnyValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1745) | func (m *AnyValue) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2341) | func (m *AnyValue) Size() (n int) {
method Unmarshal (line 3366) | func (m *AnyValue) Unmarshal(dAtA []byte) error {
type isAnyValue_Value (line 516) | type isAnyValue_Value interface
type AnyValue_StringValue (line 522) | type AnyValue_StringValue struct
method isAnyValue_Value (line 544) | func (*AnyValue_StringValue) isAnyValue_Value() {}
method MarshalTo (line 1766) | func (m *AnyValue_StringValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1771) | func (m *AnyValue_StringValue) MarshalToSizedBuffer(dAtA []byte) (int,...
method Size (line 2356) | func (m *AnyValue_StringValue) Size() (n int) {
type AnyValue_BoolValue (line 525) | type AnyValue_BoolValue struct
method isAnyValue_Value (line 545) | func (*AnyValue_BoolValue) isAnyValue_Value() {}
method MarshalTo (line 1780) | func (m *AnyValue_BoolValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1785) | func (m *AnyValue_BoolValue) MarshalToSizedBuffer(dAtA []byte) (int, e...
method Size (line 2366) | func (m *AnyValue_BoolValue) Size() (n int) {
type AnyValue_IntValue (line 528) | type AnyValue_IntValue struct
method isAnyValue_Value (line 546) | func (*AnyValue_IntValue) isAnyValue_Value() {}
method MarshalTo (line 1797) | func (m *AnyValue_IntValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1802) | func (m *AnyValue_IntValue) MarshalToSizedBuffer(dAtA []byte) (int, er...
method Size (line 2375) | func (m *AnyValue_IntValue) Size() (n int) {
type AnyValue_DoubleValue (line 531) | type AnyValue_DoubleValue struct
method isAnyValue_Value (line 547) | func (*AnyValue_DoubleValue) isAnyValue_Value() {}
method MarshalTo (line 1809) | func (m *AnyValue_DoubleValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1814) | func (m *AnyValue_DoubleValue) MarshalToSizedBuffer(dAtA []byte) (int,...
method Size (line 2384) | func (m *AnyValue_DoubleValue) Size() (n int) {
type AnyValue_ArrayValue (line 534) | type AnyValue_ArrayValue struct
method isAnyValue_Value (line 548) | func (*AnyValue_ArrayValue) isAnyValue_Value() {}
method MarshalTo (line 1822) | func (m *AnyValue_ArrayValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1827) | func (m *AnyValue_ArrayValue) MarshalToSizedBuffer(dAtA []byte) (int, ...
method Size (line 2393) | func (m *AnyValue_ArrayValue) Size() (n int) {
type AnyValue_KvlistValue (line 537) | type AnyValue_KvlistValue struct
method isAnyValue_Value (line 549) | func (*AnyValue_KvlistValue) isAnyValue_Value() {}
method MarshalTo (line 1843) | func (m *AnyValue_KvlistValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1848) | func (m *AnyValue_KvlistValue) MarshalToSizedBuffer(dAtA []byte) (int,...
method Size (line 2405) | func (m *AnyValue_KvlistValue) Size() (n int) {
type AnyValue_BytesValue (line 540) | type AnyValue_BytesValue struct
method isAnyValue_Value (line 550) | func (*AnyValue_BytesValue) isAnyValue_Value() {}
method MarshalTo (line 1864) | func (m *AnyValue_BytesValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1869) | func (m *AnyValue_BytesValue) MarshalToSizedBuffer(dAtA []byte) (int, ...
method Size (line 2417) | func (m *AnyValue_BytesValue) Size() (n int) {
type KeyValueList (line 621) | type KeyValueList struct
method Reset (line 628) | func (m *KeyValueList) Reset() { *m = KeyValueList{} }
method String (line 629) | func (m *KeyValueList) String() string { return proto.CompactTextStrin...
method ProtoMessage (line 630) | func (*KeyValueList) ProtoMessage() {}
method Descriptor (line 631) | func (*KeyValueList) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 634) | func (m *KeyValueList) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 637) | func (m *KeyValueList) XXX_Marshal(b []byte, deterministic bool) ([]by...
method XXX_Merge (line 649) | func (m *KeyValueList) XXX_Merge(src proto.Message) {
method XXX_Size (line 652) | func (m *KeyValueList) XXX_Size() int {
method XXX_DiscardUnknown (line 655) | func (m *KeyValueList) XXX_DiscardUnknown() {
method GetValues (line 661) | func (m *KeyValueList) GetValues() []*KeyValue {
method Marshal (line 1880) | func (m *KeyValueList) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1890) | func (m *KeyValueList) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1895) | func (m *KeyValueList) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2429) | func (m *KeyValueList) Size() (n int) {
method Unmarshal (line 3604) | func (m *KeyValueList) Unmarshal(dAtA []byte) error {
type ArrayValue (line 668) | type ArrayValue struct
method Reset (line 675) | func (m *ArrayValue) Reset() { *m = ArrayValue{} }
method String (line 676) | func (m *ArrayValue) String() string { return proto.CompactTextString(...
method ProtoMessage (line 677) | func (*ArrayValue) ProtoMessage() {}
method Descriptor (line 678) | func (*ArrayValue) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 681) | func (m *ArrayValue) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 684) | func (m *ArrayValue) XXX_Marshal(b []byte, deterministic bool) ([]byte...
method XXX_Merge (line 696) | func (m *ArrayValue) XXX_Merge(src proto.Message) {
method XXX_Size (line 699) | func (m *ArrayValue) XXX_Size() int {
method XXX_DiscardUnknown (line 702) | func (m *ArrayValue) XXX_DiscardUnknown() {
method GetValues (line 708) | func (m *ArrayValue) GetValues() []*AnyValue {
method Marshal (line 1921) | func (m *ArrayValue) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1931) | func (m *ArrayValue) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1936) | func (m *ArrayValue) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2447) | func (m *ArrayValue) Size() (n int) {
method Unmarshal (line 3689) | func (m *ArrayValue) Unmarshal(dAtA []byte) error {
type TraceQueryParameters (line 718) | type TraceQueryParameters struct
method Reset (line 732) | func (m *TraceQueryParameters) Reset() { *m = TraceQueryParame...
method String (line 733) | func (m *TraceQueryParameters) String() string { return proto.CompactT...
method ProtoMessage (line 734) | func (*TraceQueryParameters) ProtoMessage() {}
method Descriptor (line 735) | func (*TraceQueryParameters) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 738) | func (m *TraceQueryParameters) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 741) | func (m *TraceQueryParameters) XXX_Marshal(b []byte, deterministic boo...
method XXX_Merge (line 753) | func (m *TraceQueryParameters) XXX_Merge(src proto.Message) {
method XXX_Size (line 756) | func (m *TraceQueryParameters) XXX_Size() int {
method XXX_DiscardUnknown (line 759) | func (m *TraceQueryParameters) XXX_DiscardUnknown() {
method GetServiceName (line 765) | func (m *TraceQueryParameters) GetServiceName() string {
method GetOperationName (line 772) | func (m *TraceQueryParameters) GetOperationName() string {
method GetAttributes (line 779) | func (m *TraceQueryParameters) GetAttributes() []*KeyValue {
method GetStartTimeMin (line 786) | func (m *TraceQueryParameters) GetStartTimeMin() time.Time {
method GetStartTimeMax (line 793) | func (m *TraceQueryParameters) GetStartTimeMax() time.Time {
method GetDurationMin (line 800) | func (m *TraceQueryParameters) GetDurationMin() time.Duration {
method GetDurationMax (line 807) | func (m *TraceQueryParameters) GetDurationMax() time.Duration {
method GetSearchDepth (line 814) | func (m *TraceQueryParameters) GetSearchDepth() int32 {
method Marshal (line 1962) | func (m *TraceQueryParameters) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 1972) | func (m *TraceQueryParameters) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 1977) | func (m *TraceQueryParameters) MarshalToSizedBuffer(dAtA []byte) (int,...
method Size (line 2465) | func (m *TraceQueryParameters) Size() (n int) {
method Unmarshal (line 3774) | func (m *TraceQueryParameters) Unmarshal(dAtA []byte) error {
type FindTracesRequest (line 824) | type FindTracesRequest struct
method Reset (line 831) | func (m *FindTracesRequest) Reset() { *m = FindTracesRequest{} }
method String (line 832) | func (m *FindTracesRequest) String() string { return proto.CompactText...
method ProtoMessage (line 833) | func (*FindTracesRequest) ProtoMessage() {}
method Descriptor (line 834) | func (*FindTracesRequest) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 837) | func (m *FindTracesRequest) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 840) | func (m *FindTracesRequest) XXX_Marshal(b []byte, deterministic bool) ...
method XXX_Merge (line 852) | func (m *FindTracesRequest) XXX_Merge(src proto.Message) {
method XXX_Size (line 855) | func (m *FindTracesRequest) XXX_Size() int {
method XXX_DiscardUnknown (line 858) | func (m *FindTracesRequest) XXX_DiscardUnknown() {
method GetQuery (line 864) | func (m *FindTracesRequest) GetQuery() *TraceQueryParameters {
method Marshal (line 2054) | func (m *FindTracesRequest) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 2064) | func (m *FindTracesRequest) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2069) | func (m *FindTracesRequest) MarshalToSizedBuffer(dAtA []byte) (int, er...
method Size (line 2502) | func (m *FindTracesRequest) Size() (n int) {
method Unmarshal (line 4074) | func (m *FindTracesRequest) Unmarshal(dAtA []byte) error {
type FoundTraceID (line 878) | type FoundTraceID struct
method Reset (line 887) | func (m *FoundTraceID) Reset() { *m = FoundTraceID{} }
method String (line 888) | func (m *FoundTraceID) String() string { return proto.CompactTextStrin...
method ProtoMessage (line 889) | func (*FoundTraceID) ProtoMessage() {}
method Descriptor (line 890) | func (*FoundTraceID) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 893) | func (m *FoundTraceID) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 896) | func (m *FoundTraceID) XXX_Marshal(b []byte, deterministic bool) ([]by...
method XXX_Merge (line 908) | func (m *FoundTraceID) XXX_Merge(src proto.Message) {
method XXX_Size (line 911) | func (m *FoundTraceID) XXX_Size() int {
method XXX_DiscardUnknown (line 914) | func (m *FoundTraceID) XXX_DiscardUnknown() {
method GetTraceId (line 920) | func (m *FoundTraceID) GetTraceId() []byte {
method GetStart (line 927) | func (m *FoundTraceID) GetStart() time.Time {
method GetEnd (line 934) | func (m *FoundTraceID) GetEnd() time.Time {
method Marshal (line 2093) | func (m *FoundTraceID) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 2103) | func (m *FoundTraceID) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2108) | func (m *FoundTraceID) MarshalToSizedBuffer(dAtA []byte) (int, error) {
method Size (line 2518) | func (m *FoundTraceID) Size() (n int) {
method Unmarshal (line 4161) | func (m *FoundTraceID) Unmarshal(dAtA []byte) error {
type FindTraceIDsResponse (line 942) | type FindTraceIDsResponse struct
method Reset (line 949) | func (m *FindTraceIDsResponse) Reset() { *m = FindTraceIDsResp...
method String (line 950) | func (m *FindTraceIDsResponse) String() string { return proto.CompactT...
method ProtoMessage (line 951) | func (*FindTraceIDsResponse) ProtoMessage() {}
method Descriptor (line 952) | func (*FindTraceIDsResponse) Descriptor() ([]byte, []int) {
method XXX_Unmarshal (line 955) | func (m *FindTraceIDsResponse) XXX_Unmarshal(b []byte) error {
method XXX_Marshal (line 958) | func (m *FindTraceIDsResponse) XXX_Marshal(b []byte, deterministic boo...
method XXX_Merge (line 970) | func (m *FindTraceIDsResponse) XXX_Merge(src proto.Message) {
method XXX_Size (line 973) | func (m *FindTraceIDsResponse) XXX_Size() int {
method XXX_DiscardUnknown (line 976) | func (m *FindTraceIDsResponse) XXX_DiscardUnknown() {
method GetTraceIds (line 982) | func (m *FindTraceIDsResponse) GetTraceIds() []*FoundTraceID {
method Marshal (line 2143) | func (m *FindTraceIDsResponse) Marshal() (dAtA []byte, err error) {
method MarshalTo (line 2153) | func (m *FindTraceIDsResponse) MarshalTo(dAtA []byte) (int, error) {
method MarshalToSizedBuffer (line 2158) | func (m *FindTraceIDsResponse) MarshalToSizedBuffer(dAtA []byte) (int,...
method Size (line 2538) | func (m *FindTraceIDsResponse) Size() (n int) {
method Unmarshal (line 4312) | func (m *FindTraceIDsResponse) Unmarshal(dAtA []byte) error {
function init (line 989) | func init() {
function init (line 1007) | func init() { proto.RegisterFile("trace_storage.proto", fileDescriptor_3...
constant _ (line 1080) | _ = grpc.SupportPackageIsVersion4
type TraceReaderClient (line 1085) | type TraceReaderClient interface
type traceReaderClient (line 1120) | type traceReaderClient struct
method GetTraces (line 1128) | func (c *traceReaderClient) GetTraces(ctx context.Context, in *GetTrac...
method GetServices (line 1160) | func (c *traceReaderClient) GetServices(ctx context.Context, in *GetSe...
method GetOperations (line 1169) | func (c *traceReaderClient) GetOperations(ctx context.Context, in *Get...
method FindTraces (line 1178) | func (c *traceReaderClient) FindTraces(ctx context.Context, in *FindTr...
method FindTraceIDs (line 1210) | func (c *traceReaderClient) FindTraceIDs(ctx context.Context, in *Find...
function NewTraceReaderClient (line 1124) | func NewTraceReaderClient(cc *grpc.ClientConn) TraceReaderClient {
type TraceReader_GetTracesClient (line 1143) | type TraceReader_GetTracesClient interface
type traceReaderGetTracesClient (line 1148) | type traceReaderGetTracesClient struct
method Recv (line 1152) | func (x *traceReaderGetTracesClient) Recv() (*v1.TracesData, error) {
type TraceReader_FindTracesClient (line 1193) | type TraceReader_FindTracesClient interface
type traceReaderFindTracesClient (line 1198) | type traceReaderFindTracesClient struct
method Recv (line 1202) | func (x *traceReaderFindTracesClient) Recv() (*v1.TracesData, error) {
type TraceReaderServer (line 1220) | type TraceReaderServer interface
type UnimplementedTraceReaderServer (line 1256) | type UnimplementedTraceReaderServer struct
method GetTraces (line 1259) | func (*UnimplementedTraceReaderServer) GetTraces(req *GetTracesRequest...
method GetServices (line 1262) | func (*UnimplementedTraceReaderServer) GetServices(ctx context.Context...
method GetOperations (line 1265) | func (*UnimplementedTraceReaderServer) GetOperations(ctx context.Conte...
method FindTraces (line 1268) | func (*UnimplementedTraceReaderServer) FindTraces(req *FindTracesReque...
method FindTraceIDs (line 1271) | func (*UnimplementedTraceReaderServer) FindTraceIDs(ctx context.Contex...
function RegisterTraceReaderServer (line 1275) | func RegisterTraceReaderServer(s *grpc.Server, srv TraceReaderServer) {
function _TraceReader_GetTraces_Handler (line 1279) | func _TraceReader_GetTraces_Handler(srv interface{}, stream grpc.ServerS...
type TraceReader_GetTracesServer (line 1287) | type TraceReader_GetTracesServer interface
type traceReaderGetTracesServer (line 1292) | type traceReaderGetTracesServer struct
method Send (line 1296) | func (x *traceReaderGetTracesServer) Send(m *v1.TracesData) error {
function _TraceReader_GetServices_Handler (line 1300) | func _TraceReader_GetServices_Handler(srv interface{}, ctx context.Conte...
function _TraceReader_GetOperations_Handler (line 1318) | func _TraceReader_GetOperations_Handler(srv interface{}, ctx context.Con...
function _TraceReader_FindTraces_Handler (line 1336) | func _TraceReader_FindTraces_Handler(srv interface{}, stream grpc.Server...
type TraceReader_FindTracesServer (line 1344) | type TraceReader_FindTracesServer interface
type traceReaderFindTracesServer (line 1349) | type traceReaderFindTracesServer struct
method Send (line 1353) | func (x *traceReaderFindTracesServer) Send(m *v1.TracesData) error {
function _TraceReader_FindTraceIDs_Handler (line 1357) | func _TraceReader_FindTraceIDs_Handler(srv interface{}, ctx context.Cont...
function encodeVarintTraceStorage (line 2184) | func encodeVarintTraceStorage(dAtA []byte, offset int, v uint64) int {
function sovTraceStorage (line 2556) | func sovTraceStorage(x uint64) (n int) {
function sozTraceStorage (line 2559) | func sozTraceStorage(x uint64) (n int) {
function skipTraceStorage (line 4397) | func skipTraceStorage(dAtA []byte) (n int, err error) {
FILE: internal/proto-gen/storage_v1/mocks/mocks.go
function NewSpanWriterPluginClient (line 23) | func NewSpanWriterPluginClient(t interface {
type SpanWriterPluginClient (line 36) | type SpanWriterPluginClient struct
method EXPECT (line 44) | func (_m *SpanWriterPluginClient) EXPECT() *SpanWriterPluginClient_Exp...
method Close (line 49) | func (_mock *SpanWriterPluginClient) Close(ctx context.Context, in *st...
method WriteSpan (line 132) | func (_mock *SpanWriterPluginClient) WriteSpan(ctx context.Context, in...
type SpanWriterPluginClient_Expecter (line 40) | type SpanWriterPluginClient_Expecter struct
method Close (line 91) | func (_e *SpanWriterPluginClient_Expecter) Close(ctx interface{}, in i...
method WriteSpan (line 174) | func (_e *SpanWriterPluginClient_Expecter) WriteSpan(ctx interface{}, ...
type SpanWriterPluginClient_Close_Call (line 83) | type SpanWriterPluginClient_Close_Call struct
method Run (line 96) | func (_c *SpanWriterPluginClient_Close_Call) Run(run func(ctx context....
method Return (line 121) | func (_c *SpanWriterPluginClient_Close_Call) Return(closeWriterRespons...
method RunAndReturn (line 126) | func (_c *SpanWriterPluginClient_Close_Call) RunAndReturn(run func(ctx...
type SpanWriterPluginClient_WriteSpan_Call (line 166) | type SpanWriterPluginClient_WriteSpan_Call struct
method Run (line 179) | func (_c *SpanWriterPluginClient_WriteSpan_Call) Run(run func(ctx cont...
method Return (line 204) | func (_c *SpanWriterPluginClient_WriteSpan_Call) Return(writeSpanRespo...
method RunAndReturn (line 209) | func (_c *SpanWriterPluginClient_WriteSpan_Call) RunAndReturn(run func...
function NewSpanWriterPluginServer (line 216) | func NewSpanWriterPluginServer(t interface {
type SpanWriterPluginServer (line 229) | type SpanWriterPluginServer struct
method EXPECT (line 237) | func (_m *SpanWriterPluginServer) EXPECT() *SpanWriterPluginServer_Exp...
method Close (line 242) | func (_mock *SpanWriterPluginServer) Close(context1 context.Context, c...
method WriteSpan (line 310) | func (_mock *SpanWriterPluginServer) WriteSpan(context1 context.Contex...
type SpanWriterPluginServer_Expecter (line 233) | type SpanWriterPluginServer_Expecter struct
method Close (line 277) | func (_e *SpanWriterPluginServer_Expecter) Close(context1 interface{},...
method WriteSpan (line 345) | func (_e *SpanWriterPluginServer_Expecter) WriteSpan(context1 interfac...
type SpanWriterPluginServer_Close_Call (line 270) | type SpanWriterPluginServer_Close_Call struct
method Run (line 281) | func (_c *SpanWriterPluginServer_Close_Call) Run(run func(context1 con...
method Return (line 299) | func (_c *SpanWriterPluginServer_Close_Call) Return(closeWriterRespons...
method RunAndReturn (line 304) | func (_c *SpanWriterPluginServer_Close_Call) RunAndReturn(run func(con...
type SpanWriterPluginServer_WriteSpan_Call (line 338) | type SpanWriterPluginServer_WriteSpan_Call struct
method Run (line 349) | func (_c *SpanWriterPluginServer_WriteSpan_Call) Run(run func(context1...
method Return (line 367) | func (_c *SpanWriterPluginServer_WriteSpan_Call) Return(writeSpanRespo...
method RunAndReturn (line 372) | func (_c *SpanWriterPluginServer_WriteSpan_Call) RunAndReturn(run func...
function NewStreamingSpanWriterPluginClient (line 379) | func NewStreamingSpanWriterPluginClient(t interface {
type StreamingSpanWriterPluginClient (line 392) | type StreamingSpanWriterPluginClient struct
method EXPECT (line 400) | func (_m *StreamingSpanWriterPluginClient) EXPECT() *StreamingSpanWrit...
method WriteSpanStream (line 405) | func (_mock *StreamingSpanWriterPluginClient) WriteSpanStream(ctx cont...
type StreamingSpanWriterPluginClient_Expecter (line 396) | type StreamingSpanWriterPluginClient_Expecter struct
method WriteSpanStream (line 446) | func (_e *StreamingSpanWriterPluginClient_Expecter) WriteSpanStream(ct...
type StreamingSpanWriterPluginClient_WriteSpanStream_Call (line 439) | type StreamingSpanWriterPluginClient_WriteSpanStream_Call struct
method Run (line 451) | func (_c *StreamingSpanWriterPluginClient_WriteSpanStream_Call) Run(ru...
method Return (line 471) | func (_c *StreamingSpanWriterPluginClient_WriteSpanStream_Call) Return...
method RunAndReturn (line 476) | func (_c *StreamingSpanWriterPluginClient_WriteSpanStream_Call) RunAnd...
function NewStreamingSpanWriterPlugin_WriteSpanStreamClient (line 483) | func NewStreamingSpanWriterPlugin_WriteSpanStreamClient(t interface {
type StreamingSpanWriterPlugin_WriteSpanStreamClient (line 496) | type StreamingSpanWriterPlugin_WriteSpanStreamClient struct
method EXPECT (line 504) | func (_m *StreamingSpanWriterPlugin_WriteSpanStreamClient) EXPECT() *S...
method CloseAndRecv (line 509) | func (_mock *StreamingSpanWriterPlugin_WriteSpanStreamClient) CloseAnd...
method CloseSend (line 564) | func (_mock *StreamingSpan
Condensed preview — 1166 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,569K chars).
[
{
"path": ".codecov.yml",
"chars": 567,
"preview": "codecov:\n notify:\n require_ci_to_pass: yes\n after_n_builds: 18\n strict_yaml_branch: main # only use the latest "
},
{
"path": ".fossa.yml",
"chars": 1072,
"preview": "# FOSSA Configuration File\n# https://github.com/fossas/fossa-cli/blob/master/docs/references/files/fossa-yml.md\n#\n# This"
},
{
"path": ".github/CODEOWNERS",
"chars": 37,
"preview": "\n* @jaegertracing/jaeger-maintainers\n"
},
{
"path": ".github/actions/block-pr-from-main-branch/action.yml",
"chars": 905,
"preview": "name: 'block-pr-not-on-main'\ndescription: 'Blocks PRs from main branch of forked repository'\nruns:\n using: \"composite\"\n"
},
{
"path": ".github/actions/setup-branch/action.yml",
"chars": 679,
"preview": "name: 'Setup BRANCH'\ndescription: 'Make BRANCH var accessible to job'\nruns:\n using: \"composite\"\n steps:\n - name: Se"
},
{
"path": ".github/actions/setup-go-tip/action.yml",
"chars": 2715,
"preview": "# Inspired by https://github.com/actions/setup-go/issues/21#issuecomment-997208686\nname: 'Install Go Tip'\ndescription: '"
},
{
"path": ".github/actions/setup-node.js/action.yml",
"chars": 566,
"preview": "name: 'Setup Node.js'\ndescription: 'Setup Node.js version as required by jaeger-ui repo. Must be called after checkout w"
},
{
"path": ".github/actions/upload-codecov/action.yml",
"chars": 2251,
"preview": "# Copyright (c) 2023 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# Codecov upload often fails on rate lim"
},
{
"path": ".github/actions/verify-metrics-snapshot/action.yaml",
"chars": 3548,
"preview": "# Copyright (c) 2023 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\nname: 'Verify Metric Snapshot and Upload"
},
{
"path": ".github/scripts/.gitignore",
"chars": 14,
"preview": "node_modules/\n"
},
{
"path": ".github/scripts/README.md",
"chars": 5246,
"preview": "# PR Quota Manager - Manual Execution Guide\n\nThis document explains how to run the PR Quota Manager script manually from"
},
{
"path": ".github/scripts/ci-summary-report-publish.js",
"chars": 14644,
"preview": "// Copyright (c) 2026 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\n// SECURITY WARNING — INJECTION RISK\n/"
},
{
"path": ".github/scripts/ci-summary-report-publish.test.js",
"chars": 20247,
"preview": "// Copyright (c) 2026 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nconst {\n safeNum,\n sa"
},
{
"path": ".github/scripts/list-open-prs-by-author.js",
"chars": 5033,
"preview": "#!/usr/bin/env node\n\n/**\n * List Open PRs Grouped by Author\n * \n * This utility script lists all open PRs in a repositor"
},
{
"path": ".github/scripts/package.json",
"chars": 799,
"preview": "{\n \"name\": \"jaeger-ci-scripts\",\n \"version\": \"1.0.0\",\n \"description\": \"Jaeger CI scripts for managing pull request quo"
},
{
"path": ".github/scripts/pr-quota-manager.js",
"chars": 13719,
"preview": "#!/usr/bin/env node\n\n/**\n * PR Quota Management System\n * \n * This script implements a \"Waiting Room\" system that limits"
},
{
"path": ".github/scripts/pr-quota-manager.test.js",
"chars": 14485,
"preview": "/**\n * Unit tests for PR Quota Management System\n */\n\nconst prQuotaManager = require('./pr-quota-manager');\nconst {\n fo"
},
{
"path": ".github/scripts/waiting-for-author.js",
"chars": 5923,
"preview": "module.exports = async ({github, context, core}) => {\n const LABEL_NAME = 'waiting-for-author';\n\n // Determine event t"
},
{
"path": ".github/workflows/README.md",
"chars": 8304,
"preview": "# CI Workflows\n\nThis directory contains GitHub Actions workflows for the Jaeger project. The workflows are organized int"
},
{
"path": ".github/workflows/ci-build-binaries.yml",
"chars": 1759,
"preview": "name: Build binaries\n\non:\n workflow_call:\n\n# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permi"
},
{
"path": ".github/workflows/ci-deploy-demo.yml",
"chars": 2271,
"preview": "name: Deploy Jaeger Demo to OKE\n\non:\n schedule:\n - cron: '0 13 * * *' # Daily at 8:00 AM US Eastern Time (ET)\n wor"
},
{
"path": ".github/workflows/ci-docker-all-in-one.yml",
"chars": 1806,
"preview": "name: Build all-in-one\n\non:\n workflow_call:\n\npermissions:\n contents: read\n packages: read # This allows the runner t"
},
{
"path": ".github/workflows/ci-docker-build.yml",
"chars": 1423,
"preview": "name: Build docker images\n\non:\n workflow_call:\n\n# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-"
},
{
"path": ".github/workflows/ci-docker-hotrod.yml",
"chars": 1895,
"preview": "name: CIT Hotrod\n\non:\n workflow_call:\n\n# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissio"
},
{
"path": ".github/workflows/ci-e2e-all.yml",
"chars": 970,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# Fan-out workflow that invokes all indi"
},
{
"path": ".github/workflows/ci-e2e-badger.yaml",
"chars": 2011,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# Integration tests for Badger (embedded"
},
{
"path": ".github/workflows/ci-e2e-cassandra.yml",
"chars": 2548,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# Integration tests for Cassandra storag"
},
{
"path": ".github/workflows/ci-e2e-clickhouse.yml",
"chars": 1292,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# E2E integration tests for ClickHouse s"
},
{
"path": ".github/workflows/ci-e2e-elasticsearch.yml",
"chars": 2689,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# Integration tests for Elasticsearch st"
},
{
"path": ".github/workflows/ci-e2e-grpc.yml",
"chars": 1796,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# Integration tests for the gRPC remote "
},
{
"path": ".github/workflows/ci-e2e-kafka.yml",
"chars": 1500,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# E2E integration tests for Kafka as a s"
},
{
"path": ".github/workflows/ci-e2e-memory.yaml",
"chars": 1303,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# E2E integration tests for the in-memor"
},
{
"path": ".github/workflows/ci-e2e-opensearch.yml",
"chars": 2448,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# Integration tests for OpenSearch stora"
},
{
"path": ".github/workflows/ci-e2e-query.yml",
"chars": 1415,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# E2E integration tests for a two-proces"
},
{
"path": ".github/workflows/ci-e2e-spm.yml",
"chars": 1473,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# E2E integration tests for Service Perf"
},
{
"path": ".github/workflows/ci-e2e-tailsampling.yml",
"chars": 1232,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# E2E integration tests for the tail-bas"
},
{
"path": ".github/workflows/ci-lint-checks.yaml",
"chars": 7118,
"preview": "name: Lint Checks\n\non:\n workflow_call:\n\n# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissi"
},
{
"path": ".github/workflows/ci-orchestrator-stage1.yml",
"chars": 158,
"preview": "name: \"CI Orchestrator: Stage 1 (Linters)\"\n\non:\n workflow_call:\n\njobs:\n lint-checks:\n uses: ./.github/workflows/ci-"
},
{
"path": ".github/workflows/ci-orchestrator-stage2.yml",
"chars": 158,
"preview": "name: \"CI Orchestrator: Stage 2 (Unit Tests)\"\n\non:\n workflow_call:\n\njobs:\n unit-tests:\n uses: ./.github/workflows/c"
},
{
"path": ".github/workflows/ci-orchestrator-stage3.yml",
"chars": 789,
"preview": "name: \"CI Orchestrator: Stage 3 (Docker, E2E, Binaries, Static Analysis)\"\n\non:\n workflow_call:\n\njobs:\n build-binaries:"
},
{
"path": ".github/workflows/ci-orchestrator.yml",
"chars": 10060,
"preview": "name: CI Orchestrator\n\non:\n pull_request:\n branches: [main]\n push:\n branches: [main]\n merge_group:\n\nconcurrency"
},
{
"path": ".github/workflows/ci-release.yml",
"chars": 5809,
"preview": "name: Publish release\n\non:\n release:\n types:\n - published\n\n workflow_dispatch:\n inputs:\n dry_run:\n "
},
{
"path": ".github/workflows/ci-summary-report-publish.yml",
"chars": 5730,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# CI Summary Report (Publish): posts PR "
},
{
"path": ".github/workflows/ci-summary-report.yml",
"chars": 12316,
"preview": "# Copyright (c) 2026 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\n# CI Summary Report: reusable workflow ("
},
{
"path": ".github/workflows/ci-unit-tests-go-tip.yml",
"chars": 1092,
"preview": "name: Unit Tests on Go Tip\n\non:\n push:\n branches: [main]\n\n workflow_dispatch:\n\n # We normally don't want this work"
},
{
"path": ".github/workflows/ci-unit-tests.yml",
"chars": 1138,
"preview": "name: Unit Tests\n\non:\n workflow_call:\n\npermissions:\n contents: read\n\njobs:\n unit-tests:\n permissions:\n checks"
},
{
"path": ".github/workflows/codeql.yml",
"chars": 1958,
"preview": "name: \"CodeQL\"\n\non:\n workflow_call:\n schedule:\n - cron: '31 6 * * 1'\n\n# See https://github.com/ossf/scorecard/blob/"
},
{
"path": ".github/workflows/dco_merge_group.yml",
"chars": 389,
"preview": "# Fake \"DCO check\" workflow inspired by https://github.com/onnx/onnx/pull/5398/files.\n# The regular DCO check is require"
},
{
"path": ".github/workflows/dependency-review.yml",
"chars": 1127,
"preview": "# Dependency Review Action\n#\n# This Action will scan dependency manifest files that change as part of a Pull Request,\n# "
},
{
"path": ".github/workflows/fossa.yml",
"chars": 1129,
"preview": "name: FOSSA\n\non:\n workflow_call:\n\n# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions\npe"
},
{
"path": ".github/workflows/label-check.yml",
"chars": 890,
"preview": "name: Verify PR Label\n\non:\n merge_group:\n pull_request:\n types:\n - opened\n - reopened\n - synchronize"
},
{
"path": ".github/workflows/pr-quota-manager.yml",
"chars": 1934,
"preview": "name: PR Quota Manager\n\non:\n pull_request_target: # Runs with write permissions even for fork PRs\n types: [opened, "
},
{
"path": ".github/workflows/scorecard.yml",
"chars": 3146,
"preview": "# This workflow uses actions that are not certified by GitHub. They are provided\n# by a third-party and are governed by "
},
{
"path": ".github/workflows/stale.yml",
"chars": 1949,
"preview": "name: 'Close stale issues and PRs'\n\non:\n schedule:\n # Run every Monday at 1:30 AM UTC\n - cron: '30 1 * * 1'\n wor"
},
{
"path": ".github/workflows/waiting-for-author.yml",
"chars": 756,
"preview": "name: \"Waiting for Author\"\n\non:\n pull_request_target:\n types: [synchronize]\n pull_request_review_comment:\n types"
},
{
"path": ".gitignore",
"chars": 805,
"preview": "go.work\ngo.work.sum\n\n.tools/\n\n*.out\n*.test\n*.xml\n*.swp\n.fmt.log\n.import.log\n.lint.log\ncover.html\n.envrc\n.idea/\n.vscode/\n"
},
{
"path": ".gitmodules",
"chars": 211,
"preview": "[submodule \"idl\"]\n\tpath = idl\n\turl = https://github.com/jaegertracing/jaeger-idl.git\n\tbranch = main\n[submodule \"jaeger-u"
},
{
"path": ".golangci.yml",
"chars": 5941,
"preview": "version: \"2\"\nrun:\n go: \"1.26\"\nlinters:\n enable:\n - asciicheck\n - bidichk\n - bodyclose\n - contextcheck\n "
},
{
"path": ".mockery.header.txt",
"chars": 123,
"preview": "// Copyright (c) The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n//\n// Run 'make generate-mocks' to regenerat"
},
{
"path": ".mockery.yaml",
"chars": 2173,
"preview": "dir: '{{.InterfaceDir}}/mocks/'\nstructname: '{{.InterfaceName}}'\npkgname: mocks\ntemplate: testify\nfilename: mocks.go\ntem"
},
{
"path": "ADOPTERS.md",
"chars": 2660,
"preview": "* Alauda\n * Official site: [en](https://www.alauda.io/), [cn](https://www.alauda.cn/)\n* [Base CRM](https://getbase.com/"
},
{
"path": "AGENTS.md",
"chars": 1082,
"preview": "# AGENTS.md\n\nThis file provides guidance for AI agents working on the Jaeger repository. For detailed project structure,"
},
{
"path": "CHANGELOG.md",
"chars": 344457,
"preview": "### 🇷🇺 A message to people of Russia\n\nIf you currently live in Russia, please read [this message](./_To_People_of_Russia"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 345,
"preview": "## Community Code of Conduct\n\nJaeger follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/c"
},
{
"path": "CONTRIBUTING.md",
"chars": 10199,
"preview": "# How to Contribute to Jaeger\n\nWe'd love your help!\n\nGeneral contributing guidelines are described in [Contributing Guid"
},
{
"path": "CONTRIBUTING_GUIDELINES.md",
"chars": 11223,
"preview": "# How to Contribute to Jaeger\n\nWe'd love your help!\n\nJaeger is [Apache 2.0 licensed](./LICENSE) and accepts contribution"
},
{
"path": "DCO",
"chars": 1423,
"preview": "Developer Certificate of Origin\nVersion 1.1\n\nCopyright (C) 2004, 2006 The Linux Foundation and its contributors.\n660 Yor"
},
{
"path": "GOVERNANCE.md",
"chars": 4815,
"preview": "# Jaeger Governance\n\nThis document defines governance policies for the Jaeger project.\n\n## Maintainers\n\nJaeger Maintaine"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "MAINTAINERS.md",
"chars": 3415,
"preview": "The current Maintainers Group for the Jaeger Project consists of:\n\n| Name | Employer | Responsibilities |\n| ---- | -----"
},
{
"path": "Makefile",
"chars": 7658,
"preview": "# Copyright (c) 2023 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\nSHELL := /bin/bash\nJAEGER_IMPORT_PATH = "
},
{
"path": "NOTICE",
"chars": 227,
"preview": "Jaeger, Distributed Tracing Platform.\n\nCopyright 2015-2019 The Jaeger Project Authors\n\nLicensed under Apache License 2.0"
},
{
"path": "README.md",
"chars": 10008,
"preview": "[](https://"
},
{
"path": "RELEASE.md",
"chars": 7174,
"preview": "# Jaeger Overall Release Process\n\n## ⭐ Start Here: Create Tracking Issue for Release ⭐\n\nRun the following command to cre"
},
{
"path": "SECURITY-INSIGHTS.yml",
"chars": 2795,
"preview": "header:\n schema-version: 1.0.0\n last-updated: '2026-01-16'\n last-reviewed: '2026-01-16'\n expiration-date: '2027-01-1"
},
{
"path": "SECURITY.md",
"chars": 8178,
"preview": "# Security Policy\n\n## Supported Versions\n\nThe Jaeger project provides community support only for last minor version: bug"
},
{
"path": "THREAT-MODEL.md",
"chars": 359,
"preview": "# Jaeger Threat Model\n\nThis is a placeholder for the Jaeger Threat Model. This will be based on [OSSF standards](https:/"
},
{
"path": "_To_People_of_Russia.md",
"chars": 2114,
"preview": "## 🇷🇺 Русским гражданам\n\nВ Украине сейчас идет война. Силами РФ наносятся удары по гражданской инфраструктуре в [Харьков"
},
{
"path": "cmd/anonymizer/Dockerfile",
"chars": 244,
"preview": "# Copyright (c) 2024 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\nFROM scratch\nARG TARGETARCH\nARG USER_UID"
},
{
"path": "cmd/anonymizer/app/anonymizer/anonymizer.go",
"chars": 6651,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage anonymizer\n\nimport (\n\t\"context"
},
{
"path": "cmd/anonymizer/app/anonymizer/anonymizer_test.go",
"chars": 5000,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage anonymizer\n\nimport (\n\t\"net/htt"
},
{
"path": "cmd/anonymizer/app/anonymizer/package_test.go",
"chars": 240,
"preview": "// Copyright (c) 2024 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage anonymizer\n\nimport (\n\t\"testing"
},
{
"path": "cmd/anonymizer/app/flags.go",
"chars": 2259,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"github.com/spf"
},
{
"path": "cmd/anonymizer/app/flags_test.go",
"chars": 1522,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"testing\"\n\n\t\"gi"
},
{
"path": "cmd/anonymizer/app/query/package_test.go",
"chars": 235,
"preview": "// Copyright (c) 2024 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage query\n\nimport (\n\t\"testing\"\n\n\t\""
},
{
"path": "cmd/anonymizer/app/query/query.go",
"chars": 2107,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage query\n\nimport (\n\t\"context\"\n\t\"e"
},
{
"path": "cmd/anonymizer/app/query/query_test.go",
"chars": 7062,
"preview": "// Copyright (c) 2024 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage query\n\nimport (\n\t\"context\"\n\t\"e"
},
{
"path": "cmd/anonymizer/app/uiconv/extractor.go",
"chars": 2155,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage uiconv\n\nimport (\n\t\"encoding/js"
},
{
"path": "cmd/anonymizer/app/uiconv/extractor_test.go",
"chars": 2191,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage uiconv\n\nimport (\n\t\"encoding/js"
},
{
"path": "cmd/anonymizer/app/uiconv/fixtures/trace_empty.json",
"chars": 0,
"preview": ""
},
{
"path": "cmd/anonymizer/app/uiconv/fixtures/trace_invalid_json.json",
"chars": 83,
"preview": "[{\"traceID\":\"2be38093ead7a083\",\"spanID\":\"7bd66f09ba90ea3d\",\"duration\": \"invalid\"}\n]"
},
{
"path": "cmd/anonymizer/app/uiconv/fixtures/trace_scan_error.json",
"chars": 80,
"preview": "[{\"traceID\":\"2be38093ead7a083\",\"spanID\":\"7606ddfe69932d34\",\"duration\":267037},\n]"
},
{
"path": "cmd/anonymizer/app/uiconv/fixtures/trace_success.json",
"chars": 827,
"preview": "[{\"traceID\":\"2be38093ead7a083\",\"spanID\":\"7606ddfe69932d34\",\"flags\":1,\"operationName\":\"a071653098f9250d\",\"references\":[{\""
},
{
"path": "cmd/anonymizer/app/uiconv/fixtures/trace_wrong_format.json",
"chars": 77,
"preview": "{\"traceID\":\"2be38093ead7a083\",\"spanID\":\"7606ddfe69932d34\",\"duration\":267037}\n"
},
{
"path": "cmd/anonymizer/app/uiconv/module.go",
"chars": 689,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage uiconv\n\nimport (\n\t\"go.uber.org"
},
{
"path": "cmd/anonymizer/app/uiconv/module_test.go",
"chars": 1735,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage uiconv\n\nimport (\n\t\"os\"\n\t\"testi"
},
{
"path": "cmd/anonymizer/app/uiconv/package_test.go",
"chars": 236,
"preview": "// Copyright (c) 2023 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage uiconv\n\nimport (\n\t\"testing\"\n\n\t"
},
{
"path": "cmd/anonymizer/app/uiconv/reader.go",
"chars": 1948,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage uiconv\n\nimport (\n\t\"bufio\"\n\t\"en"
},
{
"path": "cmd/anonymizer/app/uiconv/reader_test.go",
"chars": 2023,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage uiconv\n\nimport (\n\t\"testing\"\n\n\t"
},
{
"path": "cmd/anonymizer/app/writer/package_test.go",
"chars": 236,
"preview": "// Copyright (c) 2024 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage writer\n\nimport (\n\t\"testing\"\n\n\t"
},
{
"path": "cmd/anonymizer/app/writer/writer.go",
"chars": 3757,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage writer\n\nimport (\n\t\"bytes\"\n\t\"en"
},
{
"path": "cmd/anonymizer/app/writer/writer_test.go",
"chars": 2888,
"preview": "// Copyright (c) 2024 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage writer\n\nimport (\n\t\"net/http\"\n\t"
},
{
"path": "cmd/anonymizer/main.go",
"chars": 2977,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"errors\"\n\t\"fmt"
},
{
"path": "cmd/es-index-cleaner/.gitignore",
"chars": 21,
"preview": "es-index-cleaner-*-*\n"
},
{
"path": "cmd/es-index-cleaner/Dockerfile",
"chars": 292,
"preview": "# Copyright (c) 2024 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\nARG base_image\n\nFROM $base_image AS rele"
},
{
"path": "cmd/es-index-cleaner/README.md",
"chars": 600,
"preview": "# jaeger-es-index-cleaner\n\nIt is common to only keep observability data for a limited time.\nHowever, Elasticsearch does "
},
{
"path": "cmd/es-index-cleaner/app/cutoff_time.go",
"chars": 482,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"time\"\n)\n\nfunc "
},
{
"path": "cmd/es-index-cleaner/app/cutoff_time_test.go",
"chars": 2298,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"testing\"\n\t\"tim"
},
{
"path": "cmd/es-index-cleaner/app/flags.go",
"chars": 2248,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"flag\"\n\n\t\"githu"
},
{
"path": "cmd/es-index-cleaner/app/flags_test.go",
"chars": 1433,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"flag\"\n\t\"testin"
},
{
"path": "cmd/es-index-cleaner/app/index_filter.go",
"chars": 1927,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"fmt\"\n\t\"regexp\""
},
{
"path": "cmd/es-index-cleaner/app/index_filter_test.go",
"chars": 11336,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"testing\"\n\t\"tim"
},
{
"path": "cmd/es-index-cleaner/app/package_test.go",
"chars": 233,
"preview": "// Copyright (c) 2023 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"testing\"\n\n\t\"gi"
},
{
"path": "cmd/es-index-cleaner/main.go",
"chars": 3573,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"context\"\n\t\"en"
},
{
"path": "cmd/es-rollover/Dockerfile",
"chars": 265,
"preview": "# Copyright (c) 2024 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\nARG base_image\n\nFROM $base_image AS rele"
},
{
"path": "cmd/es-rollover/app/actions.go",
"chars": 1745,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"context\"\n\t\"cry"
},
{
"path": "cmd/es-rollover/app/actions_test.go",
"chars": 3002,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"errors\"\n\t\"net/"
},
{
"path": "cmd/es-rollover/app/flags.go",
"chars": 2406,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"flag\"\n\n\t\"githu"
},
{
"path": "cmd/es-rollover/app/flags_test.go",
"chars": 1537,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"flag\"\n\t\"testin"
},
{
"path": "cmd/es-rollover/app/index_options.go",
"chars": 2083,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"fmt\"\n\t\"strings"
},
{
"path": "cmd/es-rollover/app/index_options_test.go",
"chars": 5975,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"testing\"\n\n\t\"gi"
},
{
"path": "cmd/es-rollover/app/init/action.go",
"chars": 3562,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage init\n\nimport (\n\t\"errors\"\n\t\"fmt"
},
{
"path": "cmd/es-rollover/app/init/action_test.go",
"chars": 9796,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage init\n\nimport (\n\t\"errors\"\n\t\"tes"
},
{
"path": "cmd/es-rollover/app/init/flags.go",
"chars": 2114,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage init\n\nimport (\n\t\"flag\"\n\n\t\"gith"
},
{
"path": "cmd/es-rollover/app/init/flags_test.go",
"chars": 1141,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage init\n\nimport (\n\t\"flag\"\n\t\"testi"
},
{
"path": "cmd/es-rollover/app/init/package_test.go",
"chars": 234,
"preview": "// Copyright (c) 2023 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage init\n\nimport (\n\t\"testing\"\n\n\t\"g"
},
{
"path": "cmd/es-rollover/app/lookback/action.go",
"chars": 1982,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage lookback\n\nimport (\n\t\"time\"\n\n\t\""
},
{
"path": "cmd/es-rollover/app/lookback/action_test.go",
"chars": 3422,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage lookback\n\nimport (\n\t\"errors\"\n\t"
},
{
"path": "cmd/es-rollover/app/lookback/flags.go",
"chars": 892,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage lookback\n\nimport (\n\t\"flag\"\n\n\t\""
},
{
"path": "cmd/es-rollover/app/lookback/flags_test.go",
"chars": 686,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage lookback\n\nimport (\n\t\"flag\"\n\t\"t"
},
{
"path": "cmd/es-rollover/app/lookback/package_test.go",
"chars": 238,
"preview": "// Copyright (c) 2023 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage lookback\n\nimport (\n\t\"testing\"\n"
},
{
"path": "cmd/es-rollover/app/lookback/time_reference.go",
"chars": 1306,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage lookback\n\nimport \"time\"\n\nfunc "
},
{
"path": "cmd/es-rollover/app/lookback/time_reference_test.go",
"chars": 2183,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage lookback\n\nimport (\n\t\"testing\"\n"
},
{
"path": "cmd/es-rollover/app/package_test.go",
"chars": 233,
"preview": "// Copyright (c) 2023 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"testing\"\n\n\t\"gi"
},
{
"path": "cmd/es-rollover/app/rollover/action.go",
"chars": 1659,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage rollover\n\nimport (\n\t\"encoding/"
},
{
"path": "cmd/es-rollover/app/rollover/action_test.go",
"chars": 4500,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage rollover\n\nimport (\n\t\"errors\"\n\t"
},
{
"path": "cmd/es-rollover/app/rollover/flags.go",
"chars": 764,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage rollover\n\nimport (\n\t\"flag\"\n\n\t\""
},
{
"path": "cmd/es-rollover/app/rollover/flags_test.go",
"chars": 682,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage rollover\n\nimport (\n\t\"flag\"\n\t\"t"
},
{
"path": "cmd/es-rollover/app/rollover/package_test.go",
"chars": 238,
"preview": "// Copyright (c) 2023 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage rollover\n\nimport (\n\t\"testing\"\n"
},
{
"path": "cmd/es-rollover/main.go",
"chars": 4174,
"preview": "// Copyright (c) 2021 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"flag\"\n\t\"os\"\n\n"
},
{
"path": "cmd/esmapping-generator/main.go",
"chars": 443,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t"
},
{
"path": "cmd/internal/docs/.gitignore",
"chars": 22,
"preview": "*.md\n*.rst\n*.1\n*.yaml\n"
},
{
"path": "cmd/internal/docs/command.go",
"chars": 1682,
"preview": "// Copyright (c) 2019 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage docs\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n"
},
{
"path": "cmd/internal/docs/command_test.go",
"chars": 1424,
"preview": "// Copyright (c) 2019 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage docs\n\nimport (\n\t\"os\"\n\t\"testing"
},
{
"path": "cmd/internal/featuregate/command.go",
"chars": 611,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage featuregate\n\nimport (\n\t\"github"
},
{
"path": "cmd/internal/featuregate/command_test.go",
"chars": 489,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage featuregate\n\nimport (\n\t\"testin"
},
{
"path": "cmd/internal/featuregate/package_test.go",
"chars": 241,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage featuregate\n\nimport (\n\t\"testin"
},
{
"path": "cmd/internal/flags/admin.go",
"chars": 4922,
"preview": "// Copyright (c) 2019 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage flags\n\nimport (\n\t\"context\"\n\t\"e"
},
{
"path": "cmd/internal/flags/admin_test.go",
"chars": 4957,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage flags\n\nimport (\n\t\"context\"\n\t\"c"
},
{
"path": "cmd/internal/flags/doc.go",
"chars": 425,
"preview": "// Copyright (c) 2019 The Jaeger Authors.\n// Copyright (c) 2017 Uber Technologies, Inc.\n// SPDX-License-Identifier: Apac"
},
{
"path": "cmd/internal/flags/flags.go",
"chars": 3201,
"preview": "// Copyright (c) 2019 The Jaeger Authors.\n// Copyright (c) 2017 Uber Technologies, Inc.\n// SPDX-License-Identifier: Apac"
},
{
"path": "cmd/internal/flags/flags_test.go",
"chars": 1084,
"preview": "// Copyright (c) 2019 The Jaeger Authors.\n// Copyright (c) 2017 Uber Technologies, Inc.\n// SPDX-License-Identifier: Apac"
},
{
"path": "cmd/internal/flags/healthhost.go",
"chars": 1621,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage flags\n\nimport (\n\t\"net/http\"\n\t\""
},
{
"path": "cmd/internal/flags/healthhost_test.go",
"chars": 1994,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage flags\n\nimport (\n\t\"net/http\"\n\t\""
},
{
"path": "cmd/internal/flags/package_test.go",
"chars": 235,
"preview": "// Copyright (c) 2024 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage flags\n\nimport (\n\t\"testing\"\n\n\t\""
},
{
"path": "cmd/internal/flags/service.go",
"chars": 3528,
"preview": "// Copyright (c) 2019 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage flags\n\nimport (\n\t\"expvar\"\n\t\"fl"
},
{
"path": "cmd/internal/flags/service_test.go",
"chars": 2199,
"preview": "// Copyright (c) 2022 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage flags\n\nimport (\n\t\"flag\"\n\t\"os\"\n"
},
{
"path": "cmd/internal/printconfig/command.go",
"chars": 1937,
"preview": "// Copyright (c) 2024 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage printconfig\n\nimport (\n\t\"fmt\"\n\t"
},
{
"path": "cmd/internal/printconfig/command_test.go",
"chars": 5012,
"preview": "// Copyright (c) 2024 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n// Licensed under the Apache License, V"
},
{
"path": "cmd/internal/status/command.go",
"chars": 1776,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage status\n\nimport (\n\t\"context\"\n\t\""
},
{
"path": "cmd/internal/status/command_test.go",
"chars": 1709,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage status\n\nimport (\n\t\"net/http\"\n\t"
},
{
"path": "cmd/internal/storageconfig/config.go",
"chars": 5506,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage storageconfig\n\nimport (\n\t\"erro"
},
{
"path": "cmd/internal/storageconfig/config_test.go",
"chars": 8266,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage storageconfig\n\nimport (\n\t\"fmt\""
},
{
"path": "cmd/internal/storageconfig/factory.go",
"chars": 3192,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage storageconfig\n\nimport (\n\t\"cont"
},
{
"path": "cmd/internal/storageconfig/factory_test.go",
"chars": 8797,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage storageconfig\n\nimport (\n\t\"cont"
},
{
"path": "cmd/internal/storageconfig/package_test.go",
"chars": 243,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage storageconfig\n\nimport (\n\t\"test"
},
{
"path": "cmd/remote-storage/Dockerfile",
"chars": 686,
"preview": "# Copyright (c) 2024 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\nARG base_image\nARG debug_image\n\nARG SVC="
},
{
"path": "cmd/remote-storage/README.md",
"chars": 2448,
"preview": "# Jaeger Remote Storage\n\nThe `jaeger-remote-storage` binary allows sharing single-node storage implementations like memo"
},
{
"path": "cmd/remote-storage/app/config.go",
"chars": 2454,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"fmt\"\n\n\t\"github"
},
{
"path": "cmd/remote-storage/app/config_test.go",
"chars": 3894,
"preview": "// Copyright (c) 2025 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"os\"\n\t\"path/fil"
},
{
"path": "cmd/remote-storage/app/package_test.go",
"chars": 233,
"preview": "// Copyright (c) 2024 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"testing\"\n\n\t\"gi"
},
{
"path": "cmd/remote-storage/app/server.go",
"chars": 4268,
"preview": "// Copyright (c) 2020 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"context\"\n\t\"fmt"
},
{
"path": "cmd/remote-storage/app/server_test.go",
"chars": 11426,
"preview": "// Copyright (c) 2022 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage app\n\nimport (\n\t\"context\"\n\t\"err"
},
{
"path": "cmd/remote-storage/config-badger.yaml",
"chars": 564,
"preview": "# Example configuration for remote-storage service with Badger backend\n\n# Server configuration\ngrpc:\n # Host:Port to li"
},
{
"path": "cmd/remote-storage/config.yaml",
"chars": 553,
"preview": "# Example configuration for remote-storage service\n# This service exposes a gRPC API for remote storage backends\n# and a"
},
{
"path": "cmd/remote-storage/main.go",
"chars": 4721,
"preview": "// Copyright (c) 2022 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"context\"\n\t\"fm"
},
{
"path": "cmd/tracegen/Dockerfile",
"chars": 238,
"preview": "# Copyright (c) 2024 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\nFROM scratch\nARG TARGETARCH\nARG USER_UID"
},
{
"path": "cmd/tracegen/README.md",
"chars": 1048,
"preview": "# tracegen\n\n`tracegen` is a utility that can generate a steady flow of simple traces useful for performance tuning.\nTrac"
},
{
"path": "cmd/tracegen/docker-compose.yml",
"chars": 554,
"preview": "services:\n jaeger:\n image: cr.jaegertracing.io/jaegertracing/jaeger:2.15.1@sha256:a7dd965687d45507072676db81e690"
},
{
"path": "cmd/tracegen/main.go",
"chars": 4466,
"preview": "// Copyright (c) 2018 The Jaeger Authors.\n// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport (\n\t\"context\"\n\t\"er"
},
{
"path": "doc.go",
"chars": 262,
"preview": "// Copyright (c) 2019 The Jaeger Authors.\n// Copyright (c) 2017 Uber Technologies, Inc.\n// SPDX-License-Identifier: Apac"
},
{
"path": "docker-compose/cassandra/v4/docker-compose.yaml",
"chars": 897,
"preview": "services:\n cassandra:\n image: cassandra:4.1@sha256:b9451ebdfa53f9e22b470e1420f2a94a3433738b7f25350472d3443f0b203b75\n"
},
{
"path": "docker-compose/cassandra/v5/docker-compose.yaml",
"chars": 897,
"preview": "services:\n cassandra:\n image: cassandra:5.0@sha256:70b40a2025d450f7865c5ec6f1ebea13108166f81fe41462069690cb4d9690f2\n"
},
{
"path": "docker-compose/clickhouse/docker-compose.yml",
"chars": 474,
"preview": "services:\n clickhouse:\n image: clickhouse/clickhouse-server:25.12.1@sha256:7234d193fbeb3a375f21f0bb99040396f68bb2e82"
},
{
"path": "docker-compose/elasticsearch/v6/docker-compose.yml",
"chars": 308,
"preview": "services:\n elasticsearch:\n image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.23@sha256:740c3614289539e978"
},
{
"path": "docker-compose/elasticsearch/v7/docker-compose.yml",
"chars": 504,
"preview": "services:\n elasticsearch:\n image: docker.elastic.co/elasticsearch/elasticsearch:7.17.22@sha256:a0e01a200a316bac8d661"
},
{
"path": "docker-compose/elasticsearch/v8/docker-compose.yml",
"chars": 569,
"preview": "services:\n elasticsearch:\n image: docker.elastic.co/elasticsearch/elasticsearch:8.19.0@sha256:e1e66bfabae0fd03a0a366"
},
{
"path": "docker-compose/elasticsearch/v9/docker-compose.yml",
"chars": 568,
"preview": "services:\n elasticsearch:\n image: docker.elastic.co/elasticsearch/elasticsearch:9.3.0@sha256:4f6bdcb742e892539c6ac49"
},
{
"path": "docker-compose/kafka/README.md",
"chars": 806,
"preview": "# Sample configuration with Kafka\n\nThis `docker compose` environment provides a sample configuration of Jaeger deploymen"
},
{
"path": "docker-compose/kafka/docker-compose.yml",
"chars": 2828,
"preview": "include:\n - path: v3/docker-compose.yml\n\nservices:\n jaeger-remote-storage:\n image: cr.jaegertracing.io/jaegertracin"
},
{
"path": "docker-compose/kafka/jaeger-ingester-remote-storage.yaml",
"chars": 1037,
"preview": "# This config is needed because config-kafka-ingester.yaml uses memory storage,\n# but this docker-compose setup uses jae"
},
{
"path": "docker-compose/kafka/v3/docker-compose.yml",
"chars": 1265,
"preview": "services:\n kafka:\n image: apache/kafka:3.9.0@sha256:fbc7d7c428e3755cf36518d4976596002477e4c052d1f80b5b9eafd06d0fff2f"
},
{
"path": "docker-compose/monitor/.gitignore",
"chars": 6,
"preview": ".venv\n"
},
{
"path": "docker-compose/monitor/Makefile",
"chars": 1464,
"preview": "# Copyright (c) 2024 The Jaeger Authors.\n# SPDX-License-Identifier: Apache-2.0\n\nBINARY ?= jaeger # Default value uses v2"
},
{
"path": "docker-compose/monitor/README.md",
"chars": 11971,
"preview": "# Service Performance Monitoring (SPM) Development/Demo Environment\n\nService Performance Monitoring (SPM) is an opt-in f"
},
{
"path": "docker-compose/monitor/datasource.yml",
"chars": 146,
"preview": "apiVersion: 1\ndatasources:\n- name: Prometheus\n type: prometheus\n url: http://prometheus:9090\n isDefault: true\n acces"
},
{
"path": "docker-compose/monitor/docker-compose-elasticsearch.yml",
"chars": 2030,
"preview": "services:\n elasticsearch:\n image: docker.elastic.co/elasticsearch/elasticsearch:9.3.0@sha256:4f6bdcb742e892539c6ac49"
},
{
"path": "docker-compose/monitor/docker-compose-opensearch.yml",
"chars": 1628,
"preview": "services:\n opensearch:\n image: opensearchproject/opensearch:3.5.0@sha256:919ff4e7d0d57dbc4bd0999ddf0e43e961bba844ec2"
},
{
"path": "docker-compose/monitor/docker-compose.yml",
"chars": 1268,
"preview": "services:\n jaeger:\n networks:\n backend:\n # This is the host name used in Prometheus scrape configuration"
},
{
"path": "docker-compose/monitor/jaeger-ui.json",
"chars": 96,
"preview": "{\n \"monitor\": {\n \"menuEnabled\": true\n },\n \"dependencies\": {\n \"menuEnabled\": true\n }\n}\n"
}
]
// ... and 966 more files (download for full content)
About this extraction
This page contains the full source code of the jaegertracing/jaeger GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1166 files (4.9 MB), approximately 1.3M tokens, and a symbol index with 7236 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.