Full Code of openzipkin/zipkin for AI

master 831e2f354a7a cached
814 files
3.6 MB
992.6k tokens
5515 symbols
1 requests
Download .txt
Showing preview only (3,960K chars total). Download the full file or copy to clipboard to get everything.
Repository: openzipkin/zipkin
Branch: master
Commit: 831e2f354a7a
Files: 814
Total size: 3.6 MB

Directory structure:
gitextract_cfx8oy44/

├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.md
│   │   ├── config.yml
│   │   └── feature.md
│   └── workflows/
│       ├── create_release.yml
│       ├── deploy.yml
│       ├── docker_push.yml
│       ├── lint.yml
│       ├── security.yml
│       ├── test.yml
│       └── test_readme.yml
├── .gitignore
├── .mvn/
│   └── wrapper/
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── .settings.xml
├── LICENSE
├── README.md
├── RELEASE.md
├── SECURITY.md
├── benchmarks/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       └── test/
│           ├── assembly/
│           │   └── test-jar.xml
│           ├── java/
│           │   └── zipkin2/
│           │       ├── EndpointBenchmarks.java
│           │       ├── SpanBenchmarks.java
│           │       ├── codec/
│           │       │   ├── CodecBenchmarks.java
│           │       │   ├── JacksonSpanDecoder.java
│           │       │   ├── JacksonSpanDecoderTest.java
│           │       │   ├── JsonCodecBenchmarks.java
│           │       │   ├── MoshiSpanDecoder.java
│           │       │   ├── MoshiSpanDecoderTest.java
│           │       │   ├── ProtoCodecBenchmarks.java
│           │       │   ├── ProtobufSpanDecoder.java
│           │       │   └── WireSpanDecoder.java
│           │       ├── collector/
│           │       │   └── MetricsBenchmarks.java
│           │       ├── elasticsearch/
│           │       │   └── internal/
│           │       │       └── BulkRequestBenchmarks.java
│           │       ├── internal/
│           │       │   ├── DelayLimiterBenchmarks.java
│           │       │   ├── Proto3CodecInteropTest.java
│           │       │   ├── ReadBufferBenchmarks.java
│           │       │   └── WriteBufferBenchmarks.java
│           │       └── server/
│           │           ├── ServerIntegratedBenchmark.java
│           │           └── internal/
│           │               └── throttle/
│           │                   └── ThrottledCallBenchmarks.java
│           └── resources/
│               ├── create-datasource-and-dashboard.sh
│               ├── prometheus.yml
│               ├── simplelogger.properties
│               ├── zipkin2-chinese.json
│               └── zipkin2-client.json
├── build-bin/
│   ├── README.md
│   ├── configure_deploy
│   ├── configure_lint
│   ├── configure_test
│   ├── deploy
│   ├── docker/
│   │   ├── configure_docker
│   │   ├── configure_docker_push
│   │   ├── docker-healthcheck
│   │   ├── docker_arch
│   │   ├── docker_args
│   │   ├── docker_block_on_health
│   │   ├── docker_build
│   │   ├── docker_push
│   │   └── docker_test_image
│   ├── docker-compose-zipkin-eureka.yml
│   ├── docker-compose-zipkin-ui.yml
│   ├── docker-compose-zipkin-uiproxy.yml
│   ├── docker-compose-zipkin.yml
│   ├── docker_push
│   ├── git/
│   │   ├── login_git
│   │   └── version_from_trigger_tag
│   ├── gpg/
│   │   └── configure_gpg
│   ├── javadoc_to_gh_pages
│   ├── lint
│   ├── maven/
│   │   ├── maven_build
│   │   ├── maven_build_or_unjar
│   │   ├── maven_deploy
│   │   ├── maven_go_offline
│   │   ├── maven_opts
│   │   ├── maven_release
│   │   └── maven_unjar
│   ├── maven_go_offline
│   ├── maybe_install_npm
│   ├── mlc_config.json
│   └── test
├── docker/
│   ├── Dockerfile
│   ├── RATIONALE.md
│   ├── README.md
│   ├── examples/
│   │   ├── .dockerignore
│   │   ├── README.md
│   │   ├── docker-compose-activemq.yml
│   │   ├── docker-compose-cassandra.yml
│   │   ├── docker-compose-dependencies.yml
│   │   ├── docker-compose-elasticsearch.yml
│   │   ├── docker-compose-eureka.yml
│   │   ├── docker-compose-example.yml
│   │   ├── docker-compose-kafka.yml
│   │   ├── docker-compose-mysql.yml
│   │   ├── docker-compose-prometheus.yml
│   │   ├── docker-compose-pulsar.yml
│   │   ├── docker-compose-rabbitmq.yml
│   │   ├── docker-compose-ui.yml
│   │   ├── docker-compose-uiproxy.yml
│   │   ├── docker-compose.yml
│   │   └── prometheus/
│   │       ├── create-datasource-and-dashboard.sh
│   │       └── prometheus.yml
│   ├── start-zipkin
│   └── test-images/
│       ├── zipkin-activemq/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   └── start-activemq
│       ├── zipkin-cassandra/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── install.sh
│       │   └── start-cassandra
│       ├── zipkin-elasticsearch7/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── config/
│       │   │   ├── elasticsearch.yml
│       │   │   └── log4j2.properties
│       │   └── start-elasticsearch
│       ├── zipkin-elasticsearch8/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   └── start-elasticsearch
│       ├── zipkin-eureka/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── pom.xml
│       │   ├── src/
│       │   │   └── main/
│       │   │       ├── java/
│       │   │       │   └── zipkin/
│       │   │       │       └── test/
│       │   │       │           ├── EurekaProperties.java
│       │   │       │           ├── EurekaSecurity.java
│       │   │       │           └── EurekaServer.java
│       │   │       └── resources/
│       │   │           └── application.yaml
│       │   └── start-eureka
│       ├── zipkin-kafka/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── install.sh
│       │   └── start-kafka-zookeeper
│       ├── zipkin-mysql/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── install.sh
│       │   └── start-mysql
│       ├── zipkin-opensearch2/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── config/
│       │   │   ├── log4j2.properties
│       │   │   └── opensearch.yml
│       │   └── start-opensearch
│       ├── zipkin-pulsar/
│       │   ├── Dockerfile
│       │   └── README.md
│       ├── zipkin-rabbitmq/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   └── config/
│       │       ├── defs.json
│       │       └── rabbitmq.conf
│       ├── zipkin-ui/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── nginx.conf
│       │   └── start-nginx
│       └── zipkin-uiproxy/
│           ├── Dockerfile
│           ├── README.md
│           ├── nginx.conf
│           └── start-nginx
├── mvnw
├── mvnw.cmd
├── pom.xml
├── src/
│   └── etc/
│       └── header.txt
├── zipkin/
│   ├── RATIONALE.md
│   ├── bnd.bnd
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── zipkin2/
│       │           ├── Annotation.java
│       │           ├── Call.java
│       │           ├── Callback.java
│       │           ├── CheckResult.java
│       │           ├── Component.java
│       │           ├── DependencyLink.java
│       │           ├── Endpoint.java
│       │           ├── Span.java
│       │           ├── SpanBytesDecoderDetector.java
│       │           ├── codec/
│       │           │   ├── BytesDecoder.java
│       │           │   ├── BytesEncoder.java
│       │           │   ├── DependencyLinkBytesDecoder.java
│       │           │   ├── DependencyLinkBytesEncoder.java
│       │           │   ├── Encoding.java
│       │           │   ├── SpanBytesDecoder.java
│       │           │   └── SpanBytesEncoder.java
│       │           ├── internal/
│       │           │   ├── AggregateCall.java
│       │           │   ├── ClosedComponentException.java
│       │           │   ├── DateUtil.java
│       │           │   ├── DelayLimiter.java
│       │           │   ├── Dependencies.java
│       │           │   ├── DependencyLinker.java
│       │           │   ├── FilterTraces.java
│       │           │   ├── HexCodec.java
│       │           │   ├── JsonCodec.java
│       │           │   ├── JsonEscaper.java
│       │           │   ├── Nullable.java
│       │           │   ├── Proto3Codec.java
│       │           │   ├── Proto3Fields.java
│       │           │   ├── Proto3SpanWriter.java
│       │           │   ├── Proto3ZipkinFields.java
│       │           │   ├── ReadBuffer.java
│       │           │   ├── RecyclableBuffers.java
│       │           │   ├── SpanNode.java
│       │           │   ├── ThriftCodec.java
│       │           │   ├── ThriftEndpointCodec.java
│       │           │   ├── ThriftField.java
│       │           │   ├── Trace.java
│       │           │   ├── TracesAdapter.java
│       │           │   ├── V1JsonSpanReader.java
│       │           │   ├── V1JsonSpanWriter.java
│       │           │   ├── V1SpanWriter.java
│       │           │   ├── V1ThriftSpanReader.java
│       │           │   ├── V1ThriftSpanWriter.java
│       │           │   ├── V2SpanReader.java
│       │           │   ├── V2SpanWriter.java
│       │           │   └── WriteBuffer.java
│       │           ├── storage/
│       │           │   ├── AutocompleteTags.java
│       │           │   ├── ForwardingStorageComponent.java
│       │           │   ├── GroupByTraceId.java
│       │           │   ├── InMemoryStorage.java
│       │           │   ├── QueryRequest.java
│       │           │   ├── ServiceAndSpanNames.java
│       │           │   ├── SpanConsumer.java
│       │           │   ├── SpanStore.java
│       │           │   ├── StorageComponent.java
│       │           │   ├── StrictTraceId.java
│       │           │   └── Traces.java
│       │           └── v1/
│       │               ├── V1Annotation.java
│       │               ├── V1BinaryAnnotation.java
│       │               ├── V1Span.java
│       │               ├── V1SpanConverter.java
│       │               └── V2SpanConverter.java
│       └── test/
│           ├── java/
│           │   └── zipkin2/
│           │       ├── AnnotationTest.java
│           │       ├── CallTest.java
│           │       ├── EndpointTest.java
│           │       ├── SpanBytesDecoderDetectorTest.java
│           │       ├── SpanTest.java
│           │       ├── TestObjects.java
│           │       ├── codec/
│           │       │   ├── EncodingTest.java
│           │       │   ├── KryoTest.java
│           │       │   ├── SpanBytesDecoderTest.java
│           │       │   ├── SpanBytesEncoderTest.java
│           │       │   └── V1SpanBytesDecoderTest.java
│           │       ├── internal/
│           │       │   ├── AggregateCallTest.java
│           │       │   ├── DateUtilTest.java
│           │       │   ├── DelayLimiterTest.java
│           │       │   ├── DependenciesTest.java
│           │       │   ├── DependencyLinkerTest.java
│           │       │   ├── FilterTracesTest.java
│           │       │   ├── HexCodecTest.java
│           │       │   ├── JsonCodecTest.java
│           │       │   ├── JsonEscaperTest.java
│           │       │   ├── Proto3FieldsTest.java
│           │       │   ├── Proto3SpanWriterTest.java
│           │       │   ├── Proto3ZipkinFieldsTest.java
│           │       │   ├── ReadBufferTest.java
│           │       │   ├── SpanNodeTest.java
│           │       │   ├── TraceTest.java
│           │       │   ├── TracesAdapterTest.java
│           │       │   ├── V1JsonSpanWriterTest.java
│           │       │   ├── V1ThriftSpanWriterTest.java
│           │       │   ├── V2SpanWriterTest.java
│           │       │   └── WriteBufferTest.java
│           │       ├── storage/
│           │       │   ├── ForwardingStorageComponentTest.java
│           │       │   ├── GroupByTraceIdTest.java
│           │       │   ├── InMemoryStorageTest.java
│           │       │   ├── QueryRequestTest.java
│           │       │   └── StrictTraceIdTest.java
│           │       └── v1/
│           │           ├── SpanConverterTest.java
│           │           ├── V1SpanConverterTest.java
│           │           └── V1SpanTest.java
│           └── resources/
│               └── log4j2.properties
├── zipkin-collector/
│   ├── README.md
│   ├── activemq/
│   │   ├── RATIONALE.md
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── collector/
│   │       │               └── activemq/
│   │       │                   ├── ActiveMQCollector.java
│   │       │                   ├── ActiveMQSpanConsumer.java
│   │       │                   └── LazyInit.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── collector/
│   │           │           └── activemq/
│   │           │               ├── ActiveMQExtension.java
│   │           │               └── ITActiveMQCollector.java
│   │           └── resources/
│   │               └── simplelogger.properties
│   ├── core/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── collector/
│   │       │               ├── Collector.java
│   │       │               ├── CollectorComponent.java
│   │       │               ├── CollectorMetrics.java
│   │       │               ├── CollectorSampler.java
│   │       │               └── InMemoryCollectorMetrics.java
│   │       └── test/
│   │           └── java/
│   │               └── zipkin2/
│   │                   └── collector/
│   │                       ├── CollectorSamplerTest.java
│   │                       └── CollectorTest.java
│   ├── kafka/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── collector/
│   │       │               └── kafka/
│   │       │                   ├── KafkaCollector.java
│   │       │                   └── KafkaCollectorWorker.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── collector/
│   │           │           └── kafka/
│   │           │               ├── ITKafkaCollector.java
│   │           │               └── KafkaExtension.java
│   │           └── resources/
│   │               └── simplelogger.properties
│   ├── pom.xml
│   ├── pulsar/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── collector/
│   │       │               └── pulsar/
│   │       │                   ├── LazyPulsarInit.java
│   │       │                   ├── PulsarCollector.java
│   │       │                   └── PulsarSpanConsumer.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── collector/
│   │           │           └── pulsar/
│   │           │               ├── ITPulsarCollector.java
│   │           │               └── PulsarExtension.java
│   │           └── resources/
│   │               └── simplelogger.properties
│   ├── rabbitmq/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── collector/
│   │       │               └── rabbitmq/
│   │       │                   └── RabbitMQCollector.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── collector/
│   │           │           └── rabbitmq/
│   │           │               ├── ITRabbitMQCollector.java
│   │           │               ├── RabbitMQCollectorTest.java
│   │           │               └── RabbitMQExtension.java
│   │           └── resources/
│   │               └── simplelogger.properties
│   └── scribe/
│       ├── README.md
│       ├── pom.xml
│       └── src/
│           ├── main/
│           │   └── java/
│           │       └── zipkin2/
│           │           └── collector/
│           │               └── scribe/
│           │                   ├── NettyScribeServer.java
│           │                   ├── ScribeCollector.java
│           │                   ├── ScribeInboundHandler.java
│           │                   ├── ScribeSpanConsumer.java
│           │                   └── generated/
│           │                       ├── LogEntry.java
│           │                       ├── ResultCode.java
│           │                       └── Scribe.java
│           └── test/
│               ├── java/
│               │   └── zipkin2/
│               │       └── collector/
│               │           └── scribe/
│               │               ├── ITScribeCollector.java
│               │               ├── ScribeCollectorTest.java
│               │               └── ScribeSpanConsumerTest.java
│               └── resources/
│                   └── simplelogger.properties
├── zipkin-junit5/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── zipkin2/
│       │           └── junit5/
│       │               ├── HttpFailure.java
│       │               ├── ZipkinDispatcher.java
│       │               └── ZipkinExtension.java
│       └── test/
│           ├── java/
│           │   └── zipkin2/
│           │       └── junit5/
│           │           └── ZipkinExtensionTest.java
│           └── resources/
│               └── simplelogger.properties
├── zipkin-lens/
│   ├── .eslintignore
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── .linguirc
│   ├── .npmrc
│   ├── .prettierrc.js
│   ├── README.md
│   ├── index.html
│   ├── javadoc/
│   │   └── README.md
│   ├── package.json
│   ├── pom.xml
│   ├── src/
│   │   ├── components/
│   │   │   ├── App/
│   │   │   │   ├── AlertSnackbar.tsx
│   │   │   │   ├── App.tsx
│   │   │   │   ├── HeaderMenuItem.tsx
│   │   │   │   ├── LanguageSelector.test.tsx
│   │   │   │   ├── LanguageSelector.tsx
│   │   │   │   ├── Layout.test.jsx
│   │   │   │   ├── Layout.tsx
│   │   │   │   ├── ThemeSelector.tsx
│   │   │   │   ├── TraceIdSearch.tsx
│   │   │   │   ├── TraceJsonUploader.tsx
│   │   │   │   ├── index.js
│   │   │   │   ├── slice.test.ts
│   │   │   │   └── slice.ts
│   │   │   ├── DependenciesPage/
│   │   │   │   ├── DependenciesGraph.test.jsx
│   │   │   │   ├── DependenciesGraph.tsx
│   │   │   │   ├── DependenciesPage.test.jsx
│   │   │   │   ├── DependenciesPage.tsx
│   │   │   │   ├── NodeDetailData.test.jsx
│   │   │   │   ├── NodeDetailData.tsx
│   │   │   │   ├── VizceralWrapper.tsx
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── DiscoverPage/
│   │   │   │   ├── Criterion.ts
│   │   │   │   ├── DiscoverPage.tsx
│   │   │   │   ├── DiscoverPageContent.test.jsx
│   │   │   │   ├── DiscoverPageContent.tsx
│   │   │   │   ├── LookbackMenu.test.jsx
│   │   │   │   ├── LookbackMenu.tsx
│   │   │   │   ├── SearchBar/
│   │   │   │   │   ├── CriterionBox.test.jsx
│   │   │   │   │   ├── CriterionBox.tsx
│   │   │   │   │   ├── HowToUse.tsx
│   │   │   │   │   ├── SearchBar.test.jsx
│   │   │   │   │   ├── SearchBar.tsx
│   │   │   │   │   ├── SuggestionList.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── TraceSummaryRow.test.jsx
│   │   │   │   ├── TraceSummaryRow.tsx
│   │   │   │   ├── TraceSummaryTable.tsx
│   │   │   │   ├── index.js
│   │   │   │   └── lookback.ts
│   │   │   ├── TracePage/
│   │   │   │   ├── AnnotationTable/
│   │   │   │   │   ├── AnnotationTable.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── AnnotationTooltip/
│   │   │   │   │   ├── AnnotationTooltip.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── Header/
│   │   │   │   │   ├── Header.tsx
│   │   │   │   │   ├── HeaderMenu.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── MiniTimeline/
│   │   │   │   │   ├── MiniTimeline.tsx
│   │   │   │   │   ├── MiniTimelineOverlay.tsx
│   │   │   │   │   ├── MiniTimelineRow.tsx
│   │   │   │   │   ├── TimeRangeSelector.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── SpanDetailDrawer/
│   │   │   │   │   ├── AnnotationViewer.tsx
│   │   │   │   │   ├── SpanDetailDrawer.tsx
│   │   │   │   │   ├── TagList.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── SpanTable/
│   │   │   │   │   ├── SpanTable.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── TickMarkers/
│   │   │   │   │   ├── TickMarkers.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── Timeline/
│   │   │   │   │   ├── Timeline.tsx
│   │   │   │   │   ├── TimelineHeader.tsx
│   │   │   │   │   ├── TimelineRow.tsx
│   │   │   │   │   ├── TimelineRowAnnotation.tsx
│   │   │   │   │   ├── TimelineRowBar.tsx
│   │   │   │   │   ├── TimelineRowEdges.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── TracePage.jsx
│   │   │   │   ├── TracePageContent.tsx
│   │   │   │   ├── helpers.test.jsx
│   │   │   │   ├── helpers.ts
│   │   │   │   ├── index.jsx
│   │   │   │   └── types.ts
│   │   │   ├── UiConfig/
│   │   │   │   ├── UiConfig.jsx
│   │   │   │   ├── UiConfig.test.jsx
│   │   │   │   ├── constants.js
│   │   │   │   └── index.js
│   │   │   └── common/
│   │   │       ├── ExplainBox.tsx
│   │   │       ├── LoadingIndicator.tsx
│   │   │       ├── ServiceBadge.jsx
│   │   │       └── ServiceBadge.test.jsx
│   │   ├── constants/
│   │   │   ├── api.test.tsx
│   │   │   ├── api.ts
│   │   │   └── color.ts
│   │   ├── index.css
│   │   ├── index.tsx
│   │   ├── models/
│   │   │   ├── AdjustedTrace.ts
│   │   │   ├── Annotation.ts
│   │   │   ├── Dependencies.ts
│   │   │   ├── Endpoint.ts
│   │   │   ├── Span.ts
│   │   │   └── TraceSummary.ts
│   │   ├── prop-types/
│   │   │   └── index.js
│   │   ├── reducers/
│   │   │   └── index.ts
│   │   ├── setupTests.ts
│   │   ├── slices/
│   │   │   ├── autocompleteKeysSlice.ts
│   │   │   ├── autocompleteValuesSlice.ts
│   │   │   ├── dependenciesSlice.ts
│   │   │   ├── remoteServicesSlice.ts
│   │   │   ├── servicesSlice.ts
│   │   │   ├── spansSlice.ts
│   │   │   ├── tracesSlice.test.ts
│   │   │   └── tracesSlice.ts
│   │   ├── store/
│   │   │   ├── configure-store.js
│   │   │   └── index.ts
│   │   ├── test/
│   │   │   ├── data/
│   │   │   │   ├── malformed.js
│   │   │   │   └── skew.js
│   │   │   └── util/
│   │   │       └── render-with-default-settings.tsx
│   │   ├── translations/
│   │   │   ├── en/
│   │   │   │   ├── messages.d.ts
│   │   │   │   └── translations.json
│   │   │   ├── es/
│   │   │   │   ├── messages.d.ts
│   │   │   │   └── translations.json
│   │   │   ├── fr/
│   │   │   │   ├── messages.d.ts
│   │   │   │   └── translations.json
│   │   │   ├── i18n.ts
│   │   │   └── zh-cn/
│   │   │       ├── messages.d.ts
│   │   │       └── translations.json
│   │   ├── types/
│   │   │   ├── redux-thunk.d.ts
│   │   │   ├── styled-components.d.ts
│   │   │   └── vizceral-react.d.ts
│   │   ├── util/
│   │   │   ├── fetch-resource.js
│   │   │   ├── fetch-resource.test.js
│   │   │   ├── theme.ts
│   │   │   ├── timestamp.js
│   │   │   ├── trace.js
│   │   │   └── trace.test.js
│   │   ├── vite-env.d.ts
│   │   └── zipkin/
│   │       ├── clock-skew.js
│   │       ├── clock-skew.test.js
│   │       ├── dependency-linker.js
│   │       ├── dependency-linker.test.js
│   │       ├── index.js
│   │       ├── span-cleaner.js
│   │       ├── span-cleaner.test.js
│   │       ├── span-node.js
│   │       ├── span-node.test.js
│   │       ├── span-row.js
│   │       ├── span-row.test.js
│   │       ├── trace-constants.js
│   │       ├── trace.js
│   │       └── trace.test.js
│   ├── testdata/
│   │   ├── README.md
│   │   ├── ascend.json
│   │   ├── envoy.json
│   │   ├── messaging-kafka.json
│   │   ├── messaging.json
│   │   ├── messaging2.json
│   │   ├── simple-db-p6.json
│   │   ├── skew.json
│   │   ├── smartthings-mobile-web-install.json
│   │   ├── smartthings-oauth-authorization.json
│   │   └── yelp.json
│   ├── tsconfig.json
│   └── vite.config.ts
├── zipkin-server/
│   ├── RATIONALE.md
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   ├── zipkin/
│       │   │   │   └── server/
│       │   │   │       └── ZipkinServer.java
│       │   │   └── zipkin2/
│       │   │       └── server/
│       │   │           └── internal/
│       │   │               ├── BodyIsExceptionMessage.java
│       │   │               ├── ConditionalOnSelfTracing.java
│       │   │               ├── ConditionalOnThrottledStorage.java
│       │   │               ├── EnableZipkinServer.java
│       │   │               ├── InternalZipkinConfiguration.java
│       │   │               ├── JsonUtil.java
│       │   │               ├── MicrometerCollectorMetrics.java
│       │   │               ├── WrappingExecutorService.java
│       │   │               ├── ZipkinActuatorImporter.java
│       │   │               ├── ZipkinConfiguration.java
│       │   │               ├── ZipkinGrpcCollector.java
│       │   │               ├── ZipkinHttpCollector.java
│       │   │               ├── ZipkinHttpConfiguration.java
│       │   │               ├── ZipkinModuleImporter.java
│       │   │               ├── ZipkinQueryApiV2.java
│       │   │               ├── activemq/
│       │   │               │   ├── ZipkinActiveMQCollectorConfiguration.java
│       │   │               │   └── ZipkinActiveMQCollectorProperties.java
│       │   │               ├── banner/
│       │   │               │   └── ZipkinBanner.java
│       │   │               ├── brave/
│       │   │               │   ├── SelfTracingProperties.java
│       │   │               │   ├── TracedCall.java
│       │   │               │   ├── TracingStorageComponent.java
│       │   │               │   └── ZipkinSelfTracingConfiguration.java
│       │   │               ├── cassandra3/
│       │   │               │   ├── ZipkinCassandra3StorageConfiguration.java
│       │   │               │   └── ZipkinCassandra3StorageProperties.java
│       │   │               ├── elasticsearch/
│       │   │               │   ├── BasicAuthInterceptor.java
│       │   │               │   ├── BasicCredentials.java
│       │   │               │   ├── DynamicCredentialsFileLoader.java
│       │   │               │   ├── HttpClientFactory.java
│       │   │               │   ├── InitialEndpointSupplier.java
│       │   │               │   ├── LazyHttpClientImpl.java
│       │   │               │   ├── SslUtil.java
│       │   │               │   ├── ZipkinElasticsearchStorageConfiguration.java
│       │   │               │   └── ZipkinElasticsearchStorageProperties.java
│       │   │               ├── eureka/
│       │   │               │   ├── ZipkinEurekaDiscoveryConfiguration.java
│       │   │               │   └── ZipkinEurekaDiscoveryProperties.java
│       │   │               ├── health/
│       │   │               │   ├── ComponentHealth.java
│       │   │               │   └── ZipkinHealthController.java
│       │   │               ├── kafka/
│       │   │               │   ├── ZipkinKafkaCollectorConfiguration.java
│       │   │               │   └── ZipkinKafkaCollectorProperties.java
│       │   │               ├── mysql/
│       │   │               │   ├── ZipkinMySQLStorageConfiguration.java
│       │   │               │   ├── ZipkinMySQLStorageProperties.java
│       │   │               │   └── ZipkinSelfTracingMySQLStorageConfiguration.java
│       │   │               ├── package-info.java
│       │   │               ├── prometheus/
│       │   │               │   ├── ZipkinMetricsController.java
│       │   │               │   └── ZipkinPrometheusMetricsConfiguration.java
│       │   │               ├── pulsar/
│       │   │               │   ├── ZipkinPulsarCollectorConfiguration.java
│       │   │               │   └── ZipkinPulsarCollectorProperties.java
│       │   │               ├── rabbitmq/
│       │   │               │   ├── ZipkinRabbitMQCollectorConfiguration.java
│       │   │               │   └── ZipkinRabbitMQCollectorProperties.java
│       │   │               ├── scribe/
│       │   │               │   └── ZipkinScribeCollectorConfiguration.java
│       │   │               ├── throttle/
│       │   │               │   ├── LimiterMetrics.java
│       │   │               │   ├── MicrometerThrottleMetrics.java
│       │   │               │   ├── ThrottledCall.java
│       │   │               │   ├── ThrottledStorageComponent.java
│       │   │               │   └── ZipkinStorageThrottleProperties.java
│       │   │               └── ui/
│       │   │                   ├── CompressionProperties.java
│       │   │                   ├── ZipkinUiConfiguration.java
│       │   │                   └── ZipkinUiProperties.java
│       │   └── resources/
│       │       ├── info.json
│       │       ├── simplelogger.properties
│       │       ├── zipkin-server-shared.yml
│       │       ├── zipkin-server.yml
│       │       └── zipkin.txt
│       └── test/
│           ├── java/
│           │   └── zipkin2/
│           │       ├── collector/
│           │       │   ├── activemq/
│           │       │   │   └── ZipkinActiveMQCollectorPropertiesOverrideTest.java
│           │       │   ├── kafka/
│           │       │   │   └── ZipkinKafkaCollectorPropertiesOverrideTest.java
│           │       │   ├── pulsar/
│           │       │   │   └── ZipkinPulsarCollectorPropertiesOverrideTest.java
│           │       │   ├── rabbitmq/
│           │       │   │   └── ZipkinRabbitMQCollectorPropertiesOverrideTest.java
│           │       │   └── scribe/
│           │       │       └── ZipkinScribeCollectorConfigurationTest.java
│           │       ├── server/
│           │       │   └── internal/
│           │       │       ├── ITActuatorMappings.java
│           │       │       ├── ITZipkinGrpcCollector.java
│           │       │       ├── ITZipkinServer.java
│           │       │       ├── ITZipkinServerAutocomplete.java
│           │       │       ├── ITZipkinServerCORS.java
│           │       │       ├── ITZipkinServerHttpCollectorDisabled.java
│           │       │       ├── ITZipkinServerQueryDisabled.java
│           │       │       ├── ITZipkinServerSsl.java
│           │       │       ├── ITZipkinServerTimeout.java
│           │       │       ├── InMemoryConfiguration.java
│           │       │       ├── NoOpMeterRegistryConfiguration.java
│           │       │       ├── ZipkinActuatorImporterTest.java
│           │       │       ├── ZipkinHttpConfigurationTest.java
│           │       │       ├── ZipkinModuleImporterTest.java
│           │       │       ├── activemq/
│           │       │       │   ├── Access.java
│           │       │       │   ├── ZipkinActiveMQCollectorConfigurationTest.java
│           │       │       │   └── ZipkinActiveMQCollectorPropertiesTest.java
│           │       │       ├── banner/
│           │       │       │   └── ZipkinBannerTest.java
│           │       │       ├── brave/
│           │       │       │   └── ITZipkinSelfTracing.java
│           │       │       ├── cassandra3/
│           │       │       │   └── Access.java
│           │       │       ├── elasticsearch/
│           │       │       │   ├── Access.java
│           │       │       │   ├── ITElasticsearchAuth.java
│           │       │       │   ├── ITElasticsearchClientInitialization.java
│           │       │       │   ├── ITElasticsearchDynamicCredentials.java
│           │       │       │   ├── ITElasticsearchHealthCheck.java
│           │       │       │   ├── ITElasticsearchNoVerify.java
│           │       │       │   ├── ITElasticsearchSelfTracing.java
│           │       │       │   ├── InitialEndpointSupplierTest.java
│           │       │       │   ├── TestResponses.java
│           │       │       │   └── ZipkinElasticsearchStorageConfigurationTest.java
│           │       │       ├── eureka/
│           │       │       │   ├── BaseITZipkinEureka.java
│           │       │       │   ├── ITZipkinEureka.java
│           │       │       │   ├── ITZipkinEurekaAuthenticated.java
│           │       │       │   ├── ZipkinEurekaDiscoveryConfigurationTest.java
│           │       │       │   └── ZipkinEurekaDiscoveryPropertiesTest.java
│           │       │       ├── health/
│           │       │       │   ├── ComponentHealthTest.java
│           │       │       │   ├── ITZipkinHealth.java
│           │       │       │   ├── ITZipkinHealthDown.java
│           │       │       │   └── ZipkinHealthControllerTest.java
│           │       │       ├── kafka/
│           │       │       │   ├── Access.java
│           │       │       │   ├── ZipkinKafkaCollectorConfigurationTest.java
│           │       │       │   └── ZipkinKafkaCollectorPropertiesTest.java
│           │       │       ├── mysql/
│           │       │       │   └── Access.java
│           │       │       ├── prometheus/
│           │       │       │   ├── ITZipkinMetrics.java
│           │       │       │   ├── ITZipkinMetricsDirty.java
│           │       │       │   └── ZipkinPrometheusMetricsConfigurationTest.java
│           │       │       ├── pulsar/
│           │       │       │   ├── Access.java
│           │       │       │   ├── ZipkinPulsarCollectorConfigurationTest.java
│           │       │       │   └── ZipkinPulsarCollectorPropertiesTest.java
│           │       │       ├── rabbitmq/
│           │       │       │   ├── Access.java
│           │       │       │   ├── ZipkinRabbitMQCollectorConfigurationTest.java
│           │       │       │   └── ZipkinRabbitMQCollectorPropertiesTest.java
│           │       │       ├── throttle/
│           │       │       │   ├── FakeCall.java
│           │       │       │   ├── ThrottledCallTest.java
│           │       │       │   └── ThrottledStorageComponentTest.java
│           │       │       └── ui/
│           │       │           ├── ITZipkinUiConfiguration.java
│           │       │           └── ZipkinUiConfigurationTest.java
│           │       └── storage/
│           │           ├── cassandra/
│           │           │   └── ZipkinCassandraStorageAutoConfigurationTest.java
│           │           └── mysql/
│           │               └── v1/
│           │                   └── ZipkinMySQLStorageConfigurationTest.java
│           └── resources/
│               ├── application.yml
│               ├── banner.txt
│               ├── es-credentials
│               ├── es-credentials-invalid
│               ├── keystore.jks
│               ├── keystore.p12
│               ├── log4j2.properties
│               ├── simplelogger.properties
│               └── zipkin-lens/
│                   ├── index.html
│                   └── test.txt
├── zipkin-storage/
│   ├── README.md
│   ├── cassandra/
│   │   ├── RATIONALE.md
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── zipkin2/
│   │       │   │       └── storage/
│   │       │   │           └── cassandra/
│   │       │   │               ├── AnnotationCodec.java
│   │       │   │               ├── CassandraAutocompleteTags.java
│   │       │   │               ├── CassandraSpanConsumer.java
│   │       │   │               ├── CassandraSpanStore.java
│   │       │   │               ├── CassandraStorage.java
│   │       │   │               ├── CassandraStorageBuilder.java
│   │       │   │               ├── CassandraUtil.java
│   │       │   │               ├── DefaultSessionFactory.java
│   │       │   │               ├── EndpointCodec.java
│   │       │   │               ├── InsertSpan.java
│   │       │   │               ├── InsertTraceByServiceRemoteService.java
│   │       │   │               ├── InsertTraceByServiceSpan.java
│   │       │   │               ├── LazySession.java
│   │       │   │               ├── Schema.java
│   │       │   │               ├── SelectAutocompleteValues.java
│   │       │   │               ├── SelectDependencies.java
│   │       │   │               ├── SelectFromSpan.java
│   │       │   │               ├── SelectRemoteServiceNames.java
│   │       │   │               ├── SelectServiceNames.java
│   │       │   │               ├── SelectSpanNames.java
│   │       │   │               ├── SelectTraceIdsFromServiceRemoteService.java
│   │       │   │               ├── SelectTraceIdsFromServiceSpan.java
│   │       │   │               ├── SelectTraceIdsFromSpan.java
│   │       │   │               └── internal/
│   │       │   │                   ├── HostAndPort.java
│   │       │   │                   ├── KeyspaceMetadataUtil.java
│   │       │   │                   ├── Resources.java
│   │       │   │                   ├── SessionBuilder.java
│   │       │   │                   └── call/
│   │       │   │                       ├── AccumulateAllResults.java
│   │       │   │                       ├── AccumulateTraceIdTsUuid.java
│   │       │   │                       ├── AggregateIntoMap.java
│   │       │   │                       ├── DeduplicatingInsert.java
│   │       │   │                       ├── DistinctSortedStrings.java
│   │       │   │                       ├── InsertEntry.java
│   │       │   │                       ├── IntersectKeySets.java
│   │       │   │                       ├── IntersectMaps.java
│   │       │   │                       └── ResultSetFutureCall.java
│   │       │   └── resources/
│   │       │       ├── zipkin2-schema-indexes.cql
│   │       │       ├── zipkin2-schema-upgrade-1.cql
│   │       │       ├── zipkin2-schema-upgrade-2.cql
│   │       │       └── zipkin2-schema.cql
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── storage/
│   │           │           └── cassandra/
│   │           │               ├── CassandraContainer.java
│   │           │               ├── CassandraSpanConsumerTest.java
│   │           │               ├── CassandraSpanStoreTest.java
│   │           │               ├── CassandraStorageBuilderTest.java
│   │           │               ├── CassandraStorageTest.java
│   │           │               ├── CassandraUtilTest.java
│   │           │               ├── ITCassandraStorage.java
│   │           │               ├── ITCassandraStorageHeavy.java
│   │           │               ├── ITEnsureSchema.java
│   │           │               ├── ITSpanConsumer.java
│   │           │               ├── InternalForTests.java
│   │           │               ├── SchemaTest.java
│   │           │               └── internal/
│   │           │                   ├── HostAndPortTest.java
│   │           │                   ├── SessionBuilderTest.java
│   │           │                   └── call/
│   │           │                       ├── DeduplicatingInsertTest.java
│   │           │                       └── ResultSetFutureCallTest.java
│   │           └── resources/
│   │               ├── autocomplete_tags-stress.yaml
│   │               ├── remote_service_by_service-stress.yaml
│   │               ├── simplelogger.properties
│   │               ├── span-stress.yaml
│   │               ├── span_by_service-stress.yaml
│   │               ├── trace_by_service_remote_service-stress.yaml
│   │               ├── trace_by_service_span-stress.yaml
│   │               ├── zipkin2-schema-indexes-original.cql
│   │               └── zipkin2-test-schema.cql
│   ├── elasticsearch/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── elasticsearch/
│   │       │               ├── BaseVersion.java
│   │       │               ├── BodyConverters.java
│   │       │               ├── ElasticsearchAutocompleteTags.java
│   │       │               ├── ElasticsearchSpanConsumer.java
│   │       │               ├── ElasticsearchSpanStore.java
│   │       │               ├── ElasticsearchSpecificTemplates.java
│   │       │               ├── ElasticsearchStorage.java
│   │       │               ├── ElasticsearchVersion.java
│   │       │               ├── EnsureIndexTemplate.java
│   │       │               ├── IndexTemplates.java
│   │       │               ├── OpensearchSpecificTemplates.java
│   │       │               ├── OpensearchVersion.java
│   │       │               ├── VersionSpecificTemplates.java
│   │       │               └── internal/
│   │       │                   ├── BulkCallBuilder.java
│   │       │                   ├── BulkIndexWriter.java
│   │       │                   ├── IndexNameFormatter.java
│   │       │                   ├── Internal.java
│   │       │                   ├── JsonReaders.java
│   │       │                   ├── JsonSerializers.java
│   │       │                   └── client/
│   │       │                       ├── Aggregation.java
│   │       │                       ├── HttpCall.java
│   │       │                       ├── SearchCallFactory.java
│   │       │                       ├── SearchRequest.java
│   │       │                       └── SearchResultConverter.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── elasticsearch/
│   │           │           ├── BaseVersionTest.java
│   │           │           ├── ElasticsearchAutocompleteTagsTest.java
│   │           │           ├── ElasticsearchSpanConsumerTest.java
│   │           │           ├── ElasticsearchSpanStoreTest.java
│   │           │           ├── ElasticsearchSpecificTemplatesTest.java
│   │           │           ├── ElasticsearchStorageTest.java
│   │           │           ├── ElasticsearchVersionTest.java
│   │           │           ├── InternalForTests.java
│   │           │           ├── JsonReadersTest.java
│   │           │           ├── JsonSerializersTest.java
│   │           │           ├── OpensearchSpecificTemplatesTest.java
│   │           │           ├── OpensearchVersionTest.java
│   │           │           ├── SearchResultConverterTest.java
│   │           │           ├── TestResponses.java
│   │           │           ├── integration/
│   │           │           │   ├── ElasticsearchBaseExtension.java
│   │           │           │   ├── ElasticsearchExtension.java
│   │           │           │   ├── ITElasticsearchStorage.java
│   │           │           │   ├── ITElasticsearchStorageV7.java
│   │           │           │   ├── ITElasticsearchStorageV8.java
│   │           │           │   ├── ITEnsureIndexTemplate.java
│   │           │           │   ├── ITOpenSearchStorageV2.java
│   │           │           │   ├── IgnoredDeprecationWarnings.java
│   │           │           │   └── OpenSearchExtension.java
│   │           │           └── internal/
│   │           │               ├── BulkCallBuilderTest.java
│   │           │               ├── BulkIndexWriterTest.java
│   │           │               ├── IndexNameFormatterTest.java
│   │           │               └── client/
│   │           │                   ├── HttpCallTest.java
│   │           │                   ├── SearchCallFactoryTest.java
│   │           │                   └── SearchRequestTest.java
│   │           └── resources/
│   │               └── simplelogger.properties
│   ├── mysql-v1/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── zipkin2/
│   │       │   │       └── storage/
│   │       │   │           └── mysql/
│   │       │   │               └── v1/
│   │       │   │                   ├── AggregateDependencies.java
│   │       │   │                   ├── DSLContexts.java
│   │       │   │                   ├── DataSourceCall.java
│   │       │   │                   ├── DependencyLinkV2SpanIterator.java
│   │       │   │                   ├── HasErrorCount.java
│   │       │   │                   ├── HasIpv6.java
│   │       │   │                   ├── HasPreAggregatedDependencies.java
│   │       │   │                   ├── HasRemoteServiceName.java
│   │       │   │                   ├── HasTraceIdHigh.java
│   │       │   │                   ├── MySQLAutocompleteTags.java
│   │       │   │                   ├── MySQLSpanConsumer.java
│   │       │   │                   ├── MySQLSpanStore.java
│   │       │   │                   ├── MySQLStorage.java
│   │       │   │                   ├── Pair.java
│   │       │   │                   ├── PeekingIterator.java
│   │       │   │                   ├── Schema.java
│   │       │   │                   ├── SelectAnnotationServiceNames.java
│   │       │   │                   ├── SelectAutocompleteValues.java
│   │       │   │                   ├── SelectDependencies.java
│   │       │   │                   ├── SelectRemoteServiceNames.java
│   │       │   │                   ├── SelectSpanNames.java
│   │       │   │                   ├── SelectSpansAndAnnotations.java
│   │       │   │                   └── internal/
│   │       │   │                       └── generated/
│   │       │   │                           ├── DefaultCatalog.java
│   │       │   │                           ├── Indexes.java
│   │       │   │                           ├── Keys.java
│   │       │   │                           ├── Tables.java
│   │       │   │                           ├── Zipkin.java
│   │       │   │                           └── tables/
│   │       │   │                               ├── ZipkinAnnotations.java
│   │       │   │                               ├── ZipkinDependencies.java
│   │       │   │                               └── ZipkinSpans.java
│   │       │   └── resources/
│   │       │       └── mysql.sql
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── storage/
│   │           │           └── mysql/
│   │           │               └── v1/
│   │           │                   ├── DependencyLinkV2SpanIteratorTest.java
│   │           │                   ├── ITMySQLStorage.java
│   │           │                   ├── MySQLExtension.java
│   │           │                   ├── MySQLStorageTest.java
│   │           │                   ├── SchemaTest.java
│   │           │                   └── SelectSpansAndAnnotationsTest.java
│   │           └── resources/
│   │               ├── drop_zipkin_tables.sql
│   │               └── simplelogger.properties
│   └── pom.xml
└── zipkin-tests/
    ├── pom.xml
    └── src/
        ├── main/
        │   └── java/
        │       └── zipkin2/
        │           ├── TestObjects.java
        │           └── storage/
        │               ├── ITAutocompleteTags.java
        │               ├── ITDependencies.java
        │               ├── ITDependenciesHeavy.java
        │               ├── ITSearchEnabledFalse.java
        │               ├── ITServiceAndSpanNames.java
        │               ├── ITSpanStore.java
        │               ├── ITSpanStoreHeavy.java
        │               ├── ITStorage.java
        │               ├── ITStrictTraceIdFalse.java
        │               └── ITTraces.java
        └── test/
            └── java/
                └── zipkin2/
                    └── storage/
                        └── ITInMemoryStorage.java

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
# https://docs.docker.com/engine/reference/builder/#dockerignore-file
**

# Scripts that run within Docker
!build-bin/maybe_install_npm
!build-bin/maven/maven_build
!build-bin/maven/maven_build_or_unjar
!build-bin/maven/maven_opts
!build-bin/maven/maven_unjar
!build-bin/docker/docker-healthcheck

!docker/start-zipkin
!/zipkin-server/target/zipkin-server-*exec.jar
!/zipkin-server/target/zipkin-server-*slim.jar

!docker/test-images/zipkin-activemq/start-activemq

!docker/test-images/zipkin-cassandra/install.sh
!docker/test-images/zipkin-cassandra/start-cassandra
!zipkin-storage/cassandra/src/main/resources/*.cql

!docker/test-images/zipkin-elasticsearch7/config/
!docker/test-images/zipkin-elasticsearch7/start-elasticsearch
!docker/test-images/zipkin-elasticsearch8/config/
!docker/test-images/zipkin-elasticsearch8/start-elasticsearch

!docker/test-images/zipkin-opensearch2/config/
!docker/test-images/zipkin-opensearch2/start-opensearch

!docker/test-images/zipkin-eureka/src/
!docker/test-images/zipkin-eureka/pom.xml
!docker/test-images/zipkin-eureka/start-eureka

!docker/test-images/zipkin-kafka/install.sh
!docker/test-images/zipkin-kafka/start-kafka-zookeeper

!docker/test-images/zipkin-mysql/install.sh
!docker/test-images/zipkin-mysql/start-mysql
!zipkin-storage/mysql-v1/src/main/resources/mysql.sql

!docker/test-images/zipkin-rabbitmq/config/

!docker/test-images/zipkin-ui/nginx.conf
!docker/test-images/zipkin-ui/start-nginx
!zipkin-lens/target/zipkin-lens-*.jar

!docker/test-images/zipkin-uiproxy/nginx.conf
!docker/test-images/zipkin-uiproxy/start-nginx

# Allow on-demand "mvn package". <modules> referenced in pom.xml must be added even if not built
!zipkin/src/main/**
!zipkin-collector/src/main/**
!zipkin-collector/core/src/main/**
!zipkin-collector/activemq/src/main/**
!zipkin-collector/kafka/src/main/**
!zipkin-collector/rabbitmq/src/main/**
!zipkin-collector/scribe/src/main/**
!zipkin-collector/pulsar/src/main/**
!zipkin-junit5/src/main/**
!zipkin-storage/src/main/**
!zipkin-storage/cassandra/src/main/**
!zipkin-storage/mysql-v1/src/main/**
!zipkin-storage/elasticsearch/src/main/**
!zipkin-server/src/main/**
!zipkin-tests/src/main/**
!zipkin-lens/javadoc/**
!zipkin-lens/public/**
!zipkin-lens/src/**
!zipkin-lens/.linguirc
!zipkin-lens/.npmrc
!zipkin-lens/index.html
!zipkin-lens/package-lock.json
!zipkin-lens/package.json
!zipkin-lens/pom.xml
!zipkin-lens/tsconfig.json
!zipkin-lens/vite.config.ts
!**/pom.xml


================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true


================================================
FILE: .gitattributes
================================================
*.java text=auto eol=lf
*.bnd text=auto eol=lf

*.sh text=auto eol=lf
.*_profile text=auto eol=lf

*.md text=auto eol=lf
*.txt text=auto eol=lf

*.yml text=auto eol=lf
*.yaml text=auto eol=lf
*.xml text=auto eol=lf
*.properties text=auto eol=lf

*.js text=auto eol=lf
*.jsx text=auto eol=lf
*.ts text=auto eol=lf
*.tsx text=auto eol=lf
*.json text=auto eol=lf
*.mustache text=auto eol=lf
*.css text=auto eol=lf


================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contributing to Zipkin

If you would like to contribute code, fork this GitHub repository and
send a pull request (on a branch other than `master` or `gh-pages`).

When submitting code, please apply [Square Code Style](https://github.com/square/java-code-styles).
* If the settings import correctly, CodeStyle/Java will be named Square and use 2 space tab and indent, with 4 space continuation indent.

## License

By contributing your code, you agree to license your contribution under
the terms of the [APLv2](../LICENSE).

All files are released with the Apache 2.0 license.

If you are adding a new file it should have a header like below. This
can be automatically added by running `./mvnw com.mycila:license-maven-plugin:format`.

```
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
 ```


================================================
FILE: .github/ISSUE_TEMPLATE/bug.md
================================================
---
name: Bug
about: If you’ve found a bug, spend the time to write a failing test. Bugs with tests get fixed and stay fixed. If you have a solution in mind, skip raising an issue and open a pull request instead.
labels: bug
---
## Describe the Bug
A clear and concise description of what the bug is. If you have a solution in mind, skip raising an issue and open a pull request instead.

If this is a UI issue...
  * Attach a screen shot or animated gif showing what you think is wrong
  * Include JSON of a trace that produces it, being careful to not include private data
    * You can literally include the JSON in [triple-backticks](https://help.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax#quoting-code)
    * Otherwise, you can use a [gist](https://gist.github.com/) or pastebin

Regardless, the best is to spend some time to write a failing test. Bugs with tests get fixed and stay fixed.

## Steps to Reproduce
Steps to reproduce the behavior:

## Expected Behaviour
Suggest what you think correct behaviour should be. Note, it may be solved differently depending on the problem.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Question
    url: https://gitter.im/openzipkin/zipkin
    about: Please ask questions about how to do something or to understand why something isn't working on our Gitter chat - we'll be happy to respond there in detail. This issue tracker is not for questions.


================================================
FILE: .github/ISSUE_TEMPLATE/feature.md
================================================
---
name: Feature Request
about: Please first, look at existing issues to see if the feature has been requested before.
labels: enhancement
---
Please first, look at [existing issues](https://github.com/openzipkin/zipkin/issues) to see if the feature has been requested before. If you don't find anything tell us what problem you’re trying to solve. Often a solution already exists! Don’t send pull requests to implement new features without first getting our support. Sometimes we leave features out on purpose to keep the project small.

## Feature
Description of the feature

## Rationale
Why would this feature help others besides me?

## Example Scenario
What kind of use cases would benefit from this feature?

## Prior Art
* Links to prior art
* More links


================================================
FILE: .github/workflows/create_release.yml
================================================
---
name: create_release

# We create a release version on a trigger tag, regardless of if the commit is
# documentation-only.
on:  # yamllint disable-line rule:truthy
  push:
    tags:  # e.g. release-1.2.3
      - 'release-[0-9]+.[0-9]+.[0-9]+**'

jobs:
  create_release:
    runs-on: ubuntu-24.04  # newest available distribution, aka noble
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
        with:
          # Prevent use of implicit GitHub Actions read-only GITHUB_TOKEN
          # because maven-release-plugin pushes commits to master.
          token: ${{ secrets.GH_TOKEN }}
      - name: Setup java
        uses: actions/setup-java@v4
        with:
          distribution: 'zulu'  # zulu as it supports a wide version range
          java-version: '17'  # earliest LTS supported by Spring Boot 3
      - name: Cache local Maven repository
        uses: actions/cache@v4
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-jdk-17-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-jdk-17-maven-
      - name: Create Release
        env:
          # GH_USER=<user that created GH_TOKEN>
          GH_USER: ${{ secrets.GH_USER }}
          # GH_TOKEN=<hex token value>
          # * makes release commits and tags
          # * needs repo:status, public_repo
          # * referenced in .settings.xml
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
        run: |  # GITHUB_REF will be refs/tags/release-MAJOR.MINOR.PATCH
          build-bin/git/login_git &&
          build-bin/maven/maven_release $(echo ${GITHUB_REF} | cut -d/ -f 3)


================================================
FILE: .github/workflows/deploy.yml
================================================
# yamllint --format github .github/workflows/deploy.yml
---
name: deploy

# We deploy on master and release versions, regardless of if the commit is
# documentation-only or not.
on:  # yamllint disable-line rule:truthy
  push:
    branches:
      - master
    # Don't deploy tags because the same commit for MAJOR.MINOR.PATCH is also
    # on master: Redundant deployment of a release version will fail uploading.
    tags-ignore:
      - '*'

jobs:
  deploy:
    runs-on: ubuntu-24.04  # newest available distribution, aka noble
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
        with:
          # Prevent use of implicit GitHub Actions read-only GITHUB_TOKEN
          # because javadoc_to_gh_pages pushes commits to the gh-pages branch.
          token: ${{ secrets.GH_TOKEN }}
          # Allow build-bin/javadoc_to_gh_pages to fetch and push gh-pages
          # See https://github.com/actions/checkout/issues/578
          fetch-depth: 0
      - name: Setup java
        uses: actions/setup-java@v4
        with:
          distribution: 'zulu'  # zulu as it supports a wide version range
          java-version: '17'  # earliest LTS supported by Spring Boot 3
      - name: Cache local Maven repository
        uses: actions/cache@v4
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-jdk-17-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-jdk-17-maven-
      - name: Cache NPM Packages
        uses: actions/cache@v4
        with:
          path: ~/.npm
          # yamllint disable-line rule:line-length
          key: ${{ runner.os }}-npm-packages-${{ hashFiles('zipkin-lens/package-lock.json') }}
      # Don't attempt to cache Docker. Sensitive information can be stolen
      # via forks, and login session ends up in ~/.docker. This is ok because
      # we publish DOCKER_PARENT_IMAGE to ghcr.io, hence local to the runner.
      - name: Deploy
        env:
          # GH_USER=<user that created GH_TOKEN>
          GH_USER: ${{ secrets.GH_USER }}
          # GH_TOKEN=<hex token value>
          # * pushes gh-pages during build-bin/javadoc_to_gh_pages
          # * pushes Docker images to ghcr.io
          # * create via https://github.com/settings/tokens
          # * needs repo:status, public_repo, write:packages, delete:packages
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
          GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }}
          # GPG_PASSPHRASE=<passphrase for GPG_SIGNING_KEY>
          # * referenced in .settings.xml
          GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
          # SONATYPE_USER=<sonatype account token>
          # * deploys snapshots and releases to Sonatype
          # * needs access to io.zipkin via OSSRH-16669
          # * generate via https://oss.sonatype.org/#profile;User%20Token
          # * referenced in .settings.xml
          SONATYPE_USER: ${{ secrets.SONATYPE_USER }}
          # SONATYPE_PASSWORD=<password to sonatype account token>
          #  * referenced in .settings.xml
          SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
          # DOCKERHUB_USER=<typically dockerzipkindeployer>
          #  * only push repos in openzipkin org to Docker Hub on release
          DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
          # DOCKERHUB_TOKEN=<access token for DOCKERHUB_USER>
          #  * Access Token from here https://hub.docker.com/settings/security
          DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
        run: |  # GITHUB_REF = refs/heads/master or refs/tags/MAJOR.MINOR.PATCH
          build-bin/configure_deploy &&
          build-bin/deploy $(echo ${GITHUB_REF} | cut -d/ -f 3)


================================================
FILE: .github/workflows/docker_push.yml
================================================
---
name: docker_push

# We re-push docker on a trigger tag, regardless of if the commit is
# documentation-only.
on:  # yamllint disable-line rule:truthy
  push:
    tags:  # e.g. docker-1.2.3
      - 'docker-[0-9]+.[0-9]+.[0-9]+**'

jobs:
  docker_push:
    runs-on: ubuntu-24.04  # newest available distribution, aka noble
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
      # Don't attempt to cache Docker. Sensitive information can be stolen
      # via forks, and login session ends up in ~/.docker. This is ok because
      # we publish DOCKER_PARENT_IMAGE to ghcr.io, hence local to the runner.
      - name: Docker Push
        run: |  # GITHUB_REF = refs/tags/docker-MAJOR.MINOR.PATCH
          build-bin/git/login_git &&
          build-bin/docker/configure_docker_push &&
          build-bin/docker_push $(echo ${GITHUB_REF} | cut -d/ -f 3)
        env:
          # GH_USER=<user that created GH_TOKEN>
          GH_USER: ${{ secrets.GH_USER }}
          # GH_TOKEN=<hex token value>
          # * pushes Docker images to ghcr.io
          # * create via https://github.com/settings/tokens
          # * needs repo:status, public_repo, write:packages, delete:packages
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
          # DOCKERHUB_USER=<typically dockerzipkindeployer>
          #  * only push repos in openzipkin org to Docker Hub on release
          DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
          # DOCKERHUB_TOKEN=<access token for DOCKERHUB_USER>
          #  * Access Token from here https://hub.docker.com/settings/security
          DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}


================================================
FILE: .github/workflows/lint.yml
================================================
---
name: lint

on:  # yamllint disable-line rule:truthy
  push:  # non-tagged pushes to master
    branches:
      - master
    tags-ignore:
      - '*'
    paths:
      - '**/*.md'
      - '.github/workflows/*.yml'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json
  pull_request:  # pull requests targeted at the master branch.
    branches:
      - master
    paths:
      - '**/*.md'
      - '.github/workflows/*.yml'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json

jobs:
  lint:
    name: lint
    runs-on: ubuntu-24.04  # newest available distribution, aka noble
    # skip commits made by the release plugin
    if: "!contains(github.event.head_commit.message, 'maven-release-plugin')"
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
      - name: Lint
        run: |
          build-bin/configure_lint
          build-bin/lint


================================================
FILE: .github/workflows/security.yml
================================================
---
name: security

# We don't scan documentation-only commits.
on:  # yamllint disable-line rule:truthy
  push:  # non-tagged pushes to master
    branches:
      - master
    tags-ignore:
      - '*'
    paths-ignore:
      - '**/*.md'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json
  pull_request:  # pull requests targeted at the master branch.
    branches:
      - master
    paths-ignore:
      - '**/*.md'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json

jobs:
  security:
    name: security
    runs-on: ubuntu-24.04  # newest available distribution, aka numbat
    # skip commits made by the release plugin
    if: "!contains(github.event.head_commit.message, 'maven-release-plugin')"
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
      - uses: actions/cache@v4
        name: Cache Trivy Database
        with:
          path: .trivy
          key: ${{ runner.os }}-trivy
          restore-keys: ${{ runner.os }}-trivy
      - name: Run Trivy vulnerability and secret scanner
        uses: aquasecurity/trivy-action@master
        id: trivy
        env:  # See https://github.com/aquasecurity/trivy/discussions/7668
          TRIVY_DB_REPOSITORY: public.ecr.aws/aquasecurity/trivy-db
          TRIVY_JAVA_DB_REPOSITORY: public.ecr.aws/aquasecurity/trivy-java-db
        with:
          scan-type: 'fs'
          scan-ref: '.'  # scan the entire repository
          scanners: vuln,secret
          exit-code: '1'
          severity: HIGH,CRITICAL
          output: trivy-report.md
          cache-dir: .trivy
      - name: Set Summary
        shell: bash
        if: ${{ failure() && steps.trivy.conclusion == 'failure' }}
        # Add the Trivy report to the summary
        #
        # Note: This will cause a workflow error if trivy-report.md > the step
        # limit 1MiB. If this was due to too many CVEs, consider fixing them ;)
        run: cat trivy-report.md >> $GITHUB_STEP_SUMMARY


================================================
FILE: .github/workflows/test.yml
================================================
---
name: test

# We don't test documentation-only commits.
on:  # yamllint disable-line rule:truthy
  push:  # non-tagged pushes to master
    branches:
      - master
    tags-ignore:
      - '*'
    paths-ignore:
      - '**/*.md'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json
  pull_request:  # pull requests targeted at the master branch.
    branches:
      - master
    paths-ignore:
      - '**/*.md'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json

jobs:
  test:
    name: test (JDK ${{ matrix.java_version }})
    runs-on: ubuntu-24.04  # newest available distribution, aka noble
    # skip commits made by the release plugin
    if: "!contains(github.event.head_commit.message, 'maven-release-plugin')"
    strategy:
      fail-fast: false  # don't fail fast as some failures are LTS specific
      matrix:  # match with maven-enforcer-plugin rules in pom.xml
        include:
          - java_version: 17  # earliest LTS supported by Spring Boot 3
            maven_args: -Prelease -Dgpg.skip
          - java_version: 21  # Most recent LTS
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
      - name: Setup java
        uses: actions/setup-java@v4
        with:
          distribution: 'zulu'  # zulu as it supports a wide version range
          java-version: ${{ matrix.java_version }}
      - name: Cache local Maven repository
        uses: actions/cache@v4
        with:
          path: ~/.m2/repository
          # yamllint disable-line rule:line-length
          key: ${{ runner.os }}-jdk-${{ matrix.java_version }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-jdk-${{ matrix.java_version }}-maven-
      - name: Cache NPM Packages
        uses: actions/cache@v4
        with:
          path: ~/.npm
          # yamllint disable-line rule:line-length
          key: ${{ runner.os }}-npm-packages-${{ hashFiles('zipkin-lens/package-lock.json') }}
      - name: Test without Docker
        run: |
          build-bin/maven_go_offline &&
          build-bin/test -DexcludedGroups=docker ${{ matrix.maven_args }}

  test_docker:
    runs-on: ubuntu-24.04  # newest available distribution, aka noble
    # skip commits made by the release plugin
    if: "!contains(github.event.head_commit.message, 'maven-release-plugin')"
    strategy:
      matrix:
        include:
          - name: zipkin-collector-activemq
          - name: zipkin-collector-kafka
          - name: zipkin-collector-rabbitmq
          - name: zipkin-collector-pulsar
          - name: zipkin-storage-cassandra
          - name: zipkin-storage-elasticsearch
          - name: zipkin-storage-mysql-v1
          - name: zipkin-server
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
      - name: Setup java
        uses: actions/setup-java@v4
        with:
          distribution: 'zulu'  # zulu as it supports a wide version range
          java-version: '21'  # Most recent LTS
      - name: Cache local Maven repository
        uses: actions/cache@v4
        with:
          path: ~/.m2/repository
          # yamllint disable-line rule:line-length
          key: ${{ runner.os }}-jdk-${{ matrix.java_version }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-jdk-${{ matrix.java_version }}-maven-
      # Don't attempt to cache Docker. Sensitive information can be stolen
      # via forks, and login session ends up in ~/.docker. This is ok because
      # we publish DOCKER_PARENT_IMAGE to ghcr.io, hence local to the runner.
      - name: Test with Docker
        # configure_test seeds NPM cache, which isn't needed for these tests.
        #
        # What we are doing here is configuring docker, then installing the
        # module's dependencies prior to testing it with docker. This allows
        # us to avoid running tests except the leaf module.
        run: |
          build-bin/docker/configure_docker &&
          build-bin/maven/maven_go_offline &&
          build-bin/maven/maven_build -pl :${{ matrix.name }} --am &&
          build-bin/test -Dgroups=docker -pl :${{ matrix.name }}
        env:
          MAVEN_GOAL: install  # docker build needs dependencies in mavenLocal
          MAVEN_CONFIG: '-Dlicense.skip=true'  # license check already run


================================================
FILE: .github/workflows/test_readme.yml
================================================
---
name: test_readme

# These test build commands mentioned in various README.md files.
#
# We don't test documentation-only commits.
on:  # yamllint disable-line rule:truthy
  push:  # non-tagged pushes to master
    branches:
      - master
    tags-ignore:
      - '*'
    paths-ignore:
      - '**/*.md'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json
  pull_request:  # pull requests targeted at the master branch.
    branches:
      - master
    paths-ignore:
      - '**/*.md'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json

jobs:
  zipkin-server:
    name: zipkin-server/README.md ${{ matrix.name }}
    runs-on: ${{ matrix.os }}
    # skip commits made by the release plugin
    if: "!contains(github.event.head_commit.message, 'maven-release-plugin')"
    timeout-minutes: 5
    strategy:
      matrix:
        include:  # Not ubuntu as already tested as a part of the docker job
          - name: macos
            os: macos-14
          - name: windows
            os: windows-2022
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
      - name: Setup java
        uses: actions/setup-java@v4
        with:
          distribution: 'zulu'  # zulu as it supports a wide version range
          java-version: '21'  # Most recent LTS
          cache: 'maven'
      - name: Cache NPM Packages
        uses: actions/cache@v4
        with:
          path: ~/.npm
          # yamllint disable-line rule:line-length
          key: ${{ runner.os }}-npm-packages-${{ hashFiles('zipkin-lens/package-lock.json') }}
      - name: Execute Server Build  # command from zipkin-server/README.md
        run: ./mvnw --also-make -pl zipkin-server clean package
        env:
          MAVEN_CONFIG: '-T1C -q --batch-mode -DskipTests'

  docker:
    runs-on: ubuntu-24.04  # newest available distribution, aka noble
    # skip commits made by the release plugin
    if: "!contains(github.event.head_commit.message, 'maven-release-plugin')"
    timeout-minutes: 20
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
      # Remove apt repos that are known to break from time to time.
      # See https://github.com/actions/virtual-environments/issues/323
      - name: Remove broken apt repos
        run: |
          for apt_file in `grep -lr microsoft /etc/apt/sources.list.d/`
          do sudo rm $apt_file
          done
      - name: Setup java
        uses: actions/setup-java@v4
        with:
          distribution: 'zulu'  # zulu as it supports a wide version range
          java-version: '21'  # Most recent LTS
          cache: 'maven'
      # Don't attempt to cache Docker. Sensitive information can be stolen
      # via forks, and login session ends up in ~/.docker. This is ok because
      # we publish DOCKER_PARENT_IMAGE to ghcr.io, hence local to the runner.
      - name: Cache NPM Packages
        uses: actions/cache@v4
        with:
          path: ~/.npm
          # yamllint disable-line rule:line-length
          key: ${{ runner.os }}-npm-packages-${{ hashFiles('zipkin-lens/package-lock.json') }}
      - name: Build zipkin-server  # redundant, but needed for docker/README.md
        run: ./mvnw --also-make -pl zipkin-server clean package
        env:
          MAVEN_CONFIG: '-T1C -q --batch-mode -DskipTests'
      - name: docker/README.md - openzipkin/zipkin
        run: |
          build-bin/docker/docker_build openzipkin/zipkin:test &&
          build-bin/docker/docker_test_image openzipkin/zipkin:test &&
          docker run --rm --entrypoint=/bin/sh openzipkin/zipkin:test \
            -c 'cd BOOT-INF/lib && du -sk *aarch* *x86* *a64*' || true
        env:
          RELEASE_FROM_MAVEN_BUILD: true
      - name: docker/README.md - openzipkin/zipkin-slim
        run: |
          build-bin/docker/docker_build openzipkin/zipkin-slim:test &&
          build-bin/docker/docker_test_image openzipkin/zipkin-slim:test &&
          docker run --rm --entrypoint=/bin/sh openzipkin/zipkin-slim:test \
            -c 'cd BOOT-INF/lib && du -sk *aarch* *x86* *a64*' || true
        env:
          DOCKER_TARGET: zipkin-slim
          RELEASE_FROM_MAVEN_BUILD: true
      - name: docker/test-images/zipkin-ui/README.md
        run: |
          build-bin/docker/docker_build ${DOCKER_TAG} &&
          build-bin/docker/docker_test_image ${DOCKER_TAG}
        env:
          DOCKER_TAG: openzipkin/zipkin-ui:test
          DOCKER_FILE: docker/test-images/zipkin-ui/Dockerfile
          RELEASE_FROM_MAVEN_BUILD: true
      - name: docker/test-images/zipkin-uiproxy/README.md
        run: |
          build-bin/docker/docker_build ${DOCKER_TAG} &&
          build-bin/docker/docker_test_image ${DOCKER_TAG}
        env:
          DOCKER_TAG: openzipkin/zipkin-uiproxy:test
          DOCKER_FILE: docker/test-images/zipkin-uiproxy/Dockerfile
      - name: docker/test-images/zipkin-activemq/README.md
        run: |
          build-bin/docker/docker_build ${DOCKER_TAG} &&
          build-bin/docker/docker_test_image ${DOCKER_TAG}
        env:
          DOCKER_TAG: openzipkin/zipkin-activemq:test
          DOCKER_FILE: docker/test-images/zipkin-activemq/Dockerfile
      - name: docker/test-images/zipkin-cassandra/README.md
        run: |
          build-bin/docker/docker_build ${DOCKER_TAG} &&
          build-bin/docker/docker_test_image ${DOCKER_TAG}
        env:
          DOCKER_TAG: openzipkin/zipkin-cassandra:test
          DOCKER_FILE: docker/test-images/zipkin-cassandra/Dockerfile
      - name: docker/test-images/zipkin-elasticsearch7/README.md
        run: |
          build-bin/docker/docker_build ${DOCKER_TAG} &&
          build-bin/docker/docker_test_image ${DOCKER_TAG}
        env:
          DOCKER_TAG: openzipkin/zipkin-elasticsearch7:test
          DOCKER_FILE: docker/test-images/zipkin-elasticsearch7/Dockerfile
      - name: docker/test-images/zipkin-elasticsearch8/README.md
        run: |
          build-bin/docker/docker_build ${DOCKER_TAG} &&
          build-bin/docker/docker_test_image ${DOCKER_TAG}
        env:
          DOCKER_TAG: openzipkin/zipkin-elasticsearch8:test
          DOCKER_FILE: docker/test-images/zipkin-elasticsearch8/Dockerfile
      - name: docker/test-images/zipkin-opensearch2/README.md
        run: |
          build-bin/docker/docker_build ${DOCKER_TAG} &&
          build-bin/docker/docker_test_image ${DOCKER_TAG}
        env:
          DOCKER_TAG: openzipkin/zipkin-opensearch2:test
          DOCKER_FILE: docker/test-images/zipkin-opensearch2/Dockerfile
      - name: docker/test-images/zipkin-eureka/README.md
        run: |
          build-bin/docker/docker_build openzipkin/zipkin-eureka:test &&
          build-bin/docker/docker_test_image openzipkin/zipkin-eureka:test
        env:
          DOCKER_FILE: docker/test-images/zipkin-eureka/Dockerfile
      - name: docker/test-images/zipkin-kafka/README.md
        run: |
          build-bin/docker/docker_build openzipkin/zipkin-kafka:test &&
          build-bin/docker/docker_test_image openzipkin/zipkin-kafka:test
        env:
          DOCKER_FILE: docker/test-images/zipkin-kafka/Dockerfile
      - name: docker/test-images/zipkin-mysql/README.md
        run: |
          build-bin/docker/docker_build openzipkin/zipkin-mysql:test &&
          build-bin/docker/docker_test_image openzipkin/zipkin-mysql:test
        env:
          DOCKER_FILE: docker/test-images/zipkin-mysql/Dockerfile
      - name: docker/test-images/zipkin-rabbitmq/README.md
        run: |
          build-bin/docker/docker_build openzipkin/zipkin-rabbitmq:test &&
          build-bin/docker/docker_test_image openzipkin/zipkin-rabbitmq:test
        env:
          DOCKER_FILE: docker/test-images/zipkin-rabbitmq/Dockerfile
      - name: docker/test-images/zipkin-pulsar/README.md
        run: |
          build-bin/docker/docker_build openzipkin/zipkin-pulsar:test &&
          build-bin/docker/docker_test_image openzipkin/zipkin-pulsar:test
        env:
          DOCKER_FILE: docker/test-images/zipkin-pulsar/Dockerfile


================================================
FILE: .gitignore
================================================
*~
#*
*#
.#*
dependency-reduced-pom.xml
.factorypath
.classpath
.project
.settings/
.springBeans
target/
_site/
.idea
*.iml
*.swp
# quickstart or temporary copies of zipkin's jar
/*.jar
# temporary directory used by build-bin/javadoc_to_gh_pages for building gh-pages
/javadoc-builddir
.DS_Store

# This project does not use Gradle but some developers may use it to e.g., setup a Node environment.
# It doesn't hurt to just exclude it here.
.gradle

# This project does not use Yarn but some developers may use it to e.g., start zipkin-lens dev server.
# It doesn't hurt to just exclude it here.
yarn.lock


================================================
FILE: .mvn/wrapper/maven-wrapper.properties
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
wrapperVersion=3.3.2
distributionType=bin
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar


================================================
FILE: .settings.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!--

    Copyright The OpenZipkin Authors
    SPDX-License-Identifier: Apache-2.0

-->
<settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <servers>
    <server>
      <id>gpg.passphrase</id>
      <passphrase>${env.GPG_PASSPHRASE}</passphrase>
    </server>
    <server>
      <id>ossrh</id>
      <username>${env.SONATYPE_USER}</username>
      <password>${env.SONATYPE_PASSWORD}</password>
    </server>
    <server>
      <id>github.com</id>
      <username>zipkinci</username>
      <password>${env.GH_TOKEN}</password>
    </server>
  </servers>
</settings>


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright {yyyy} {name of copyright owner}

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

This product contains a modified part of Gson, distributed by Google:

  * License: Apache License v2.0
  * Homepage: https://github.com/google/gson

This product contains a modified part of Guava, distributed by Google:

  * License: Apache License v2.0
  * Homepage: https://github.com/google/guava

This product contains a modified part of Okio, distributed by Square:

  * License: Apache License v2.0
  * Homepage: https://github.com/square/okio


================================================
FILE: README.md
================================================
# zipkin

[![Gitter chat](http://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/openzipkin/zipkin)
[![Build Status](https://github.com/openzipkin/zipkin/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/openzipkin/zipkin/actions?query=workflow%3Atest+branch%3Amaster)
[![Maven Central](https://img.shields.io/maven-central/v/io.zipkin/zipkin-server.svg)](https://central.sonatype.com/search?q=zipkin&namespace=io.zipkin&name=zipkin-server)

[Zipkin](https://zipkin.io) is a distributed tracing system. It helps gather
timing data needed to troubleshoot latency problems in service architectures.
Features include both the collection and lookup of this data.

If you have a trace ID in a log file, you can jump directly to it. Otherwise,
you can query based on attributes such as service, operation name, tags and
duration. Some interesting data will be summarized for you, such as the
percentage of time spent in a service, and whether operations failed.

<img src="https://zipkin.io/public/img/web-screenshot.png" alt="Trace view screenshot" />

The Zipkin UI also presents a dependency diagram showing how many traced
requests went through each application. This can be helpful for identifying
aggregate behavior including error paths or calls to deprecated services.

<img src="https://zipkin.io/public/img/dependency-graph.png" alt="Dependency graph screenshot" />

Application’s need to be “instrumented” to report trace data to Zipkin. This
usually means configuration of a [tracer or instrumentation library](https://zipkin.io/pages/tracers_instrumentation.html). The most
popular ways to report data to Zipkin are via http or Kafka, though many other
options exist, such as Apache ActiveMQ, gRPC, RabbitMQ and Apache Pulsar. The data served to
the UI is stored in-memory, or persistently with a supported backend such as
Apache Cassandra or Elasticsearch.

## Quick-start

The quickest way to get started is to fetch the [latest released server](https://central.sonatype.com/search?q=zipkin&namespace=io.zipkin&name=zipkin-server&sort=published) as a self-contained
executable jar. Note that the Zipkin server requires minimum JRE 17+. For example:

```bash
curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar
```

You can also start Zipkin via Docker.
```bash
# Note: this is mirrored as ghcr.io/openzipkin/zipkin
docker run -d -p 9411:9411 openzipkin/zipkin
```

Once the server is running, you can view traces with the Zipkin UI at http://localhost:9411/zipkin.

If your applications aren't sending traces, yet, configure them with [Zipkin instrumentation](https://zipkin.io/pages/tracers_instrumentation) or try one of our [examples](https://github.com/openzipkin?utf8=%E2%9C%93&q=example).

Check out the [`zipkin-server`](zipkin-server/README.md) documentation for configuration details, or [Docker examples](docker/examples) for how to use docker-compose.

### Zipkin Slim

The slim build of Zipkin is smaller and starts faster. It supports in-memory and Elasticsearch storage, but doesn't support messaging transports like Kafka or RabbitMQ. If these constraints match your needs, you can try slim like below:

Running via Java:
```bash
curl -sSL https://zipkin.io/quickstart.sh | bash -s io.zipkin:zipkin-server:LATEST:slim zipkin.jar
java -jar zipkin.jar
```

Running via Docker:
```bash
# Note: this is mirrored as ghcr.io/openzipkin/zipkin-slim
docker run -d -p 9411:9411 openzipkin/zipkin-slim
```

Running via [Homebrew](https://formulae.brew.sh/formula/zipkin):
```bash
brew install zipkin
# to run in foreground
zipkin
# to run in background
brew services start zipkin
```

## Core Library
The [core library](zipkin/src/main/java/zipkin2) is used by both Zipkin instrumentation and the Zipkin server.

This includes built-in codec for Zipkin's v1 and v2 json formats. A direct dependency on gson
(json library) is avoided by minifying and repackaging classes used. The result is a 155k jar which
won't conflict with any library you use.

Ex.
```java
// All data are recorded against the same endpoint, associated with your service graph
localEndpoint = Endpoint.newBuilder().serviceName("tweetie").ip("192.168.0.1").build()
span = Span.newBuilder()
    .traceId("d3d200866a77cc59")
    .id("d3d200866a77cc59")
    .name("targz")
    .localEndpoint(localEndpoint)
    .timestamp(epochMicros())
    .duration(durationInMicros)
    .putTag("compression.level", "9");

// Now, you can encode it as json
bytes = SpanBytesEncoder.JSON_V2.encode(span);
```

Note: The above is just an example, most likely you'll want to use an existing tracing library like [Brave](https://github.com/openzipkin/brave)

### Core Library Requires Java 8+

The minimum Java language level of the core library is 8. This helps support those writing agent
instrumentation. Version 2.x was the last to support Java 6.

*Note*: [zipkin-reporter-brave](https://github.com/openzipkin/zipkin-reporter-java/blob/master/brave/README.md)
does not use this library. So, [brave](https://github.com/openzipkin/brave) still supports Java 6.

## Storage Component
Zipkin includes a [StorageComponent](zipkin/src/main/java/zipkin2/storage/StorageComponent.java), used to store and query spans and
dependency links. This is used by the server and those making collectors, or span reporters.
For this reason, storage components have minimal dependencies, though require Java 17+.

Ex.
```java
// this won't create network connections
storage = ElasticsearchStorage.newBuilder()
                              .hosts(asList("http://myelastic:9200")).build();

// prepare a call
traceCall = storage.spanStore().getTrace("d3d200866a77cc59");

// execute it synchronously or asynchronously
trace = traceCall.execute();

// clean up any sessions, etc
storage.close();
```

### In-Memory
The [InMemoryStorage](zipkin-server#in-memory-storage) component is packaged in zipkin's core library. It
is neither persistent, nor viable for realistic work loads. Its purpose
is for testing, for example starting a server on your laptop without any
database needed.

### Cassandra
The [Cassandra](zipkin-server#cassandra-storage) component uses Cassandra
3.11.3+ features, but is tested against the latest patch of Cassandra 4.1.

This is the second generation of our Cassandra schema. It stores spans
using UDTs, such that they appear like Zipkin v2 json in cqlsh. It is
designed for scale, and uses a combination of SASI and manually
implemented indexes to make querying larger data more performant.

Note: This store requires a [job to aggregate](https://github.com/openzipkin/zipkin-dependencies) dependency links.

### Elasticsearch
The [Elasticsearch](zipkin-server#elasticsearch-storage) component uses
Elasticsearch 5+ features, but is tested against Elasticsearch 7-8.x and
OpenSearch 2.x.

It stores spans as Zipkin v2 json so that integration with other tools is
straightforward. To help with scale, this uses a combination of custom
and manually implemented indexing.

Note: This store requires a [spark job](https://github.com/openzipkin/zipkin-dependencies) to aggregate dependency links.

### Disabling search
The following API endpoints provide search features, and are enabled by
default. Search primarily allows the trace list screen of the UI operate.
* `GET /services` - Distinct Span.localServiceName
* `GET /remoteServices?serviceName=X` - Distinct Span.remoteServiceName by Span.localServiceName
* `GET /spans?serviceName=X` - Distinct Span.name by Span.localServiceName
* `GET /autocompleteKeys` - Distinct keys of Span.tags subject to configurable whitelist
* `GET /autocompleteValues?key=X` - Distinct values of Span.tags by key
* `GET /traces` - Traces matching a query possibly including the above criteria


When search is disabled, traces can only be retrieved by ID
(`GET /trace/{traceId}`). Disabling search is only viable when there is
an alternative way to find trace IDs, such as logs. Disabling search can
reduce storage costs or increase write throughput.

`StorageComponent.Builder.searchEnabled(false)` is implied when a zipkin
is run with the env variable `SEARCH_ENABLED=false`.

### Legacy (v1) components
The following components are no longer encouraged, but exist to help aid
transition to supported ones. These are indicated as "v1" as they use
data layouts based on Zipkin's V1 Thrift model, as opposed to the
simpler v2 data model currently used.

#### MySQL
The [MySQL v1](zipkin-storage/mysql-v1) component uses MySQL 5.6+
features, but is tested against MariaDB 10.11.

The schema was designed to be easy to understand and get started with;
it was not designed for performance. Ex spans fields are columns, so
you can perform ad-hoc queries using SQL. However, this component has
[known performance issues](https://github.com/openzipkin/zipkin/issues/1233): queries will eventually take seconds to return
if you put a lot of data into it.

This store does not require a [job to aggregate](https://github.com/openzipkin/zipkin-dependencies) dependency links.
However, running the job will improve performance of dependencies
queries.

## Running the server from source
The [Zipkin server](zipkin-server) receives spans via HTTP POST and respond to queries
from its UI. It can also run collectors, such as RabbitMQ or Kafka.

To run the server from the currently checked out source, enter the
following. JDK 17+ is required to compile the source.
```bash
# Build the server and also make its dependencies
$ ./mvnw -q --batch-mode -DskipTests --also-make -pl zipkin-server clean install
# Run the server
$ java -jar ./zipkin-server/target/zipkin-server-*exec.jar
```

## Artifacts
Server artifacts are under the maven group id `io.zipkin`
Library artifacts are under the maven group id `io.zipkin.zipkin2`

### Library Releases
Releases are at [Sonatype](https://oss.sonatype.org/content/repositories/releases) and [Maven Central](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22io.zipkin%22)

### Library Snapshots
Snapshots are uploaded to [Sonatype](https://oss.sonatype.org/content/repositories/snapshots) after
commits to master.

### Docker Images
Released versions of zipkin-server are published to Docker Hub as `openzipkin/zipkin` and GitHub
Container Registry as `ghcr.io/openzipkin/zipkin`. See [docker](docker) for details.

### Helm Charts
Helm charts are available via `helm repo add zipkin https://zipkin.io/zipkin-helm`.
See [zipkin-helm](https://github.com/openzipkin/zipkin-helm) for details.

### Javadocs
https://zipkin.io/zipkin contains versioned folders with JavaDocs published on each (non-PR) build, as well
as releases.


================================================
FILE: RELEASE.md
================================================
# OpenZipkin Release Process

This repo uses semantic versions. Please keep this in mind when choosing version numbers.

1. **Verify all dependencies are up-to-date**

   Before you start a release, make sure all dependencies are up-to-date, or are documented why not.
   Pay special attention to the [security workflow](.github/workflows/security.yml), which should
   run clean.

1. **Alert others you are releasing**

   There should be no commits made to master while the release is in progress (about 10 minutes). Before you start
   a release, alert others on [gitter](https://gitter.im/openzipkin/zipkin) so that they don't accidentally merge
   anything. If they do, and the build fails because of that, you'll have to recreate the release tag described below.

1. **Push a git tag**

   The trigger format is `release-MAJOR.MINOR.PATCH`, ex `git tag release-1.18.1 && git push origin release-1.18.1`.

1. **Wait for CI**

   The `release-MAJOR.MINOR.PATCH` tag triggers [`build-bin/maven/maven_release`](build-bin/maven/maven_release),
   which creates commits, `MAJOR.MINOR.PATCH` tag, and increments the version (maven-release-plugin).

   The `MAJOR.MINOR.PATCH` tag triggers [`build-bin/deploy`](build-bin/deploy), which does the following:
     * Publishes jars to https://oss.sonatype.org/content/repositories/releases [`build-bin/maven/maven_deploy`](build-bin/maven/maven_deploy)
       * Later, the same jars synchronize to Maven Central
     * Publishes Javadoc to https://zipkin.io/brave into a versioned subdirectory
     * Pushes images to Docker registries [`build-bin/docker_push`](build-bin/docker_push)

   Notes:
     * https://search.maven.org/ index will take longer than direct links like https://repo1.maven.org/maven2/io/zipkin

## Credentials

The release process uses various credentials. If you notice something failing due to unauthorized,
look at the notes in [.github/workflows/deploy.yml] and check the [org secrets](https://github.com/organizations/openzipkin/settings/secrets/actions).

### Troubleshooting invalid credentials

If you receive a '401 unauthorized' failure from OSSRH, it is likely
`SONATYPE_USER` or `SONATYPE_PASSWORD` entries are invalid, or possibly the
user associated with them does not have rights to upload.

The least destructive test is to try to publish a snapshot manually. By passing
the values CI would use, you can kick off a snapshot from your laptop. This
is a good way to validate that your unencrypted credentials are authorized.

Here's an example of a snapshot deploy with specified credentials.
```bash
$ export GPG_TTY=$(tty) && GPG_PASSPHRASE=whackamole SONATYPE_USER=adrianmole SONATYPE_PASSWORD=ed6f20bde9123bbb2312b221 build-bin/build-bin/maven/maven_deploy
```

## Manually releasing

If for some reason, you lost access to CI or otherwise cannot get automation to work, bear in mind
this is a normal maven project, and can be released accordingly.

*Note:* If [Sonatype is down](https://status.sonatype.com/), the below will not work.

```bash
# First, set variable according to your personal credentials. These would normally be assigned as
# org secrets: https://github.com/organizations/openzipkin/settings/secrets/actions
export GPG_TTY=$(tty)
export GPG_PASSPHRASE=your_gpg_passphrase
export SONATYPE_USER=your_sonatype_account
export SONATYPE_PASSWORD=your_sonatype_password
release_version=xx-version-to-release-xx

# now from latest master, create the release. This creates and pushes the MAJOR.MINOR.PATCH tag
./build-bin/maven/maven_release release-${release_version}

# once this works, deploy the release
git checkout ${release_version}
./build-bin/deploy

# Finally, clean up
./mvnw release:clean
git checkout master
git reset HEAD --hard
```


================================================
FILE: SECURITY.md
================================================
# OpenZipkin Security Process

This document outlines the process for handling security concerns in OpenZipkin projects.

Any vulnerability or misconfiguration detected in our [security workflow](.github/workflows/security.yml)
should be addressed as a normal pull request.

OpenZipkin is a volunteer community and does not have a dedicated security team. There may be
periods where no volunteer is able to address a security concern. There is no SLA or warranty
offered by volunteers. If you are a security researcher, please consider this before escalating.

For security concerns that are sensitive or otherwise outside the scope of public issues, please
contact zipkin-admin@googlegroups.com.


================================================
FILE: benchmarks/README.md
================================================
# zipkin-benchmarks

This module includes [JMH](http://openjdk.java.net/projects/code-tools/jmh/)
benchmarks for zipkin. You can use these to measure overhead.

### Running the benchmark
From the project directory, run this to build the benchmarks:

```bash
$ ./mvnw install -pl benchmarks -am -Dmaven.test.skip.exec=true
```

and the following to run them:

```bash
$ java -jar benchmarks/target/benchmarks.jar
```


================================================
FILE: benchmarks/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!--

    Copyright The OpenZipkin Authors
    SPDX-License-Identifier: Apache-2.0

-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>io.zipkin</groupId>
    <artifactId>zipkin-parent</artifactId>
    <version>3.6.0-SNAPSHOT</version>
  </parent>

  <artifactId>benchmarks</artifactId>
  <name>Benchmarks</name>
  <description>Benchmarks (JMH)</description>

  <properties>
    <main.basedir>${project.basedir}/..</main.basedir>

    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <maven.compiler.release>17</maven.compiler.release>

    <jmh.version>1.37</jmh.version>
    <unpack-proto.directory>${project.build.directory}/main/proto</unpack-proto.directory>
  </properties>

  <!-- Apache Cassandra java-driver is typically behind on jackson and netty -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-bom</artifactId>
        <version>${netty.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>com.fasterxml.jackson</groupId>
        <artifactId>jackson-bom</artifactId>
        <version>${jackson.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <!-- All dependencies are marked test, because benchmarks are a form of test.
       This module is skipped on -DskipTests, ensuring it isn't deployed. -->
  <dependencies>
    <!-- These are main deps as wire-maven-plugin isn't designed for tests -->
    <dependency>
      <groupId>com.squareup.wire</groupId>
      <artifactId>wire-runtime-jvm</artifactId>
      <version>${wire.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>io.zipkin.proto3</groupId>
      <artifactId>zipkin-proto3</artifactId>
      <version>${zipkin-proto3.version}</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>org.openjdk.jmh</groupId>
      <artifactId>jmh-core</artifactId>
      <version>${jmh.version}</version>
      <scope>test</scope>
    </dependency>
    <!-- IntelliJ doesn't know to use annotation processing on tests without this -->
    <dependency>
      <groupId>org.openjdk.jmh</groupId>
      <artifactId>jmh-generator-annprocess</artifactId>
      <version>${jmh.version}</version>
      <scope>test</scope>
    </dependency>
    <!-- for codec benchmarks -->
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>${gson.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.squareup.moshi</groupId>
      <artifactId>moshi</artifactId>
      <version>1.15.2</version>
      <exclusions>
        <!-- let wire control the okio version -->
        <exclusion>
          <groupId>com.squareup.okio</groupId>
          <artifactId>okio</artifactId>
        </exclusion>
      </exclusions>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>com.esotericsoftware</groupId>
      <artifactId>kryo</artifactId>
      <version>${kryo.version}</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>com.google.protobuf</groupId>
      <artifactId>protobuf-java</artifactId>
      <version>3.25.8</version>
      <scope>test</scope>
    </dependency>

    <!-- Ensure server benchmarks run with a consistent logger -->
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>zipkin-server</artifactId>
      <version>${project.version}</version>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-log4j2</artifactId>
        </exclusion>
      </exclusions>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>${slf4j.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jul-to-slf4j</artifactId>
      <version>${slf4j.version}</version>
    </dependency>

    <dependency>
      <groupId>${project.groupId}.zipkin2</groupId>
      <artifactId>zipkin-storage-elasticsearch</artifactId>
      <version>${project.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>${project.groupId}.zipkin2</groupId>
      <artifactId>zipkin-tests</artifactId>
      <version>${project.version}</version>
      <scope>test</scope>
    </dependency>

    <!-- zipkin-server optional dependencies for running ServerIntegratedBenchmark -->
    <dependency>
      <groupId>${project.groupId}.zipkin2</groupId>
      <artifactId>zipkin-storage-cassandra</artifactId>
      <version>${project.version}</version>
      <exclusions>
        <exclusion>
          <groupId>io.netty</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.cassandra</groupId>
      <artifactId>java-driver-core</artifactId>
      <version>${java-driver.version}</version>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>io.netty</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>${project.groupId}.zipkin2</groupId>
      <artifactId>zipkin-storage-mysql-v1</artifactId>
      <version>${project.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mariadb.jdbc</groupId>
      <artifactId>mariadb-java-client</artifactId>
      <version>${mariadb-java-client.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.zaxxer</groupId>
      <artifactId>HikariCP</artifactId>
      <version>${HikariCP.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>testcontainers</artifactId>
      <version>${testcontainers.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <!-- use assembly instead of shade, as it naturally works for test-jar -->
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>${maven-assembly-plugin.version}</version>
        <configuration>
          <descriptors>
            <descriptor>src/test/assembly/test-jar.xml</descriptor>
          </descriptors>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
            <configuration>
              <attach>true</attach>
              <finalName>benchmarks</finalName>
              <appendAssemblyId>false</appendAssemblyId>
              <archive>
                <manifest>
                  <mainClass>org.openjdk.jmh.Main</mainClass>
                </manifest>
              </archive>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <executions>
          <execution>
            <id>default-compile</id>
            <phase>compile</phase>
            <goals>
              <goal>compile</goal>
            </goals>
            <configuration combine.self="override">
              <!-- instead of javac-with-errorprone -->
              <compilerId>javac</compilerId>
              <!-- scrub errorprone compiler args -->
              <compilerArgs />
            </configuration>
          </execution>
          <execution>
            <id>test-compile</id>
            <phase>test-compile</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
            <configuration combine.self="override">
              <!-- instead of javac-with-errorprone -->
              <compilerId>javac</compilerId>
              <!-- scrub errorprone compiler args -->
              <compilerArgs />
              <annotationProcessorPaths>
                <path>
                  <groupId>org.openjdk.jmh</groupId>
                  <artifactId>jmh-generator-annprocess</artifactId>
                  <version>${jmh.version}</version>
                </path>
              </annotationProcessorPaths>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-dependency-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>de.m3y.maven</groupId>
        <artifactId>wire-maven-plugin</artifactId>
        <configuration>
          <generatedSourceDirectory>${generated-proto.directory}</generatedSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>


================================================
FILE: benchmarks/src/test/assembly/test-jar.xml
================================================
<!--

    Copyright The OpenZipkin Authors
    SPDX-License-Identifier: Apache-2.0

-->
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.2.0 https://maven.apache.org/xsd/assembly-2.2.0.xsd">
  <!-- This is an alternative to maven-shade-plugin, which makes an executable
       jar from the test source tree. This was made due to lack of success
       getting 'shadeTestJar' and similar configuration working. -->
  <id>test-jar</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>test</scope>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${project.build.directory}/test-classes</directory>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>**/*</include>
      </includes>
      <useDefaultExcludes>true</useDefaultExcludes>
    </fileSet>
  </fileSets>
</assembly>


================================================
FILE: benchmarks/src/test/java/zipkin2/EndpointBenchmarks.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2;

import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@Measurement(iterations = 5, time = 1)
@Warmup(iterations = 10, time = 1)
@Fork(3)
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Threads(2)
public class EndpointBenchmarks {
  static final String IPV4 = "43.0.192.2", IPV6 = "2001:db8::c001";
  static final InetAddress IPV4_ADDR, IPV6_ADDR;

  static {
    try {
      IPV4_ADDR = Inet4Address.getByName(IPV4);
      IPV6_ADDR = Inet6Address.getByName(IPV6);
    } catch (UnknownHostException e) {
      throw new AssertionError(e);
    }
  }

  Endpoint.Builder builder = Endpoint.newBuilder();

  @Benchmark public boolean parseIpv4_literal() {
    return builder.parseIp(IPV4);
  }

  @Benchmark public boolean parseIpv4_addr() {
    return builder.parseIp(IPV4_ADDR);
  }

  @Benchmark public boolean parseIpv4_bytes() {
    return builder.parseIp(IPV4_ADDR.getAddress());
  }

  @Benchmark public boolean parseIpv6_literal() {
    return builder.parseIp(IPV6);
  }

  @Benchmark public boolean parseIpv6_addr() {
    return builder.parseIp(IPV6_ADDR);
  }

  @Benchmark public boolean parseIpv6_bytes() {
    return builder.parseIp(IPV6_ADDR.getAddress());
  }

  // Convenience main entry-point
  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
      .addProfiler("gc")
      .include(".*" + EndpointBenchmarks.class.getSimpleName())
      .build();

    new Runner(opt).run();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/SpanBenchmarks.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.serializers.JavaSerializer;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import static zipkin2.internal.HexCodec.lowerHexToUnsignedLong;

@Measurement(iterations = 5, time = 1)
@Warmup(iterations = 10, time = 1)
@Fork(3)
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Threads(2)
public class SpanBenchmarks {
  static final Endpoint FRONTEND =
    Endpoint.newBuilder().serviceName("frontend").ip("127.0.0.1").build();
  static final Endpoint BACKEND =
    Endpoint.newBuilder().serviceName("backend").ip("192.168.99.101").port(9000).build();
  static final Span clientSpan = buildClientSpan(Span.newBuilder());

  final Span.Builder sharedBuilder;

  public SpanBenchmarks() {
    sharedBuilder = buildClientSpan().toBuilder();
  }

  static final String traceIdHex = "86154a4ba6e91385", spanIdHex = "4d1e00c0db9010db";
  static final long traceId = lowerHexToUnsignedLong(traceIdHex);
  static final long spanId = lowerHexToUnsignedLong(spanIdHex);

  @Benchmark
  public Span buildClientSpan() {
    return buildClientSpan(Span.newBuilder());
  }

  @Benchmark
  public Span buildClientSpan_longs() {
    return buildClientSpan_longs(Span.newBuilder());
  }

  static Span buildClientSpan(Span.Builder builder) {
    return builder
      .traceId(traceIdHex)
      .parentId(traceIdHex)
      .id(spanIdHex)
      .name("get")
      .kind(Span.Kind.CLIENT)
      .localEndpoint(FRONTEND)
      .remoteEndpoint(BACKEND)
      .timestamp(1472470996199000L)
      .duration(207000L)
      .addAnnotation(1472470996238000L, "ws")
      .addAnnotation(1472470996403000L, "wr")
      .putTag("http.path", "/api")
      .putTag("clnt/finagle.version", "6.45.0")
      .build();
  }

  static Span buildClientSpan_longs(Span.Builder builder) {
    return builder
      .traceId(0L, traceId)
      .parentId(traceId)
      .id(spanId)
      .name("get")
      .kind(Span.Kind.CLIENT)
      .localEndpoint(FRONTEND)
      .remoteEndpoint(BACKEND)
      .timestamp(1472470996199000L)
      .duration(207000L)
      .addAnnotation(1472470996238000L, "ws")
      .addAnnotation(1472470996403000L, "wr")
      .putTag("http.path", "/api")
      .putTag("clnt/finagle.version", "6.45.0")
      .build();
  }

  @Benchmark
  public Span buildClientSpan_clear() {
    return buildClientSpan(sharedBuilder.clear());
  }

  @Benchmark
  public Span buildClientSpan_clone() {
    return sharedBuilder.clone().build();
  }

  static final Kryo kryo = new Kryo();
  static final byte[] clientSpanSerialized;

  static {
    kryo.register(Span.class, new JavaSerializer());
    Output output = new Output(4096);
    kryo.writeObject(output, clientSpan);
    output.flush();
    clientSpanSerialized = output.getBuffer();
  }

  /** manually implemented with json so not as slow as normal java */
  @Benchmark
  public Span serialize_kryo() {
    return kryo.readObject(new Input(clientSpanSerialized), Span.class);
  }

  @Benchmark
  public byte[] deserialize_kryo() {
    Output output = new Output(clientSpanSerialized.length);
    kryo.writeObject(output, clientSpan);
    output.flush();
    return output.getBuffer();
  }

  @Benchmark
  public String padLeft_1Char() {
    return Span.padLeft("1", 16);
  }

  @Benchmark
  public String padLeft_15Chars() {
    return Span.padLeft("123456789012345", 16);
  }

  @Benchmark
  public String padLeft_17Chars() {
    return Span.padLeft("12345678901234567", 32);
  }

  @Benchmark
  public String padLeft_31Chars() {
    return Span.padLeft("1234567890123456789012345678901", 32);
  }

  // Convenience main entry-point
  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
      .include(".*" + SpanBenchmarks.class.getSimpleName() + ".*")
      .addProfiler("gc")
      .build();

    new Runner(opt).run();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/codec/CodecBenchmarks.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.codec;

import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import zipkin2.Span;

import static java.nio.charset.StandardCharsets.UTF_8;
import static zipkin2.storage.cassandra.internal.Resources.resourceToString;

/**
 * The {@link SpanBytesEncoder bundled java codec} aims to be both small in size (i.e. does not
 * significantly increase the size of zipkin's jar), and efficient. It may not always be fastest,
 * but we should try to keep it competitive.
 *
 * <p>Note that the wire benchmarks use their structs, not ours. This will result in more efficient
 * writes as there's no hex codec of IDs, stringifying of IPs etc. A later change could do that, but
 * it likely still going to be more efficient than our dependency-free codec. This means in cases
 * where extra dependencies are ok (such as our server), we could consider using wire.
 */
@Measurement(iterations = 5, time = 1)
@Warmup(iterations = 10, time = 1)
@Fork(3)
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Threads(1)
public class CodecBenchmarks {
  static final byte[] clientSpanJsonV2 = resourceToString("/zipkin2-client.json").getBytes(UTF_8);
  static final Span clientSpan = SpanBytesDecoder.JSON_V2.decodeOne(clientSpanJsonV2);
  static final byte[] clientSpanJsonV1 = SpanBytesEncoder.JSON_V1.encode(clientSpan);
  static final byte[] clientSpanProto3 = SpanBytesEncoder.PROTO3.encode(clientSpan);
  static final byte[] clientSpanThrift = SpanBytesEncoder.THRIFT.encode(clientSpan);
  static final List<Span> tenClientSpans = Collections.nCopies(10, clientSpan);
  static final byte[] tenClientSpansJsonV2 = SpanBytesEncoder.JSON_V2.encodeList(tenClientSpans);

  @Benchmark
  public Span decodeClientSpan_JSON_V1() {
    return SpanBytesDecoder.JSON_V1.decodeOne(clientSpanJsonV1);
  }

  @Benchmark
  public Span decodeClientSpan_JSON_V2() {
    return SpanBytesDecoder.JSON_V2.decodeOne(clientSpanJsonV2);
  }

  @Benchmark
  public Span decodeClientSpan_PROTO3() {
    return SpanBytesDecoder.PROTO3.decodeOne(clientSpanProto3);
  }

  @Benchmark
  public Span decodeClientSpan_THRIFT() {
    return SpanBytesDecoder.THRIFT.decodeOne(clientSpanThrift);
  }

  @Benchmark
  public int sizeInBytesClientSpan_JSON_V2() {
    return SpanBytesEncoder.JSON_V2.sizeInBytes(clientSpan);
  }

  @Benchmark
  public int sizeInBytesClientSpan_JSON_V1() {
    return SpanBytesEncoder.JSON_V1.sizeInBytes(clientSpan);
  }

  @Benchmark
  public int sizeInBytesClientSpan_PROTO3() {
    return SpanBytesEncoder.PROTO3.sizeInBytes(clientSpan);
  }

  @Benchmark
  public int sizeInBytesClientSpan_THRIFT() {
    return SpanBytesEncoder.THRIFT.sizeInBytes(clientSpan);
  }

  @Benchmark
  public byte[] writeClientSpan_JSON_V2() {
    return SpanBytesEncoder.JSON_V2.encode(clientSpan);
  }

  @Benchmark
  public byte[] writeClientSpan_JSON_V1() {
    return SpanBytesEncoder.JSON_V1.encode(clientSpan);
  }

  @Benchmark
  public byte[] writeClientSpan_PROTO3() {
    return SpanBytesEncoder.PROTO3.encode(clientSpan);
  }

  @Benchmark
  public byte[] writeClientSpan_THRIFT() {
    return SpanBytesEncoder.THRIFT.encode(clientSpan);
  }

  @Benchmark
  public List<Span> decodeTenClientSpans_JSON_V2() {
    return SpanBytesDecoder.JSON_V2.decodeList(tenClientSpansJsonV2);
  }

  @Benchmark
  public byte[] writeTenClientSpans_JSON_V2() {
    return SpanBytesEncoder.JSON_V2.encodeList(tenClientSpans);
  }

  static final byte[] chineseSpanJsonV2 = resourceToString("/zipkin2-chinese.json").getBytes(UTF_8);
  static final Span chineseSpan = SpanBytesDecoder.JSON_V2.decodeOne(chineseSpanJsonV2);
  static final byte[] chineseSpanProto3 = SpanBytesEncoder.PROTO3.encode(chineseSpan);
  static final byte[] chineseSpanJsonV1 = SpanBytesEncoder.JSON_V1.encode(chineseSpan);
  static final byte[] chineseSpanThrift = SpanBytesEncoder.THRIFT.encode(chineseSpan);

  @Benchmark
  public Span decodeChineseSpan_JSON_V1() {
    return SpanBytesDecoder.JSON_V1.decodeOne(chineseSpanJsonV1);
  }

  @Benchmark
  public Span decodeChineseSpan_JSON_V2() {
    return SpanBytesDecoder.JSON_V2.decodeOne(chineseSpanJsonV2);
  }

  @Benchmark
  public Span decodeChineseSpan_PROTO3() {
    return SpanBytesDecoder.PROTO3.decodeOne(chineseSpanProto3);
  }

  @Benchmark
  public Span decodeChineseSpan_THRIFT() {
    return SpanBytesDecoder.THRIFT.decodeOne(chineseSpanThrift);
  }

  @Benchmark
  public byte[] writeChineseSpan_JSON_V2() {
    return SpanBytesEncoder.JSON_V2.encode(chineseSpan);
  }

  @Benchmark
  public byte[] writeChineseSpan_JSON_V1() {
    return SpanBytesEncoder.JSON_V1.encode(chineseSpan);
  }

  @Benchmark
  public byte[] writeChineseSpan_PROTO3() {
    return SpanBytesEncoder.PROTO3.encode(chineseSpan);
  }

  @Benchmark
  public byte[] writeChineseSpan_THRIFT() {
    return SpanBytesEncoder.THRIFT.encode(chineseSpan);
  }

  // Convenience main entry-point
  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
      .addProfiler("gc")
      .include(".*" + CodecBenchmarks.class.getSimpleName())
      .build();

    new Runner(opt).run();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/codec/JacksonSpanDecoder.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.codec;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import zipkin2.Annotation;
import zipkin2.Endpoint;
import zipkin2.Span;
import zipkin2.internal.ReadBuffer;

public final class JacksonSpanDecoder {

  static final JsonFactory JSON_FACTORY = new JsonFactory();

  public static List<Span> decodeList(byte[] spans) {
    try {
      return decodeList(JSON_FACTORY.createParser(spans));
    } catch (IOException e) {
      throw new UncheckedIOException(e);
    }
  }

  public static List<Span> decodeList(ByteBuffer spans) {
    try {
      return decodeList(JSON_FACTORY.createParser(ReadBuffer.wrapUnsafe(spans)));
    } catch (IOException e) {
      throw new UncheckedIOException(e);
    }
  }

  public static Span decodeOne(byte[] span) {
    try {
      return decodeOne(JSON_FACTORY.createParser(span));
    } catch (IOException e) {
      throw new UncheckedIOException(e);
    }
  }

  public static Span decodeOne(ByteBuffer span) {
    try {
      return decodeOne(JSON_FACTORY.createParser(ReadBuffer.wrapUnsafe(span)));
    } catch (IOException e) {
      throw new UncheckedIOException(e);
    }
  }

  static List<Span> decodeList(JsonParser jsonParser) {
    List<Span> out = new ArrayList<>();

    try {
      if (jsonParser.nextToken() != JsonToken.START_ARRAY) {
        throw new IOException("Not a valid JSON array, start token: " + jsonParser.currentToken());
      }

      while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
        out.add(parseSpan(jsonParser));
      }
    } catch (IOException e) {
      throw new UncheckedIOException(e);
    }

    return out;
  }

  static Span decodeOne(JsonParser jsonParser) {
    try {
      if (!jsonParser.hasCurrentToken()) {
        jsonParser.nextToken();
      }
      return parseSpan(jsonParser);
    } catch (IOException e) {
      throw new UncheckedIOException(e);
    }
  }

  static Span parseSpan(JsonParser jsonParser) throws IOException {
    if (!jsonParser.isExpectedStartObjectToken()) {
      throw new IOException("Not a valid JSON object, start token: " +
        jsonParser.currentToken());
    }

    Span.Builder result = Span.newBuilder();

    while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
      String fieldName = jsonParser.currentName();
      JsonToken value = jsonParser.nextToken();
      if (value == JsonToken.VALUE_NULL) {
        continue;
      }
      switch (fieldName) {
        case "traceId":
          result.traceId(jsonParser.getValueAsString());
          break;
        case "parentId":
          result.parentId(jsonParser.getValueAsString());
          break;
        case "id":
          result.id(jsonParser.getValueAsString());
          break;
        case "kind":
          result.kind(Span.Kind.valueOf(jsonParser.getValueAsString()));
          break;
        case "name":
          result.name(jsonParser.getValueAsString());
          break;
        case "timestamp":
          result.timestamp(jsonParser.getValueAsLong());
          break;
        case "duration":
          result.duration(jsonParser.getValueAsLong());
          break;
        case "localEndpoint":
          result.localEndpoint(parseEndpoint(jsonParser));
          break;
        case "remoteEndpoint":
          result.remoteEndpoint(parseEndpoint(jsonParser));
          break;
        case "annotations":
          if (!jsonParser.isExpectedStartArrayToken()) {
            throw new IOException("Invalid span, expecting annotations array start, got: " +
              value);
          }
          while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
            Annotation a = parseAnnotation(jsonParser);
            result.addAnnotation(a.timestamp(), a.value());
          }
          break;
        case "tags":
          if (value != JsonToken.START_OBJECT) {
            throw new IOException("Invalid span, expecting tags object, got: " + value);
          }
          while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
            result.putTag(jsonParser.currentName(), jsonParser.nextTextValue());
          }
          break;
        case "debug":
          result.debug(jsonParser.getBooleanValue());
          break;
        case "shared":
          result.shared(jsonParser.getBooleanValue());
          break;
        default:
          jsonParser.skipChildren();
      }
    }

    return result.build();
  }

  static Endpoint parseEndpoint(JsonParser jsonParser) throws IOException {
    if (!jsonParser.isExpectedStartObjectToken()) {
      throw new IOException("Not a valid JSON object, start token: " +
        jsonParser.currentToken());
    }

    String serviceName = null, ipv4 = null, ipv6 = null;
    int port = 0;

    while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
      String fieldName = jsonParser.currentName();
      JsonToken value = jsonParser.nextToken();
      if (value == JsonToken.VALUE_NULL) {
        continue;
      }

      switch (fieldName) {
        case "serviceName":
          serviceName = jsonParser.getValueAsString();
          break;
        case "ipv4":
          ipv4 = jsonParser.getValueAsString();
          break;
        case "ipv6":
          ipv6 = jsonParser.getValueAsString();
          break;
        case "port":
          port = jsonParser.getValueAsInt();
          break;
        default:
          jsonParser.skipChildren();
      }
    }

    if (serviceName == null && ipv4 == null && ipv6 == null && port == 0) return null;
    return Endpoint.newBuilder()
      .serviceName(serviceName)
      .ip(ipv4)
      .ip(ipv6)
      .port(port)
      .build();
  }

  static Annotation parseAnnotation(JsonParser jsonParser) throws IOException {
    if (!jsonParser.isExpectedStartObjectToken()) {
      throw new IOException("Not a valid JSON object, start token: " +
        jsonParser.currentToken());
    }

    long timestamp = 0;
    String value = null;

    while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
      String fieldName = jsonParser.currentName();

      switch (fieldName) {
        case "timestamp":
          timestamp = jsonParser.getValueAsLong();
          break;
        case "value":
          value = jsonParser.getValueAsString();
          break;
        default:
          jsonParser.skipChildren();
      }
    }

    if (timestamp == 0 || value == null) {
      throw new IllegalStateException("Incomplete annotation at " + jsonParser.currentToken());
    }
    return Annotation.create(timestamp, value);
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/codec/JacksonSpanDecoderTest.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static zipkin2.TestObjects.CLIENT_SPAN;
import static zipkin2.TestObjects.TRACE;

public class JacksonSpanDecoderTest {
  byte[] encoded = SpanBytesEncoder.JSON_V2.encodeList(TRACE);
  byte[] encodedSpan = SpanBytesEncoder.JSON_V2.encode(CLIENT_SPAN);

  @Test void decodeList_bytes() {
    assertThat(JacksonSpanDecoder.decodeList(encoded))
      .isEqualTo(TRACE);
  }

  @Test void decodeList_byteBuffer() {
    ByteBuf encodedBuf = PooledByteBufAllocator.DEFAULT.buffer(encoded.length);
    encodedBuf.writeBytes(encoded);
    try {
      assertThat(JacksonSpanDecoder.decodeList(encodedBuf.nioBuffer()))
        .isEqualTo(TRACE);
    } finally {
      encodedBuf.release();
    }
  }

  @Test void decodeOne() {
    assertThat(JacksonSpanDecoder.decodeOne(encodedSpan))
      .isEqualTo(CLIENT_SPAN);
  }

  @Test void decodeOne_byteBuffer() {
    ByteBuf encodedBuf = PooledByteBufAllocator.DEFAULT.buffer(encodedSpan.length);
    encodedBuf.writeBytes(encodedSpan);
    try {
      assertThat(JacksonSpanDecoder.decodeOne(encodedBuf.nioBuffer()))
        .isEqualTo(CLIENT_SPAN);
    } finally {
      encodedBuf.release();
    }
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/codec/JsonCodecBenchmarks.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.TearDown;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import zipkin2.Span;

import static java.nio.charset.StandardCharsets.UTF_8;
import static zipkin2.storage.cassandra.internal.Resources.resourceToString;

@Measurement(iterations = 5, time = 1)
@Warmup(iterations = 10, time = 1)
@Fork(3)
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Threads(1)
public class JsonCodecBenchmarks {
  static final MoshiSpanDecoder MOSHI = MoshiSpanDecoder.create();

  static final byte[] clientSpanJsonV2 = resourceToString("/zipkin2-client.json").getBytes(UTF_8);
  static final Span clientSpan = SpanBytesDecoder.JSON_V2.decodeOne(clientSpanJsonV2);

  // Assume a message is 1000 spans (which is a high number for as this is per-node-second)
  static final List<Span> spans = Collections.nCopies(1000, clientSpan);
  static final byte[] encodedBytes = SpanBytesEncoder.JSON_V2.encodeList(spans);

  private ByteBuf encodedBuf;

  @Setup public void setup() {
    encodedBuf = PooledByteBufAllocator.DEFAULT.buffer(encodedBytes.length);
    encodedBuf.writeBytes(encodedBytes);
  }

  @TearDown public void tearDown() {
    encodedBuf.release();
  }

  @Benchmark public List<Span> bytes_jacksonDecoder() {
    return JacksonSpanDecoder.decodeList(encodedBytes);
  }

  @Benchmark public List<Span> bytes_moshiDecoder() {
    return MOSHI.decodeList(encodedBytes);
  }

  @Benchmark public List<Span> bytes_zipkinDecoder() {
    return SpanBytesDecoder.JSON_V2.decodeList(encodedBytes);
  }

  @Benchmark public List<Span> bytebuffer_jacksonDecoder() {
    return JacksonSpanDecoder.decodeList(encodedBuf.nioBuffer());
  }

  @Benchmark public List<Span> bytebuffer_moshiDecoder() {
    return MOSHI.decodeList(encodedBuf.nioBuffer());
  }

  @Benchmark public List<Span> bytebuffer_zipkinDecoder() {
    return SpanBytesDecoder.JSON_V2.decodeList(encodedBuf.nioBuffer());
  }

  // Convenience main entry-point
  public static void main(String[] args) throws Exception {
    Options opt = new OptionsBuilder()
      .include(".*" + JsonCodecBenchmarks.class.getSimpleName() + ".*")
      .addProfiler("gc")
      .build();

    new Runner(opt).run();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/codec/MoshiSpanDecoder.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.codec;

import com.squareup.moshi.JsonAdapter;
import com.squareup.moshi.JsonReader;
import com.squareup.moshi.JsonWriter;
import com.squareup.moshi.Moshi;
import com.squareup.moshi.Types;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.List;
import okio.Buffer;
import okio.BufferedSource;
import okio.Okio;
import okio.Timeout;
import zipkin2.Annotation;
import zipkin2.Endpoint;
import zipkin2.Span;
import zipkin2.internal.Nullable;

/**
 * Read-only json adapters resurrected from before we switched to Java 6 as storage components can
 * be Java 7+
 */
public final class MoshiSpanDecoder {
  final JsonAdapter<List<Span>> listSpansAdapter;

  public static MoshiSpanDecoder create() {
    return new MoshiSpanDecoder();
  }

  MoshiSpanDecoder() {
    listSpansAdapter = new Moshi.Builder()
      .add(Span.class, SPAN_ADAPTER)
      .build().adapter(Types.newParameterizedType(List.class, Span.class));
  }

  public List<Span> decodeList(byte[] spans) {
    BufferedSource source = new Buffer().write(spans);
    try {
      return listSpansAdapter.fromJson(source);
    } catch (IOException e) {
      throw new AssertionError(e); // no I/O
    }
  }

  public List<Span> decodeList(ByteBuffer spans) {
    try {
      return listSpansAdapter.fromJson(JsonReader.of(Okio.buffer(new ByteBufferSource(spans))));
    } catch (IOException e) {
      throw new AssertionError(e); // no I/O
    }
  }

  static final class ByteBufferSource implements okio.Source {
    final ByteBuffer source;

    final Buffer.UnsafeCursor cursor = new Buffer.UnsafeCursor();

    ByteBufferSource(ByteBuffer source) {
      this.source = source;
    }

    @Override public long read(Buffer sink, long byteCount) {
      try (Buffer.UnsafeCursor ignored = sink.readAndWriteUnsafe(cursor)) {
        long oldSize = sink.size();
        int length = (int) Math.min(source.remaining(), Math.min(8192, byteCount));
        if (length == 0) return -1;
        cursor.expandBuffer(length);
        source.get(cursor.data, cursor.start, length);
        cursor.resizeBuffer(oldSize + length);
        return length;
      }
    }

    @Override public Timeout timeout() {
      return Timeout.NONE;
    }

    @Override public void close() {
    }
  }

  public static final JsonAdapter<Span> SPAN_ADAPTER =
    new JsonAdapter<Span>() {
      @Override
      public Span fromJson(JsonReader reader) throws IOException {
        Span.Builder result = Span.newBuilder();
        reader.beginObject();
        while (reader.hasNext()) {
          String nextName = reader.nextName();
          if (reader.peek() == JsonReader.Token.NULL) {
            reader.skipValue();
            continue;
          }
          switch (nextName) {
            case "traceId":
              result.traceId(reader.nextString());
              break;
            case "parentId":
              result.parentId(reader.nextString());
              break;
            case "id":
              result.id(reader.nextString());
              break;
            case "kind":
              result.kind(Span.Kind.valueOf(reader.nextString()));
              break;
            case "name":
              result.name(reader.nextString());
              break;
            case "timestamp":
              result.timestamp(reader.nextLong());
              break;
            case "duration":
              result.duration(reader.nextLong());
              break;
            case "localEndpoint":
              result.localEndpoint(ENDPOINT_ADAPTER.fromJson(reader));
              break;
            case "remoteEndpoint":
              result.remoteEndpoint(ENDPOINT_ADAPTER.fromJson(reader));
              break;
            case "annotations":
              reader.beginArray();
              while (reader.hasNext()) {
                Annotation a = ANNOTATION_ADAPTER.fromJson(reader);
                result.addAnnotation(a.timestamp(), a.value());
              }
              reader.endArray();
              break;
            case "tags":
              reader.beginObject();
              while (reader.hasNext()) {
                result.putTag(reader.nextName(), reader.nextString());
              }
              reader.endObject();
              break;
            case "debug":
              result.debug(reader.nextBoolean());
              break;
            case "shared":
              result.shared(reader.nextBoolean());
              break;
            default:
              reader.skipValue();
          }
        }
        reader.endObject();
        return result.build();
      }

      @Override
      public void toJson(JsonWriter writer, @Nullable Span value) {
        throw new UnsupportedOperationException();
      }
    };

  static final JsonAdapter<Annotation> ANNOTATION_ADAPTER =
    new JsonAdapter<Annotation>() {
      @Override
      public Annotation fromJson(JsonReader reader) throws IOException {
        reader.beginObject();
        Long timestamp = null;
        String value = null;
        while (reader.hasNext()) {
          switch (reader.nextName()) {
            case "timestamp":
              timestamp = reader.nextLong();
              break;
            case "value":
              value = reader.nextString();
              break;
            default:
              reader.skipValue();
          }
        }
        reader.endObject();
        if (timestamp == null || value == null) {
          throw new IllegalStateException("Incomplete annotation at " + reader.getPath());
        }
        return Annotation.create(timestamp, value);
      }

      @Override
      public void toJson(JsonWriter writer, @Nullable Annotation value) {
        throw new UnsupportedOperationException();
      }
    };

  static final JsonAdapter<Endpoint> ENDPOINT_ADAPTER =
    new JsonAdapter<Endpoint>() {
      @Override
      public Endpoint fromJson(JsonReader reader) throws IOException {
        reader.beginObject();
        String serviceName = null, ipv4 = null, ipv6 = null;
        int port = 0;
        while (reader.hasNext()) {
          String nextName = reader.nextName();
          if (reader.peek() == JsonReader.Token.NULL) {
            reader.skipValue();
            continue;
          }
          switch (nextName) {
            case "serviceName":
              serviceName = reader.nextString();
              break;
            case "ipv4":
              ipv4 = reader.nextString();
              break;
            case "ipv6":
              ipv6 = reader.nextString();
              break;
            case "port":
              port = reader.nextInt();
              break;
            default:
              reader.skipValue();
          }
        }
        reader.endObject();
        if (serviceName == null && ipv4 == null && ipv6 == null && port == 0) return null;
        return Endpoint.newBuilder()
          .serviceName(serviceName)
          .ip(ipv4)
          .ip(ipv6)
          .port(port)
          .build();
      }

      @Override
      public void toJson(JsonWriter writer, @Nullable Endpoint value) {
        throw new UnsupportedOperationException();
      }
    }.nullSafe();
}


================================================
FILE: benchmarks/src/test/java/zipkin2/codec/MoshiSpanDecoderTest.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static zipkin2.TestObjects.TRACE;

public class MoshiSpanDecoderTest {
  byte[] encoded = SpanBytesEncoder.JSON_V2.encodeList(TRACE);

  @Test void decodeList_bytes() {
    assertThat(new MoshiSpanDecoder().decodeList(encoded))
      .isEqualTo(TRACE);
  }

  @Test void decodeList_byteBuffer() {
    ByteBuf encodedBuf = PooledByteBufAllocator.DEFAULT.buffer(encoded.length);
    encodedBuf.writeBytes(encoded);
    try {
      assertThat(new MoshiSpanDecoder().decodeList(encodedBuf.nioBuffer()))
        .isEqualTo(TRACE);
    } finally {
      encodedBuf.release();
    }
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/codec/ProtoCodecBenchmarks.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.TearDown;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import zipkin2.Span;

import static java.nio.charset.StandardCharsets.UTF_8;
import static zipkin2.storage.cassandra.internal.Resources.resourceToString;

@Measurement(iterations = 5, time = 1)
@Warmup(iterations = 10, time = 1)
@Fork(3)
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Threads(1)
public class ProtoCodecBenchmarks {

  static final byte[] clientSpanJsonV2 = resourceToString("/zipkin2-client.json").getBytes(UTF_8);
  static final Span clientSpan = SpanBytesDecoder.JSON_V2.decodeOne(clientSpanJsonV2);

  // Assume a message is 1000 spans (which is a high number for as this is per-node-second)
  static final List<Span> spans = Collections.nCopies(1000, clientSpan);
  static final byte[] encodedBytes = SpanBytesEncoder.PROTO3.encodeList(spans);

  private ByteBuf encodedBuf;

  @Setup
  public void setup() {
    encodedBuf = PooledByteBufAllocator.DEFAULT.buffer(encodedBytes.length);
    encodedBuf.writeBytes(encodedBytes);
  }

  @TearDown
  public void tearDown() {
    encodedBuf.release();
  }

  @Benchmark
  public List<Span> bytes_zipkinDecoder() {
    return SpanBytesDecoder.PROTO3.decodeList(encodedBytes);
  }

  @Benchmark
  public List<Span> bytes_protobufDecoder() {
    return ProtobufSpanDecoder.decodeList(encodedBytes);
  }

  @Benchmark
  public List<Span> bytes_wireDecoder() {
    return WireSpanDecoder.decodeList(encodedBytes);
  }

  @Benchmark
  public List<Span> bytebuffer_zipkinDecoder() {
    return SpanBytesDecoder.PROTO3.decodeList(encodedBuf.nioBuffer());
  }

  @Benchmark
  public List<Span> bytebuffer_protobufDecoder() {
    return ProtobufSpanDecoder.decodeList(encodedBuf.nioBuffer());
  }

  @Benchmark
  public List<Span> bytebuffer_wireDecoder() {
    return WireSpanDecoder.decodeList(encodedBuf.nioBuffer());
  }

  // Convenience main entry-point
  public static void main(String[] args) throws Exception {
    Options opt = new OptionsBuilder()
      .include(".*" + ProtoCodecBenchmarks.class.getSimpleName())
      .addProfiler("gc")
      .build();

    new Runner(opt).run();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/codec/ProtobufSpanDecoder.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.codec;

import com.google.protobuf.CodedInputStream;
import com.google.protobuf.WireFormat;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import zipkin2.Endpoint;
import zipkin2.Span;
import zipkin2.internal.RecyclableBuffers;

public class ProtobufSpanDecoder {
  static final Logger LOG = Logger.getLogger(ProtobufSpanDecoder.class.getName());
  static final boolean DEBUG = false;

  // map<string,string> in proto is a special field with key, value
  static final int MAP_KEY_KEY = (1 << 3) | WireFormat.WIRETYPE_LENGTH_DELIMITED;
  static final int MAP_VALUE_KEY = (2 << 3) | WireFormat.WIRETYPE_LENGTH_DELIMITED;

  static boolean decodeTag(CodedInputStream input, Span.Builder span) throws IOException {
    // now, we are in the tag fields
    String key = null, value = ""; // empty tags allowed

    boolean done = false;
    while (!done) {
      int tag = input.readTag();
      switch (tag) {
        case 0:
          done = true;
          break;
        case MAP_KEY_KEY: {
          key = input.readStringRequireUtf8();
          break;
        }
        case MAP_VALUE_KEY: {
          value = input.readStringRequireUtf8();
          break;
        }
        default: {
          logAndSkip(input, tag);
          break;
        }
      }
    }

    if (key == null) return false;
    span.putTag(key, value);
    return true;
  }

  static boolean decodeAnnotation(CodedInputStream input, Span.Builder span) throws IOException {
    long timestamp = 0L;
    String value = null;

    boolean done = false;
    while (!done) {
      int tag = input.readTag();
      switch (tag) {
        case 0:
          done = true;
          break;
        case 9: {
          timestamp = input.readFixed64();
          break;
        }
        case 18: {
          value = input.readStringRequireUtf8();
          break;
        }
        default: {
          logAndSkip(input, tag);
          break;
        }
      }
    }

    if (timestamp == 0L || value == null) return false;
    span.addAnnotation(timestamp, value);
    return true;
  }

  private static Endpoint decodeEndpoint(CodedInputStream input) throws IOException {
    Endpoint.Builder endpoint = Endpoint.newBuilder();

    boolean done = false;
    while (!done) {
      int tag = input.readTag();
      switch (tag) {
        case 0:
          done = true;
          break;
        case 10: {
          endpoint.serviceName(input.readStringRequireUtf8());
          break;
        }
        case 18:
        case 26: {
          endpoint.parseIp(input.readByteArray());
          break;
        }
        case 32: {
          endpoint.port(input.readInt32());
          break;
        }
        default: {
          logAndSkip(input, tag);
          break;
        }
      }
    }
    return endpoint.build();
  }

  public static Span decodeOne(CodedInputStream input) throws IOException {
    Span.Builder span = Span.newBuilder();

    boolean done = false;
    while (!done) {
      int tag = input.readTag();
      switch (tag) {
        case 0:
          done = true;
          break;
        case 10: {
          span.traceId(readHexString(input));
          break;
        }
        case 18: {
          span.parentId(readHexString(input));
          break;
        }
        case 26: {
          span.id(readHexString(input));
          break;
        }
        case 32: {
          int kind = input.readEnum();
          if (kind == 0) break;
          if (kind > Span.Kind.values().length) break;
          span.kind(Span.Kind.values()[kind - 1]);
          break;
        }
        case 42: {
          span.name(input.readStringRequireUtf8());
          break;
        }
        case 49: {
          span.timestamp(input.readFixed64());
          break;
        }
        case 56: {
          span.duration(input.readUInt64());
          break;
        }
        case 66: {
          int length = input.readRawVarint32();
          int oldLimit = input.pushLimit(length);

          span.localEndpoint(decodeEndpoint(input));

          input.checkLastTagWas(0);
          input.popLimit(oldLimit);
          break;
        }
        case 74: {
          int length = input.readRawVarint32();
          int oldLimit = input.pushLimit(length);

          span.remoteEndpoint(decodeEndpoint(input));

          input.checkLastTagWas(0);
          input.popLimit(oldLimit);
          break;
        }
        case 82: {
          int length = input.readRawVarint32();
          int oldLimit = input.pushLimit(length);

          decodeAnnotation(input, span);

          input.checkLastTagWas(0);
          input.popLimit(oldLimit);
          break;
        }
        case 90: {
          int length = input.readRawVarint32();
          int oldLimit = input.pushLimit(length);

          decodeTag(input, span);

          input.checkLastTagWas(0);
          input.popLimit(oldLimit);
          break;
        }
        case 96: {
          span.debug(input.readBool());
          break;
        }
        case 104: {
          span.shared(input.readBool());
          break;
        }
        default: {
          logAndSkip(input, tag);
          break;
        }
      }
    }

    return span.build();
  }

  public static List<Span> decodeList(byte[] spans) {
    return decodeList(CodedInputStream.newInstance(spans));
  }

  public static List<Span> decodeList(ByteBuffer spans) {
    return decodeList(CodedInputStream.newInstance(spans));
  }

  public static List<Span> decodeList(CodedInputStream input) {
    ArrayList<Span> spans = new ArrayList<>();

    try {
      boolean done = false;
      while (!done) {
        int tag = input.readTag();
        switch (tag) {
          case 0:
            done = true;
            break;
          case 10:
            int length = input.readRawVarint32();
            int oldLimit = input.pushLimit(length);
            spans.add(decodeOne(input));
            input.checkLastTagWas(0);
            input.popLimit(oldLimit);
            break;
          default: {
            logAndSkip(input, tag);
            break;
          }
        }
      }
    } catch (IOException e) {
      throw new RuntimeException(e);
    }

    return spans;
  }

  static final char[] HEX_DIGITS =
    {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

  private static String readHexString(CodedInputStream input) throws IOException {
    int size = input.readRawVarint32();
    int length = size * 2;

    // All our hex fields are at most 32 characters.
    if (length > 32) {
      throw new AssertionError("hex field greater than 32 chars long: " + length);
    }

    char[] result = RecyclableBuffers.shortStringBuffer();

    for (int i = 0; i < length; i += 2) {
      byte b = input.readRawByte();
      result[i] = HEX_DIGITS[(b >> 4) & 0xf];
      result[i + 1] = HEX_DIGITS[b & 0xf];
    }

    return new String(result, 0, length);
  }

  static void logAndSkip(CodedInputStream input, int tag) throws IOException {
    if (DEBUG) { // avoiding volatile reads as we don't log on skip in our normal codec
      int nextWireType = WireFormat.getTagWireType(tag);
      int nextFieldNumber = WireFormat.getTagFieldNumber(tag);
      LOG.fine("Skipping field: byte=%s, fieldNumber=%s, wireType=%s".formatted(
        input.getTotalBytesRead(), nextFieldNumber, nextWireType));
    }
    input.skipField(tag);
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/codec/WireSpanDecoder.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.codec;

import com.google.protobuf.WireFormat;
import com.squareup.wire.ProtoAdapter;
import com.squareup.wire.ProtoReader;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import okio.Buffer;
import okio.ByteString;
import zipkin2.Endpoint;
import zipkin2.Span;
import zipkin2.internal.RecyclableBuffers;

public class WireSpanDecoder {
  static final Logger LOG = Logger.getLogger(WireSpanDecoder.class.getName());
  static final boolean DEBUG = false;

  static boolean decodeTag(ProtoReader input, Span.Builder span) throws IOException {
    // now, we are in the tag fields
    String key = null, value = ""; // empty tags allowed

    boolean done = false;
    while (!done) {
      int tag = input.nextTag();
      switch (tag) {
        case -1:
          done = true;
          break;
        case 1: {
          key = input.readString();
          break;
        }
        case 2: {
          value = input.readString();
          break;
        }
        default: {
          logAndSkip(input, tag);
          break;
        }
      }
    }

    if (key == null) return false;
    span.putTag(key, value);
    return true;
  }

  static boolean decodeAnnotation(ProtoReader input, Span.Builder span) throws IOException {
    long timestamp = 0L;
    String value = null;

    boolean done = false;
    while (!done) {
      int tag = input.nextTag();
      switch (tag) {
        case -1:
          done = true;
          break;
        case 1: {
          timestamp = input.readFixed64();
          break;
        }
        case 2: {
          value = input.readString();
          break;
        }
        default: {
          logAndSkip(input, tag);
          break;
        }
      }
    }

    if (timestamp == 0L || value == null) return false;
    span.addAnnotation(timestamp, value);
    return true;
  }

  private static Endpoint decodeEndpoint(ProtoReader input) throws IOException {
    Endpoint.Builder endpoint = Endpoint.newBuilder();

    boolean done = false;
    while (!done) {
      int tag = input.nextTag();
      switch (tag) {
        case -1:
          done = true;
          break;
        case 1: {
          String s = input.readString();
          endpoint.serviceName(s);
          break;
        }
        case 2:
        case 3: {
          endpoint.parseIp(input.readBytes().toByteArray());
          break;
        }
        case 4: {
          endpoint.port(input.readVarint32());
          break;
        }
        default: {
          logAndSkip(input, tag);
          break;
        }
      }
    }
    return endpoint.build();
  }

  public static Span decodeOne(ProtoReader input) throws IOException {
    Span.Builder span = Span.newBuilder();

    boolean done = false;
    while (!done) {
      int tag = input.nextTag();
      switch (tag) {
        case -1:
          done = true;
          break;
        case 1: {
          span.traceId(readHexString(input));
          break;
        }
        case 2: {
          span.parentId(readHexString(input));
          break;
        }
        case 3: {
          span.id(readHexString(input));
          break;
        }
        case 4: {
          int kind = input.readVarint32();
          if (kind == 0) break;
          if (kind > Span.Kind.values().length) break;
          span.kind(Span.Kind.values()[kind - 1]);
          break;
        }
        case 5: {
          String name = input.readString();
          span.name(name);
          break;
        }
        case 6: {
          span.timestamp(input.readFixed64());
          break;
        }
        case 7: {
          span.duration(input.readVarint64());
          break;
        }
        case 8: {
          long token = input.beginMessage();

          span.localEndpoint(decodeEndpoint(input));

          input.endMessageAndGetUnknownFields(token);
          break;
        }
        case 9: {
          long token = input.beginMessage();

          span.remoteEndpoint(decodeEndpoint(input));

          input.endMessageAndGetUnknownFields(token);
          break;
        }
        case 10: {
          long token = input.beginMessage();

          decodeAnnotation(input, span);

          input.endMessageAndGetUnknownFields(token);
          break;
        }
        case 11: {
          long token = input.beginMessage();

          decodeTag(input, span);

          input.endMessageAndGetUnknownFields(token);
          break;
        }
        case 12: {
          span.debug(ProtoAdapter.BOOL.decode(input));
          break;
        }
        case 13: {
          span.shared(ProtoAdapter.BOOL.decode(input));
          break;
        }
        default: {
          logAndSkip(input, tag);
          break;
        }
      }
    }

    return span.build();
  }

  public static List<Span> decodeList(byte[] spans) {
    return decodeList(new ProtoReader(new Buffer().write(spans)));
  }

  public static List<Span> decodeList(ByteBuffer spans) {
    Buffer buffer = new Buffer();
    try {
      buffer.write(spans);
    } catch (IOException e) {
      throw new AssertionError(e); // no I/O
    }
    return decodeList(new ProtoReader(buffer));
  }

  public static List<Span> decodeList(ProtoReader input) {
    ArrayList<Span> spans = new ArrayList<>();

    final long token;
    try {
      token = input.beginMessage();
    } catch (IOException e) {
      throw new UncheckedIOException(e);
    }

    try {
      boolean done = false;
      while (!done) {
        int tag = input.nextTag();
        switch (tag) {
          case -1:
            done = true;
            break;
          case 1: {
            long subToken = input.beginMessage();

            spans.add(decodeOne(input));

            input.endMessageAndGetUnknownFields(subToken);
            break;
          }
          default: {
            logAndSkip(input, tag);
            break;
          }
        }
      }
    } catch (IOException e) {
      throw new RuntimeException(e);
    }

    try {
      input.endMessageAndGetUnknownFields(token);
    } catch (IOException e) {
      throw new UncheckedIOException(e);
    }

    return spans;
  }

  static final char[] HEX_DIGITS =
    {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

  // https://github.com/square/wire/issues/958
  private static String readHexString(ProtoReader input) throws IOException {
    ByteString bytes = input.readBytes();
    int length = bytes.size() * 2;

    // All our hex fields are at most 32 characters.
    if (length > 32) {
      throw new AssertionError("hex field greater than 32 chars long: " + length);
    }

    char[] result = RecyclableBuffers.shortStringBuffer();

    for (int i = 0; i < bytes.size(); i++) {
      byte b = bytes.getByte(i);
      result[2 * i] = HEX_DIGITS[(b >> 4) & 0xf];
      result[2 * i + 1] = HEX_DIGITS[b & 0xf];
    }

    return new String(result, 0, length);
  }

  static void logAndSkip(ProtoReader input, int tag) throws IOException {
    if (DEBUG) { // avoiding volatile reads as we don't log on skip in our normal codec
      int nextWireType = WireFormat.getTagWireType(tag);
      int nextFieldNumber = WireFormat.getTagFieldNumber(tag);
      LOG.fine("Skipping field: byte=%s, fieldNumber=%s, wireType=%s".formatted(
        0, nextFieldNumber, nextWireType));
    }
    input.skip();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/collector/MetricsBenchmarks.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.collector;

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import zipkin2.server.internal.MicrometerCollectorMetrics;

@Measurement(iterations = 80, time = 1)
@Warmup(iterations = 20, time = 1)
@Fork(3)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Threads(1)
public class MetricsBenchmarks {
  static final int LONG_SPAN = 5000;
  static final int MEDIUM_SPAN = 1000;
  static final int SHORT_SPAN = 500;
  private MeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
  private InMemoryCollectorMetrics inMemoryCollectorMetrics = new InMemoryCollectorMetrics()
    .forTransport("jmh");
  private MicrometerCollectorMetrics micrometerCollectorMetrics =
    new MicrometerCollectorMetrics(registry)
      .forTransport("jmh");

  @Benchmark
  public int incrementBytes_longSpans_inMemory() {
    return incrementBytes(inMemoryCollectorMetrics, LONG_SPAN);
  }

  @Benchmark
  public int incrementBytes_longSpans_Actuate() {
    return incrementBytes(micrometerCollectorMetrics, LONG_SPAN);
  }

  @Benchmark
  public int incrementBytes_mediumSpans_inMemory() {
    return incrementBytes(inMemoryCollectorMetrics, MEDIUM_SPAN);
  }

  @Benchmark
  public int incrementBytes_mediumSpans_Actuate() {
    return incrementBytes(micrometerCollectorMetrics, MEDIUM_SPAN);
  }

  @Benchmark
  public int incrementBytes_shortSpans_inMemory() {
    return incrementBytes(inMemoryCollectorMetrics, SHORT_SPAN);
  }

  @Benchmark
  public int incrementBytes_shortSpans_Actuate() {
    return incrementBytes(micrometerCollectorMetrics, SHORT_SPAN);
  }

  private int incrementBytes(CollectorMetrics collectorMetrics, int bytes) {
    collectorMetrics.incrementBytes(bytes);
    return bytes;
  }

  // Convenience main entry-point
  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
      .include(".*" + MetricsBenchmarks.class.getSimpleName() + ".*")
      .threads(40)
      .build();

    new Runner(opt).run();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/elasticsearch/internal/BulkRequestBenchmarks.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.elasticsearch.internal;

import com.linecorp.armeria.common.HttpRequest;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import zipkin2.Span;
import zipkin2.codec.SpanBytesDecoder;
import zipkin2.elasticsearch.ElasticsearchStorage;
import zipkin2.elasticsearch.internal.BulkCallBuilder.IndexEntry;

import static java.nio.charset.StandardCharsets.UTF_8;
import static zipkin2.elasticsearch.ElasticsearchVersion.V6_0;
import static zipkin2.storage.cassandra.internal.Resources.resourceToString;

@Measurement(iterations = 5, time = 1)
@Warmup(iterations = 10, time = 1)
@Fork(3)
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Threads(2)
public class BulkRequestBenchmarks {
  static final Span CLIENT_SPAN =
    SpanBytesDecoder.JSON_V2.decodeOne(resourceToString("/zipkin2-client.json").getBytes(UTF_8));

  final ElasticsearchStorage es = ElasticsearchStorage.newBuilder(() -> null).build();
  final long indexTimestamp = CLIENT_SPAN.timestampAsLong() / 1000L;
  final String spanIndex =
    es.indexNameFormatter().formatTypeAndTimestampForInsert("span", '-', indexTimestamp);
  final IndexEntry<Span> entry =
    BulkCallBuilder.newIndexEntry(spanIndex, "span", CLIENT_SPAN, BulkIndexWriter.SPAN);

  @Benchmark public ByteBuf writeRequest_singleSpan() {
    return BulkCallBuilder.serialize(PooledByteBufAllocator.DEFAULT, entry, true);
  }

  @Benchmark public HttpRequest buildAndWriteRequest_singleSpan() {
    BulkCallBuilder builder = new BulkCallBuilder(es, V6_0, "index-span");
    builder.index(spanIndex, "span", CLIENT_SPAN, BulkIndexWriter.SPAN);
    return builder.build().request.get();
  }

  @Benchmark public HttpRequest buildAndWriteRequest_tenSpans() {
    BulkCallBuilder builder = new BulkCallBuilder(es, V6_0, "index-span");
    for (int i = 0; i < 10; i++) {
      builder.index(spanIndex, "span", CLIENT_SPAN, BulkIndexWriter.SPAN);
    }
    return builder.build().request.get();
  }

  // Convenience main entry-point
  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
      .addProfiler("gc")
      .include(".*" + BulkRequestBenchmarks.class.getSimpleName() + ".*")
      .build();

    new Runner(opt).run();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/internal/DelayLimiterBenchmarks.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.internal;

import java.util.Random;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@Measurement(iterations = 5, time = 1)
@Warmup(iterations = 10, time = 1)
@Fork(3)
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Threads(2)
public class DelayLimiterBenchmarks {

  final Random rng = new Random();
  final DelayLimiter<Long> limiter = DelayLimiter.newBuilder()
    .ttl(1L, TimeUnit.HOURS) // legacy default from Cassandra
    .cardinality(5 * 4000) // Ex. 5 site tags with cardinality 4000 each
    .build();

  @Benchmark public boolean shouldInvoke_randomData() {
    return limiter.shouldInvoke(rng.nextLong());
  }

  @Benchmark public boolean shouldInvoke_sameData() {
    return limiter.shouldInvoke(1L);
  }

  // Convenience main entry-point
  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
      .addProfiler("gc")
      .include(".*" + DelayLimiterBenchmarks.class.getSimpleName() + ".*")
      .build();

    new Runner(opt).run();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/internal/Proto3CodecInteropTest.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.internal;

import com.squareup.wire.ProtoWriter;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import okio.ByteString;
import org.assertj.core.data.MapEntry;
import org.junit.jupiter.api.Test;
import zipkin2.codec.SpanBytesDecoder;
import zipkin2.codec.SpanBytesEncoder;
import zipkin2.internal.Proto3ZipkinFields.TagField;
import zipkin2.proto3.Annotation;
import zipkin2.proto3.Endpoint;
import zipkin2.proto3.ListOfSpans;
import zipkin2.proto3.Span;

import static okio.ByteString.decodeHex;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.data.MapEntry.entry;
import static zipkin2.internal.Proto3ZipkinFields.SPAN;
import static zipkin2.internal.Proto3ZipkinFields.SpanField.ANNOTATION;
import static zipkin2.internal.Proto3ZipkinFields.SpanField.LOCAL_ENDPOINT;
import static zipkin2.internal.Proto3ZipkinFields.SpanField.REMOTE_ENDPOINT;
import static zipkin2.internal.Proto3ZipkinFields.SpanField.TAG_KEY;

// Compares against Square Wire as it is easier than Google's protobuf tooling
public class Proto3CodecInteropTest {
  static final zipkin2.Endpoint ORDER = zipkin2.Endpoint.newBuilder()
    .serviceName("订单维护服务")
    .ip("2001:db8::c001")
    .build();

  static final zipkin2.Endpoint PROFILE = zipkin2.Endpoint.newBuilder()
    .serviceName("个人信息服务")
    .ip("192.168.99.101")
    .port(9000)
    .build();

  static final zipkin2.Span ZIPKIN_SPAN = zipkin2.Span.newBuilder()
    .traceId("4d1e00c0db9010db86154a4ba6e91385")
    .parentId("86154a4ba6e91385")
    .id("4d1e00c0db9010db")
    .kind(zipkin2.Span.Kind.SERVER)
    .name("个人信息查询")
    .timestamp(1472470996199000L)
    .duration(207000L)
    .localEndpoint(ORDER)
    .remoteEndpoint(PROFILE)
    .addAnnotation(1472470996199000L, "foo happened")
    .putTag("http.path", "/person/profile/query")
    .putTag("http.status_code", "403")
    .putTag("clnt/finagle.version", "6.45.0")
    .putTag("error", "此用户没有操作权限")
    .shared(true)
    .build();
  static final List<zipkin2.Span> ZIPKIN_SPANS = List.of(ZIPKIN_SPAN, ZIPKIN_SPAN);

  static final Span PROTO_SPAN = new Span.Builder()
    .trace_id(decodeHex(ZIPKIN_SPAN.traceId()))
    .parent_id(decodeHex(ZIPKIN_SPAN.parentId()))
    .id(decodeHex(ZIPKIN_SPAN.id()))
    .kind(Span.Kind.valueOf(ZIPKIN_SPAN.kind().name()))
    .name(ZIPKIN_SPAN.name())
    .timestamp(ZIPKIN_SPAN.timestampAsLong())
    .duration(ZIPKIN_SPAN.durationAsLong())
    .local_endpoint(new Endpoint.Builder()
      .service_name(ORDER.serviceName())
      .ipv6(ByteString.of(ORDER.ipv6Bytes())).build()
    )
    .remote_endpoint(new Endpoint.Builder()
      .service_name(PROFILE.serviceName())
      .ipv4(ByteString.of(PROFILE.ipv4Bytes()))
      .port(PROFILE.portAsInt()).build()
    )
    .annotations(List.of(new Annotation.Builder()
      .timestamp(ZIPKIN_SPAN.annotations().get(0).timestamp())
      .value(ZIPKIN_SPAN.annotations().get(0).value())
      .build()))
    .tags(ZIPKIN_SPAN.tags())
    .shared(true)
    .build();
  ListOfSpans PROTO_SPANS = new ListOfSpans.Builder()
    .spans(List.of(PROTO_SPAN, PROTO_SPAN)).build();

  @Test void encodeIsCompatible() throws IOException {
    okio.Buffer buffer = new okio.Buffer();

    Span.ADAPTER.encodeWithTag(new ProtoWriter(buffer), 1, PROTO_SPAN);

    assertThat(SpanBytesEncoder.PROTO3.encode(ZIPKIN_SPAN))
      .containsExactly(buffer.readByteArray());
  }

  @Test void decodeOneIsCompatible() {
    assertThat(SpanBytesDecoder.PROTO3.decodeOne(PROTO_SPANS.encode()))
      .isEqualTo(ZIPKIN_SPAN);
  }

  @Test void decodeListIsCompatible() {
    assertThat(SpanBytesDecoder.PROTO3.decodeList(PROTO_SPANS.encode()))
      .containsExactly(ZIPKIN_SPAN, ZIPKIN_SPAN);
  }

  @Test void encodeListIsCompatible_buff() {
    byte[] wireBytes = PROTO_SPANS.encode();
    byte[] zipkin_buff = new byte[10 + wireBytes.length];

    assertThat(SpanBytesEncoder.PROTO3.encodeList(ZIPKIN_SPANS, zipkin_buff, 5))
      .isEqualTo(wireBytes.length);

    assertThat(zipkin_buff)
      .startsWith(0, 0, 0, 0, 0)
      .containsSequence(wireBytes)
      .endsWith(0, 0, 0, 0, 0);
  }

  @Test void encodeListIsCompatible() {
    byte[] wireBytes = PROTO_SPANS.encode();

    assertThat(SpanBytesEncoder.PROTO3.encodeList(ZIPKIN_SPANS))
      .containsExactly(wireBytes);
  }

  @Test void span_sizeInBytes_matchesWire() {
    assertThat(SPAN.sizeInBytes(ZIPKIN_SPAN))
      .isEqualTo(Span.ADAPTER.encodedSizeWithTag(SPAN.fieldNumber, PROTO_SPAN));
  }

  @Test void annotation_sizeInBytes_matchesWire() {
    zipkin2.Annotation zipkinAnnotation = ZIPKIN_SPAN.annotations().get(0);

    assertThat(ANNOTATION.sizeInBytes(zipkinAnnotation)).isEqualTo(
      Annotation.ADAPTER.encodedSizeWithTag(ANNOTATION.fieldNumber, PROTO_SPAN.annotations.get(0))
    );
  }

  @Test void annotation_write_matchesWire() {
    zipkin2.Annotation zipkinAnnotation = ZIPKIN_SPAN.annotations().get(0);
    Span wireSpan = new Span.Builder().annotations(PROTO_SPAN.annotations).build();

    byte[] zipkinBytes = new byte[ANNOTATION.sizeInBytes(zipkinAnnotation)];
    ANNOTATION.write(WriteBuffer.wrap(zipkinBytes, 0), zipkinAnnotation);

    assertThat(zipkinBytes)
      .containsExactly(wireSpan.encode());
  }

  @Test void annotation_read_matchesWireEncodingWithTag() {
    zipkin2.Annotation zipkinAnnotation = ZIPKIN_SPAN.annotations().get(0);
    Span wireSpan = new Span.Builder().annotations(PROTO_SPAN.annotations).build();

    ReadBuffer wireBytes = ReadBuffer.wrap(wireSpan.encode());
    assertThat(wireBytes.readVarint32())
      .isEqualTo(ANNOTATION.key);

    zipkin2.Span.Builder builder = zipkinSpanBuilder();
    ANNOTATION.readLengthPrefixAndValue(wireBytes, builder);
    assertThat(builder.build().annotations())
      .containsExactly(zipkinAnnotation);
  }

  @Test void endpoint_sizeInBytes_matchesWireEncodingWithTag() {
    assertThat(LOCAL_ENDPOINT.sizeInBytes(ZIPKIN_SPAN.localEndpoint())).isEqualTo(
      Endpoint.ADAPTER.encodedSizeWithTag(LOCAL_ENDPOINT.fieldNumber, PROTO_SPAN.local_endpoint)
    );

    assertThat(REMOTE_ENDPOINT.sizeInBytes(ZIPKIN_SPAN.remoteEndpoint())).isEqualTo(
      Endpoint.ADAPTER.encodedSizeWithTag(REMOTE_ENDPOINT.fieldNumber, PROTO_SPAN.remote_endpoint)
    );
  }

  @Test void localEndpoint_write_matchesWire() {
    byte[] zipkinBytes = new byte[LOCAL_ENDPOINT.sizeInBytes(ZIPKIN_SPAN.localEndpoint())];
    LOCAL_ENDPOINT.write(WriteBuffer.wrap(zipkinBytes, 0), ZIPKIN_SPAN.localEndpoint());
    Span wireSpan = new Span.Builder().local_endpoint(PROTO_SPAN.local_endpoint).build();

    assertThat(zipkinBytes)
      .containsExactly(wireSpan.encode());
  }

  @Test void remoteEndpoint_write_matchesWire() {
    byte[] zipkinBytes = new byte[REMOTE_ENDPOINT.sizeInBytes(ZIPKIN_SPAN.remoteEndpoint())];
    REMOTE_ENDPOINT.write(WriteBuffer.wrap(zipkinBytes, 0), ZIPKIN_SPAN.remoteEndpoint());
    Span wireSpan = new Span.Builder().remote_endpoint(PROTO_SPAN.remote_endpoint).build();

    assertThat(zipkinBytes)
      .containsExactly(wireSpan.encode());
  }

  @Test void tag_sizeInBytes_matchesWire() {
    MapEntry<String, String> entry = entry("clnt/finagle.version", "6.45.0");
    Span wireSpan = new Span.Builder().tags(Map.of(entry.key, entry.value)).build();

    assertThat(new TagField(TAG_KEY).sizeInBytes(entry))
      .isEqualTo(Span.ADAPTER.encodedSize(wireSpan));
  }

  @Test void writeTagField_matchesWire() {
    MapEntry<String, String> entry = entry("clnt/finagle.version", "6.45.0");
    TagField field = new TagField(TAG_KEY);
    byte[] zipkinBytes = new byte[field.sizeInBytes(entry)];
    field.write(WriteBuffer.wrap(zipkinBytes, 0), entry);

    Span oneField = new Span.Builder().tags(Map.of(entry.key, entry.value)).build();
    assertThat(zipkinBytes)
      .containsExactly(oneField.encode());
  }

  @Test void writeTagField_matchesWire_emptyValue() {
    MapEntry<String, String> entry = entry("error", "");
    TagField field = new TagField(TAG_KEY);
    byte[] zipkinBytes = new byte[field.sizeInBytes(entry)];
    field.write(WriteBuffer.wrap(zipkinBytes, 0), entry);

    Span oneField = new Span.Builder().tags(Map.of(entry.key, entry.value)).build();
    assertThat(zipkinBytes)
      .containsExactly(oneField.encode());
  }

  static zipkin2.Span.Builder zipkinSpanBuilder() {
    return zipkin2.Span.newBuilder().traceId("a").id("a");
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/internal/ReadBufferBenchmarks.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.internal;

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@Measurement(iterations = 5, time = 1)
@Warmup(iterations = 10, time = 1)
@Fork(3)
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Threads(1)
public class ReadBufferBenchmarks {
  byte[] longBuff = {
    (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04,
    (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08,
  };

  @Benchmark public long readLong() {
    int pos = 0;
    return (longBuff[pos] & 0xffL) << 56
      | (longBuff[pos + 1] & 0xffL) << 48
      | (longBuff[pos + 2] & 0xffL) << 40
      | (longBuff[pos + 3] & 0xffL) << 32
      | (longBuff[pos + 4] & 0xffL) << 24
      | (longBuff[pos + 5] & 0xffL) << 16
      | (longBuff[pos + 6] & 0xffL) << 8
      | (longBuff[pos + 7] & 0xffL);
  }

  @Benchmark public long readLong_localArray() {
    int pos = 0;
    byte[] longBuff = this.longBuff;
    return (longBuff[pos] & 0xffL) << 56
      | (longBuff[pos + 1] & 0xffL) << 48
      | (longBuff[pos + 2] & 0xffL) << 40
      | (longBuff[pos + 3] & 0xffL) << 32
      | (longBuff[pos + 4] & 0xffL) << 24
      | (longBuff[pos + 5] & 0xffL) << 16
      | (longBuff[pos + 6] & 0xffL) << 8
      | (longBuff[pos + 7] & 0xffL);
  }

  @Benchmark public long readLong_8arity_localArray() {
    int pos = 0;
    return readLong(
      longBuff[pos] & 0xff,
      longBuff[pos + 1] & 0xff,
      longBuff[pos + 2] & 0xff,
      longBuff[pos + 3] & 0xff,
      longBuff[pos + 4] & 0xff,
      longBuff[pos + 5] & 0xff,
      longBuff[pos + 6] & 0xff,
      longBuff[pos + 7] & 0xff
    );
  }

  @Benchmark public long readLong_8arity() {
    int pos = 0;
    byte[] longBuff = this.longBuff;
    return readLong(
      longBuff[pos] & 0xff,
      longBuff[pos + 1] & 0xff,
      longBuff[pos + 2] & 0xff,
      longBuff[pos + 3] & 0xff,
      longBuff[pos + 4] & 0xff,
      longBuff[pos + 5] & 0xff,
      longBuff[pos + 6] & 0xff,
      longBuff[pos + 7] & 0xff
    );
  }

  static long readLong(int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7) {
    return (p0 & 0xffL) << 56
      | (p1 & 0xffL) << 48
      | (p2 & 0xffL) << 40
      | (p3 & 0xffL) << 32
      | (p4 & 0xffL) << 24
      | (p5 & 0xffL) << 16
      | (p6 & 0xffL) << 8
      | (p7 & 0xffL);
  }

  @Benchmark public long readLongReverseBytes() {
    return Long.reverseBytes(readLong());
  }

  // Convenience main entry-point
  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
      .include(".*" + ReadBufferBenchmarks.class.getSimpleName() + ".*")
      .addProfiler("gc")
      .build();

    new Runner(opt).run();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/internal/WriteBufferBenchmarks.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.internal;

import java.nio.ByteBuffer;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import static java.nio.charset.StandardCharsets.UTF_8;

@Measurement(iterations = 5, time = 1)
@Warmup(iterations = 10, time = 1)
@Fork(3)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Threads(1)
public class WriteBufferBenchmarks {
  // Order id = d07c4daa-0fa9-4c03-90b1-e06c4edae250 doesn't exist
  static final String CHINESE_UTF8 = "订单d07c4daa-0fa9-4c03-90b1-e06c4edae250不存在";
  static final int CHINESE_UTF8_SIZE = UTF_8.encode(CHINESE_UTF8).remaining();
  /* length-prefixing a 1 KiB span */
  static final int TEST_INT = 1024;
  /* epoch micros timestamp */
  static final long TEST_LONG = 1472470996199000L;
  byte[] bytes = new byte[8];
  WriteBuffer buffer = WriteBuffer.wrap(bytes);

  @Benchmark public int utf8SizeInBytes_chinese() {
    return WriteBuffer.utf8SizeInBytes(CHINESE_UTF8);
  }

  @Benchmark public byte[] writeUtf8_chinese() {
    byte[] bytesUtf8 = new byte[CHINESE_UTF8_SIZE];
    WriteBuffer.wrap(bytesUtf8, 0).writeUtf8(CHINESE_UTF8);
    return bytesUtf8;
  }

  @Benchmark public ByteBuffer writeUtf8_chinese_jdk() {
    return UTF_8.encode(CHINESE_UTF8);
  }

  @Benchmark public int varIntSizeInBytes_32() {
    return WriteBuffer.varintSizeInBytes(TEST_INT);
  }

  @Benchmark public int varIntSizeInBytes_64() {
    return WriteBuffer.varintSizeInBytes(TEST_LONG);
  }

  @Benchmark public int writeVarint_32() {
    buffer.writeVarint(TEST_INT);
    return buffer.pos();
  }

  @Benchmark public int writeVarint_64() {
    buffer.writeVarint(TEST_LONG);
    return buffer.pos();
  }

  @Benchmark public int writeLongLe() {
    buffer.writeLongLe(TEST_LONG);
    return buffer.pos();
  }

  // Convenience main entry-point
  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
      .include(".*" + WriteBufferBenchmarks.class.getSimpleName() + ".*")
      .build();

    new Runner(opt).run();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/server/ServerIntegratedBenchmark.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.server;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.linecorp.armeria.client.WebClient;
import io.netty.handler.codec.http.QueryStringEncoder;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.Network;
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.lifecycle.Startables;
import org.testcontainers.utility.MountableFile;

import static org.testcontainers.utility.DockerImageName.parse;

/**
 * This benchmark runs zipkin-server, storage backends, an example application, prometheus, grafana,
 * and wrk using docker to generate a performance report.
 *
 * <p>Currently there are two environment variable knobs
 *
 * <ul>
 *   <li>
 *     RELEASE_VERSION - specify to a released zipkin server. If unspecified, will use the current code,
 *     i.e., the code currently displayed in your IDE.
 *   </li>
 *   <li>
 *     ZIPKIN_BENCHMARK_WAIT - set to true to have the benchmark wait until user manually terminates at the end.
 *     Useful to manually inspect prometheus / grafana.
 *   </li>
 * </ul>
 *
 * <p>Note to Windows laptop users: you will probably need to restart the Docker daemon before a
 * session of benchmarks. Docker containers seem to have time get out of sync when a computer sleeps
 * until you restart the daemon - this causes Prometheus metrics to not scrape properly.
 */
@Disabled  // Run manually
class ServerIntegratedBenchmark {
  static final Logger LOG = LoggerFactory.getLogger(ServerIntegratedBenchmark.class);

  static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

  @Nullable static final String RELEASE_VERSION = System.getenv("RELEASE_VERSION");

  static final boolean WAIT_AFTER_BENCHMARK = "true".equals(System.getenv("ZIPKIN_BENCHMARK_WAIT"));

  List<GenericContainer<?>> containers;

  @BeforeEach void setUp() {
    containers = new ArrayList<>();
  }

  @AfterEach void tearDown() {
    containers.forEach(GenericContainer::stop);
  }

  @Test void inMemory() throws Exception {
    runBenchmark(null);
  }

  @Test void elasticsearch() throws Exception {
    GenericContainer<?> elasticsearch =
      new GenericContainer<>(parse("ghcr.io/openzipkin/zipkin-elasticsearch7:3.4.3"))
        .withNetwork(Network.SHARED)
        .withNetworkAliases("elasticsearch")
        .withLabel("name", "elasticsearch")
        .withLabel("storageType", "elasticsearch")
        .withExposedPorts(9200)
        .waitingFor(Wait.forHealthcheck());
    containers.add(elasticsearch);

    runBenchmark(elasticsearch);
  }

  @Test void cassandra3() throws Exception {
    GenericContainer<?> cassandra =
      new GenericContainer<>(parse("ghcr.io/openzipkin/zipkin-cassandra:3.4.3"))
        .withNetwork(Network.SHARED)
        .withNetworkAliases("cassandra")
        .withLabel("name", "cassandra")
        .withLabel("storageType", "cassandra3")
        .withExposedPorts(9042)
        .waitingFor(Wait.forHealthcheck());
    containers.add(cassandra);

    runBenchmark(cassandra);
  }

  @Test void mysql() throws Exception {
    GenericContainer<?> mysql =
      new GenericContainer<>(parse("ghcr.io/openzipkin/zipkin-mysql:3.4.3"))
        .withNetwork(Network.SHARED)
        .withNetworkAliases("mysql")
        .withLabel("name", "mysql")
        .withLabel("storageType", "mysql")
        .withExposedPorts(3306)
        .waitingFor(Wait.forHealthcheck());
    containers.add(mysql);

    runBenchmark(mysql);
  }

  void runBenchmark(@Nullable GenericContainer<?> storage) throws Exception {
    runBenchmark(storage, createZipkinContainer(storage));
  }

  void runBenchmark(@Nullable GenericContainer<?> storage, GenericContainer<?> zipkin)
    throws Exception {
    GenericContainer<?> backend =
      new GenericContainer<>(parse("ghcr.io/openzipkin/brave-example:armeria"))
        .withNetwork(Network.SHARED)
        .withNetworkAliases("backend")
        .withCommand("backend")
        .withExposedPorts(9000)
        .waitingFor(Wait.forHealthcheck());

    GenericContainer<?> frontend =
      new GenericContainer<>(parse("ghcr.io/openzipkin/brave-example:armeria"))
        .withNetwork(Network.SHARED)
        .withNetworkAliases("frontend")
        .withCommand("frontend")
        .withExposedPorts(8081)
        .waitingFor(Wait.forHealthcheck());
    containers.add(frontend);

    // Use a quay.io mirror to prevent build outages due to Docker Hub pull quotas
    // Use same version as in docker/examples/docker-compose-prometheus.yml
    GenericContainer<?> prometheus =
      new GenericContainer<>(parse("quay.io/prometheus/prometheus:v2.55.1"))
        .withNetwork(Network.SHARED)
        .withNetworkAliases("prometheus")
        .withExposedPorts(9090)
        .withCopyFileToContainer(
          MountableFile.forClasspathResource("prometheus.yml"), "/etc/prometheus/prometheus.yml");
    containers.add(prometheus);

    // Use a quay.io mirror to prevent build outages due to Docker Hub pull quotas
    // Use same version as in docker/examples/docker-compose-prometheus.yml
    GenericContainer<?> grafana = new GenericContainer<>(parse("quay.io/giantswarm/grafana:7.5.12"))
      .withNetwork(Network.SHARED)
      .withNetworkAliases("grafana")
      .withExposedPorts(3000)
      .withEnv("GF_AUTH_ANONYMOUS_ENABLED", "true")
      .withEnv("GF_AUTH_ANONYMOUS_ORG_ROLE", "Admin");
    containers.add(grafana);

    // This is an arbitrary small image that has curl installed
    // Use a quay.io mirror to prevent build outages due to Docker Hub pull quotas
    // Use same version as in docker/examples/docker-compose-prometheus.yml
    GenericContainer<?> grafanaDashboards =
      new GenericContainer<>(parse("quay.io/cilium/alpine-curl:v1.10.0"))
        .withNetwork(Network.SHARED)
        .withWorkingDirectory("/tmp")
        .withLogConsumer(new Slf4jLogConsumer(LOG))
        .withCreateContainerCmdModifier(it -> it.withEntrypoint("/tmp/create.sh"))
        .withCopyFileToContainer(
          MountableFile.forClasspathResource("create-datasource-and-dashboard.sh", 555),
          "/tmp/create.sh");
    containers.add(grafanaDashboards);

    // Use a quay.io mirror to prevent build outages due to Docker Hub pull quotas
    GenericContainer<?> wrk = new GenericContainer<>(parse("quay.io/dim/wrk:stable"))
      .withNetwork(Network.SHARED)
      .withCreateContainerCmdModifier(it -> it.withEntrypoint("wrk"))
      .withCommand("-t4 -c128 -d100s http://frontend:8081 --latency");
    containers.add(wrk);

    grafanaDashboards.dependsOn(grafana);
    wrk.dependsOn(frontend, backend, prometheus, grafanaDashboards, zipkin);
    if (storage != null) wrk.dependsOn(storage);

    Startables.deepStart(Stream.of(wrk)).join();

    System.out.println("Benchmark started.");
    if (zipkin != null) printContainerMapping(zipkin);
    if (storage != null) printContainerMapping(storage);
    printContainerMapping(backend);
    printContainerMapping(frontend);
    printContainerMapping(prometheus);
    printContainerMapping(grafana);

    while (wrk.isRunning()) {
      Thread.sleep(1000);
    }

    // Wait for prometheus to do a final scrape.
    Thread.sleep(5000);

    System.out.println("Benchmark complete, wrk output:");
    System.out.println(wrk.getLogs().replace("\n\n", "\n"));

    WebClient prometheusClient = WebClient.of(
      "h1c://" + prometheus.getContainerIpAddress() + ":" + prometheus.getFirstMappedPort());

    System.out.printf("Messages received: %s%n", prometheusValue(
      prometheusClient, "sum(zipkin_collector_messages_total)"));
    System.out.printf("Spans received: %s%n", prometheusValue(
      prometheusClient, "sum(zipkin_collector_spans_total)"));
    System.out.printf("Spans dropped: %s%n", prometheusValue(
      prometheusClient, "sum(zipkin_collector_spans_dropped_total)"));

    System.out.println("Memory quantiles:");
    printQuartiles(prometheusClient, "jvm_memory_used_bytes{area=\"heap\"}");
    printQuartiles(prometheusClient, "jvm_memory_used_bytes{area=\"nonheap\"}");

    System.out.printf(
      "Total GC time (s): %s%n",
      prometheusValue(prometheusClient, "sum(jvm_gc_pause_seconds_sum)"));
    System.out.printf(
      "Number of GCs: %s%n", prometheusValue(prometheusClient, "sum(jvm_gc_pause_seconds_count)"));

    System.out.println("POST Spans latency (s)");
    printHistogram(prometheusClient, """
      http_server_requests_seconds_bucket{
      method="POST",status="202",uri="/api/v2/spans"}
      """);

    if (WAIT_AFTER_BENCHMARK) {
      System.out.println("""
        Keeping containers running until explicit termination. \
        Feel free to poke around in grafana.\
        """);
      Thread.sleep(Long.MAX_VALUE);
    }
  }

  GenericContainer<?> createZipkinContainer(@Nullable GenericContainer<?> storage)
    throws Exception {
    Map<String, String> env = new LinkedHashMap<>();
    if (storage != null) {
      String name = storage.getLabels().get("name");
      String host = name;
      int port = storage.getExposedPorts().get(0);
      String address = host + ":" + port;

      env.put("STORAGE_TYPE", storage.getLabels().get("storageType"));
      switch (name) {
        case "elasticsearch":
          env.put("ES_HOSTS", "http://" + address);
          break;
        case "cassandra":
        case "cassandra3":
          env.put("CASSANDRA_CONTACT_POINTS", address);
          break;
        case "mysql":
          env.put("MYSQL_HOST", host);
          env.put("MYSQL_TCP_PORT", Integer.toString(port));
          env.put("MYSQL_USER", "zipkin");
          env.put("MYSQL_PASS", "zipkin");
          break;
        default:
          throw new IllegalArgumentException("Unknown storage " + name +
            ". Update startZipkin to map it to properties.");
      }
    }

    final GenericContainer<?> zipkin;
    if (RELEASE_VERSION == null) {
      zipkin = new GenericContainer<>(parse("ghcr.io/openzipkin/java:21.0.6_p7"));
      List<String> classpath = new ArrayList<>();
      for (String item : System.getProperty("java.class.path").split(File.pathSeparator)) {
        Path path = Paths.get(item);
        final String containerPath;
        if (Files.isDirectory(path)) {
          Path root = path.getParent();
          while (root != null) {
            try (Stream<Path> f = Files.list(root)) {
              if (f.anyMatch(p -> p.getFileName().toString().equals("mvnw"))) {
                break;
              }
            }
            root = root.getParent();
          }
          containerPath = root.relativize(path).toString().replace('\\', '/');
        } else {
          containerPath = path.getFileName().toString();
        }
        // Test containers currently doesn't support copying in a path with subdirectories that
        // need to be created, so we mangle directory structure into a single directory with
        // hyphens.
        String classPathItem = "/classpath-" + containerPath.replace('/', '-');
        zipkin.withCopyFileToContainer(MountableFile.forHostPath(item), classPathItem);
        classpath.add(classPathItem);
      }
      zipkin.withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint("java"));
      zipkin.setCommand("-cp", String.join(":", classpath), "zipkin.server.ZipkinServer");
      // Don't fail on classpath problem from missing lens, as we don't use it.
      env.put("ZIPKIN_UI_ENABLED", "false");
    } else {
      zipkin = new GenericContainer<>(parse("ghcr.io/openzipkin/zipkin:" + RELEASE_VERSION));
    }

    zipkin
      .withNetwork(Network.SHARED)
      .withNetworkAliases("zipkin")
      .withExposedPorts(9411)
      .withEnv(env)
      .waitingFor(Wait.forHttp("/health"));
    containers.add(zipkin);
    return zipkin;
  }

  static void printContainerMapping(GenericContainer<?> container) {
    System.out.printf(
      "Container %s ports exposed at %s%n", container.getDockerImageName(),
      container.getExposedPorts().stream()
        .map(port -> Map.entry(port,
          "http://" + container.getContainerIpAddress() + ":" + container.getMappedPort(port)))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));
  }

  static void printQuartiles(WebClient prometheus, String metric) throws Exception {
    for (double quantile : Arrays.asList(0.0, 0.25, 0.5, 0.75, 1.0)) {
      String value = prometheusValue(prometheus, "quantile(" + quantile + ", " + metric + ")");
      System.out.printf("%s[%s] = %s%n", metric, quantile, value);
    }
  }

  static void printHistogram(WebClient prometheus, String metric) throws Exception {
    for (double quantile : Arrays.asList(0.5, 0.9, 0.99)) {
      String value =
        prometheusValue(prometheus, "histogram_quantile(" + quantile + ", " + metric + ")");
      System.out.printf("%s[%s] = %s%n", metric, quantile, value);
    }
  }

  static String prometheusValue(WebClient prometheus, String query) throws Exception {
    QueryStringEncoder encoder = new QueryStringEncoder("/api/v1/query");
    encoder.addParam("query", query);
    String response = prometheus.get(encoder.toString()).aggregate().join().contentUtf8();
    return OBJECT_MAPPER.readTree(response).at("/data/result/0/value/1").asText();
  }
}


================================================
FILE: benchmarks/src/test/java/zipkin2/server/internal/throttle/ThrottledCallBenchmarks.java
================================================
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.server.internal.throttle;

import com.linecorp.armeria.common.metric.NoopMeterRegistry;
import com.netflix.concurrency.limits.limit.FixedLimit;
import com.netflix.concurrency.limits.limiter.SimpleLimiter;
import java.io.IOException;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.TearDown;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import zipkin2.Call;
import zipkin2.Callback;

@Measurement(iterations = 5, time = 1)
@Warmup(iterations = 10, time = 1)
@Fork(3)
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Threads(2)
public class ThrottledCallBenchmarks {
  ExecutorService fakeCallExecutor = Executors.newSingleThreadExecutor();
  ExecutorService executor = Executors.newSingleThreadExecutor();
  ThrottledCall call;

  @Setup public void setup() {
    executor = Executors.newSingleThreadExecutor();
    fakeCallExecutor = Executors.newSingleThreadExecutor();
    SimpleLimiter<Void> limiter = SimpleLimiter.newBuilder().limit(FixedLimit.of(1)).build();
    LimiterMetrics metrics = new LimiterMetrics(NoopMeterRegistry.get());
    Predicate<Throwable> isOverCapacity = RejectedExecutionException.class::isInstance;
    call =
      new ThrottledCall(new FakeCall(fakeCallExecutor), executor, limiter, metrics, isOverCapacity);
  }

  @TearDown public void tearDown() {
    executor.shutdown();
    fakeCallExecutor.shutdown();
  }

  @Benchmark public Object execute() throws IOException {
    return call.clone().execute();
  }

  @Benchmark public void execute_overCapacity() throws IOException {
    ThrottledCall overCapacity = (ThrottledCall) call.clone();
    ((FakeCall) overCapacity.delegate).overCapacity = true;

    try {
      overCapacity.execute();
    } catch (RejectedExecutionException e) {
      assert e == OVER_CAPACITY;
    }
  }

  @Benchmark public void execute_throttled() throws IOException {
    call.limiter.acquire(null); // capacity is 1, so this will overdo it.
    call.clone().execute();
  }

  static final RejectedExecutionException OVER_CAPACITY = new RejectedExecutionException();

  static final class FakeCall extends Call.Base<Void> {
    final Executor executor;
    boolean overCapacity = false;

    FakeCall(Executor executor) {
      this.executor = executor;
    }

    @Override public Void doExecute() throws IOException {
      if (overCapacity) throw OVER_CAPACITY;
      return null;
    }

    @Override public void doEnqueue(Callback<Void> callback) {
      executor.execute(() -> {
        if (overCapacity) {
          callback.onError(OVER_CAPACITY);
        } else {
          callback.onSuccess(null);
        }
      });
    }

    @Override public FakeCall clone() {
      return new FakeCall(executor);
    }
  }

  // Convenience main entry-point
  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
      .addProfiler("gc")
      .include(".*" + ThrottledCallBenchmarks.class.getSimpleName())
      .build();

    new Runner(opt).run();
  }
}


================================================
FILE: benchmarks/src/test/resources/create-datasource-and-dashboard.sh
================================================
#!/bin/sh
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

set -xeuo pipefail

if ! curl --retry 5 --retry-connrefused --retry-delay 0 -sf http://grafana:3000/api/datasources/name/prom; then
    curl -sf -X POST -H "Content-Type: application/json" \
         --data-binary '{"name":"prom","type":"prometheus","url":"http://prometheus:9090","access":"proxy","isDefault":true}' \
         http://grafana:3000/api/datasources
fi

dashboard_id=1598
last_revision=$(curl -sf https://grafana.com/api/dashboards/${dashboard_id}/revisions | grep '"revision":' | sed 's/ *"revision": \([0-9]*\),/\1/' | sort -n | tail -1)

echo '{"dashboard": ' > data.json
curl -s https://grafana.com/api/dashboards/${dashboard_id}/revisions/${last_revision}/download >> data.json
echo ', "inputs": [{"name": "DS_PROMETHEUS", "pluginId": "prometheus", "type": "datasource", "value": "prom"}], "overwrite": false}' >> data.json
curl --retry-connrefused --retry 5 --retry-delay 0 -sf \
     -X POST -H "Content-Type: application/json" \
     --data-binary @data.json \
     http://grafana:3000/api/dashboards/import


================================================
FILE: benchmarks/src/test/resources/prometheus.yml
================================================
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'zipkin'
    scrape_interval: 5s
    metrics_path: '/prometheus'
    static_configs:
      - targets: ['zipkin:9411']


================================================
FILE: benchmarks/src/test/resources/simplelogger.properties
================================================
# See https://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html for the full list of config options

org.slf4j.simpleLogger.logFile=System.out
org.slf4j.simpleLogger.defaultLogLevel=warn
org.slf4j.simpleLogger.showDateTime=true
org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS

# uncomment to include kafka consumer configuration in test logs
#logger.org.apache.kafka.clients.level=info


================================================
FILE: benchmarks/src/test/resources/zipkin2-chinese.json
================================================
{
  "traceId": "4d1e00c0db9010db86154a4ba6e91385",
  "parentId": "86154a4ba6e91385",
  "id": "4d1e00c0db9010db",
  "kind": "CLIENT",
  "name": "个人信息查询",
  "timestamp": 1472470996199000,
  "duration": 207000,
  "localEndpoint": {
    "serviceName": "订单维护服务",
    "ipv6": "2001:db8::c001"
  },
  "remoteEndpoint": {
    "serviceName": "个人信息服务",
    "ipv4": "192.168.99.101",
    "port": 9000
  },
  "tags": {
    "http.path": "/person/profile/query",
    "http.status_code": "403",
    "error": "此用户没有操作权限"
  }
}


================================================
FILE: benchmarks/src/test/resources/zipkin2-client.json
================================================
{
  "traceId": "4d1e00c0db9010db86154a4ba6e91385",
  "parentId": "86154a4ba6e91385",
  "id": "4d1e00c0db9010db",
  "kind": "CLIENT",
  "name": "get",
  "timestamp": 1472470996199000,
  "duration": 207000,
  "localEndpoint": {
    "serviceName": "frontend",
    "ipv6": "2001:db8::c001"
  },
  "remoteEndpoint": {
    "serviceName": "backend",
    "ipv4": "192.168.99.101",
    "port": 9000
  },
  "annotations": [
    {
      "timestamp": 1472470996238000,
      "value": "foo"
    },
    {
      "timestamp": 1472470996403000,
      "value": "bar"
    }
  ],
  "tags": {
    "http.path": "/api",
    "clnt/finagle.version": "6.45.0"
  }
}


================================================
FILE: build-bin/README.md
================================================
# Test and Deploy scripts

This is a Maven+Docker project, which uses standard conventions for test and deploy with some
exceptions.

On [../zipkin-lens]:
* [maybe_install_npm] is used to build on an unsupported node.js architecture.
* [maven_go_offline] additionally seeds the NPM cache

On test:
* [test], used by [../.github/workflows/test.yml] runs Maven unit and integration tests.
  * Its "test" job skips docker, as they are run in parallel in "test_docker"
* [../.github/workflows/readme_test.yml] tests build commands in [../zipkin-server] and [../docker]
  * zipkin, zipkin-lens and zipkin-slim Docker builds use `RELEASE_FROM_MAVEN_BUILD=true`
    * this avoids invoking Maven builds from within Docker, which are costly and fragile
  * Docker tests run in sequence to avoid queueing delays, which take longer than builds themselves.

On deploy:
* [deploy], used by [../.github/workflows/deploy.yml] publishes jars and Docker images.
* [javadoc_to_gh_pages] pushes Javadoc to the gh-pages branch on MAJOR.MINOR.PATCH branch, but not master.
  * gh-pages is addressable via https://zipkin.io/zipkin/
* Besides production Docker images, this project includes [../docker/test-images].
  * [docker_push] pushes test-images, but only to ghcr.io

[//]: # (Below here should be standard for all projects)

## Build Overview
`build-bin` holds portable scripts used in CI to test and deploy the project.

The scripts here are portable. They do not include any CI provider-specific logic or ENV variables.
This helps `test.yml` (GitHub Actions) and alternatives contain nearly the same contents, even if
certain OpenZipkin projects need slight adjustments here. Portability has proven necessary, as
OpenZipkin has had to transition CI providers many times due to feature and quota constraints.

These scripts serve a second purpose, which is to facilitate manual releases, which has also
happened many times due usually to service outages of CI providers. While tempting to use
CI-provider specific tools, doing so can easily create a dependency where no one knows how to
release anymore. Do not use provider-specific mechanisms to implement release flow. Instead,
automate triggering of the scripts here.

The only scripts that should be modified per project are in the base directory. Those in
subdirectories, such as [docker](docker), should not vary project to project except accident of
version drift. Intentional changes in subdirectories should be relevant and tested on multiple
projects to ensure they can be blindly copy/pasted.

Conversely, the files in the base directory are project specific entry-points for test and deploy
actions and are entirely appropriate to vary per project. Here's an overview:

## Lint

Lint makes sure that documentation and workflows are in-tact. CI providers should be configured to
run lint on pull requests or pushes to the master branch, notably when the tag is blank. Linters
should only run on documentation-only commits or those who affect workflow files. Linters must not
depend on authenticated resources, as running lint can leak credentials.

* [configure_lint](configure_lint) - Ensures linters are installed
* [lint](lint) - Runs the linters

We minimally check the following:

* [markdown-link-check](https://github.com/tcort/markdown-link-check) on our Markdown content.
  * we maintain [mlc_config.json](mlc_config.json) for exceptions
* [yamllint](https://github.com/adrienverge/yamllint) on our GitHub Actions Workflow YAML.
  * occasionally need line length exceptions via `# yamllint disable-line rule:line-length`

### Example GitHub Actions setup

A simplest GitHub Actions `lint.yml` runs linters after configuring them, but only on relevant event
conditions. The name `lint.yml` and job `lint` allows easy references to status badges and parity of
the scripts it uses.

The `on:` section obviates job creation and resource usage for irrelevant events. Notably, GitHub
Actions includes the ability to skip documentation-only jobs.

Here's a partial `lint.yml` including only the aspects mentioned above.
```yaml
---
on:  # yamllint disable-line rule:truthy
  push:  # non-tagged pushes to master
    branches:
      - master
    tags-ignore:
      - '*'
    paths:
      - '**/*.md'
      - '.github/workflows/*.yml'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json
  pull_request:  # pull requests targeted at the master branch.
    branches:
      - master
    paths:
      - '**/*.md'
      - '.github/workflows/*.yml'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-24.04  # newest available distribution, aka noble
    # skip commits made by the release plugin
    if: "!contains(github.event.head_commit.message, 'maven-release-plugin')"
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
      - name: Lint
        run: |
          build-bin/configure_lint
          build-bin/lint
```

## Test

Test builds and runs any tests of the project, including integration tests. CI providers should be
configured to run tests on pull requests or pushes to the master branch, notably when the tag is
blank. Tests should not run on documentation-only commits. Tests must not depend on authenticated
resources, as running tests can leak credentials.

 * [configure_test](configure_test) - Sets up build environment for tests.
 * [test](test) - Builds and runs tests for this project.

### Example GitHub Actions setup

A simplest GitHub Actions `test.yml` runs tests after configuring them, but only on relevant event
conditions. The name `test.yml` and job `test` allows easy references to status badges and parity of
the scripts it uses.

The `on:` section obviates job creation and resource usage for irrelevant events. Notably, GitHub
Actions includes the ability to skip documentation-only jobs.

Here's a partial `test.yml` including only the aspects mentioned above.
```yaml
on:  # yamllint disable-line rule:truthy
  push:  # non-tagged pushes to master
    branches:
      - master
    tags-ignore:
      - '*'
    paths-ignore:
      - '**/*.md'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json
  pull_request:  # pull requests targeted at the master branch.
    branches:
      - master
    paths-ignore:
      - '**/*.md'
      - './build-bin/*lint'
      - ./build-bin/mlc_config.json

jobs:
  test:
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
      - name: Test
        run: |
          build-bin/configure_test
          build-bin/test
```

## Deploy

Deploy builds and pushes artifacts to a remote repository for master and release commits on it. CI
providers deploy pushes to master on when the tag is blank, but not on documentation-only commits.
Releases should deploy on version tags (ex `/^[0-9]+\.[0-9]+\.[0-9]+/`), without consideration of if
the commit is documentation only or not.

 * [configure_deploy](configure_deploy) - Sets up environment and logs in.
 * [deploy](deploy) - deploys the project, with arg1 being "master" or a release commit like "1.2.3"

### Example GitHub Actions setup

A simplest GitHub Actions `deploy.yml` deploys after logging in, but only on relevant event
conditions. The name `deploy.yml` and job `deploy` allows easy references to status badges and
parity of the scripts it uses.

The `on:` section obviates job creation and resource usage for irrelevant events. GitHub Actions
cannot implement "master, except documentation only-commits" in the same file. Hence, deployments of
master will happen even on README change.

Here's a partial `deploy.yml` including only the aspects mentioned above. Notice env variables are
explicitly defined and `on.tags` is a [glob pattern](https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet).

```yaml
on:  # yamllint disable-line rule:truthy
  push:
    branches:
      - master
    # Don't deploy tags because the same commit for MAJOR.MINOR.PATCH is also
    # on master: Redundant deployment of a release version will fail uploading.
    tags-ignore:
      - '*'

jobs:
  deploy:
    runs-on: ubuntu-24.04  # newest available distribution, aka noble
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 1  # only needed to get the sha label
      - name: Deploy
        env:
          GH_USER: ${{ secrets.GH_USER }}
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
        run: |  # GITHUB_REF = refs/heads/master or refs/tags/MAJOR.MINOR.PATCH
          build-bin/configure_deploy &&
          build-bin/deploy $(echo ${GITHUB_REF} | cut -d/ -f 3)
```


================================================
FILE: build-bin/configure_deploy
================================================
#!/bin/sh -ue

# This script sets up anything needed for `./deploy`. Do not assume `configure_test` was called.
#
# See [README.md] for an explanation of this and how CI should use it.
build-bin/docker/configure_docker_push
build-bin/gpg/configure_gpg

# When arch isn't amd64 zipkin-lens needs offline install
build-bin/maybe_install_npm
build-bin/maven_go_offline

# openzipkin/zipkin publishes Javadoc to https://zipkin.io/zipkin/ on release
build-bin/git/login_git


================================================
FILE: build-bin/configure_lint
================================================
#!/bin/sh -ue

# Attempt to install markdown-link-check if absent
# Pinned until https://github.com/tcort/markdown-link-check/issues/369
markdown-link-check -V || npm install -g markdown-link-check@3.12.2

# Attempt to install yamllint if absent
yamllint -v || pip install --user yamllint


================================================
FILE: build-bin/configure_test
================================================
#!/bin/sh -ue

# This script sets up anything needed for `./test`. This should not login to anything, as that
# should be done in `configure_deploy`.
#
# See [README.md] for an explanation of this and how CI should use it.
build-bin/docker/configure_docker

# When arch isn't amd64 zipkin-lens needs offline install
build-bin/maybe_install_npm
build-bin/maven_go_offline


================================================
FILE: build-bin/deploy
================================================
#!/bin/sh -ue

# This script deploys a master or release version.
#
# See [README.md] for an explanation of this and how CI should use it.
version=${1:-master}

# Use implicit version when master, if we can..
if [ "${version}" = "master" ]; then
  version=$(sed -En 's/.*<version>(.*)<\/version>.*/\1/p' pom.xml| head -1)
fi

build-bin/maven/maven_deploy
export RELEASE_FROM_MAVEN_BUILD=true
build-bin/docker_push ${version}

# openzipkin/zipkin publishes Javadoc to gh-pages (https://zipkin.io/zipkin/) on release
case ${version} in
  *-SNAPSHOT )
    ;;
  * )
    build-bin/javadoc_to_gh_pages ${version}
    ;;
esac


================================================
FILE: build-bin/docker/configure_docker
================================================
#!/bin/sh
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

# Defends against build outages caused by Docker Hub (docker.io) pull rate limits.
#
# It should not login to anything, as that should be done in `configure_docker_push`

set -ue

# The below sets up testcontainers configuration, which will be ignored if it isn't used. Even if
# this is Docker related, it is coupled to integration tests configuration invoked with Maven.
# * See https://www.testcontainers.org/supported_docker_environment/image_registry_rate_limiting/
# * checks.disable=true - saves time and a docker.io pull of alpine
# * ryuk doesn't count against docker.io rate limits because Docker approved testcontainers as OSS
echo checks.disable=true >> ~/.testcontainers.properties

# We don't use any docker.io images, but add a Google's mirror in case something implicitly does
# * See https://cloud.google.com/container-registry/docs/pulling-cached-images
echo '{ "registry-mirrors": ["https://mirror.gcr.io"] }' | sudo tee /etc/docker/daemon.json
sudo service docker restart


================================================
FILE: build-bin/docker/configure_docker_push
================================================
#!/bin/sh
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

# Ensures Docker is logged in and it can build multi-architecture.
# This should be used instead of `configure_docker` when a push will occur.
#
# This should only happen when we are publishing multi-arch builds, as otherwise the setup could use
# Docker Hub pull quota and possibly cause a build outage.

set -ue

# Verify we are on an arch that can publish multi-arch images
arch=$($(dirname "$0")/docker_arch)
if [ "${arch}" != "amd64" ]; then
  >&2 echo "multiarch/qemu-user-static doesn't support arch ${arch}"
  exit 1
fi

# Enable experimental features on the server (multi-arch)
echo '{ "experimental":true, "registry-mirrors": ["https://mirror.gcr.io"] }' | sudo tee /etc/docker/daemon.json

sudo service docker restart
# Enable experimental client features (multi-arch)
mkdir -p ${HOME}/.docker && echo '{"experimental":"enabled"}' > ${HOME}/.docker/config.json

# Log in to GitHub Container Registry and Docker Hub for releasing images
# This effects ${HOME}/.docker/config.json, which was created above

# All images push to ghcr.io
echo "${GH_TOKEN}" | docker login ghcr.io -u "${GH_USER}" --password-stdin

# Some images push to docker.io: check first if credentials exist or not.
if [ -n "${DOCKERHUB_USER:-}" ]; then
  echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USER}" --password-stdin
fi

# Enable execution of different multi-architecture containers by QEMU and binfmt_misc
# See https://github.com/multiarch/qemu-user-static
#
# Mirrored image use to avoid docker.io pulls:
# docker tag multiarch/qemu-user-static:7.2.0-1 ghcr.io/openzipkin/multiarch-qemu-user-static:latest
#
# Note: This image only works on x86_64/amd64 architecture.
# See: https://github.com/multiarch/qemu-user-static#supported-host-architectures
docker run --rm --privileged ghcr.io/openzipkin/multiarch-qemu-user-static --reset -p yes


================================================
FILE: build-bin/docker/docker-healthcheck
================================================
#!/bin/sh
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

# HEALTHCHECK for use in `docker ps`, `docker compose ps`, or a readiness probe in k8s.
#
# The following variables are read from ENV in the Dockerfile or env readable from pid 1.
# * HEALTHCHECK_KIND - must be "http" or "tcp". Defaults to "http"
#   * When "http" the GET path to check is /health unless overridden by HEALTHCHECK_PATH
# * HEALTHCHECK_IP - Defaults to $(hostname -i || 127.0.0.1)
# * HEALTHCHECK_PORT - Not always the service port, but in Zipkin it typically is. No default
#
# Setup like this:
# # We use a 30s start period to avoid marking the container unhealthy on slow or contended CI hosts
#  HEALTHCHECK --interval=1s --start-period=30s --timeout=5s CMD ["docker-healthcheck"]
#
# Note: this is named docker-healthcheck, not docker_healthcheck like our other scripts. That's due
# to conventions in https://github.com/docker-library/healthcheck/

# Fail on unset variables, but don't quit on rc!=0, so we can log what happened
set -u +e

# Export healthcheck variables we can read from pid 1. Some processes such as nginx wipe env. In
# that case, this will still be able to see variables set as ENV instructions in the Dockerfile.
export `cat /proc/1/environ| tr '\0' '\n'| \
  egrep '^(HEALTHCHECK_KIND|HEALTHCHECK_IP|HEALTHCHECK_PATH|HEALTHCHECK_PORT)='`

kind=${HEALTHCHECK_KIND:-http}
ip=${HEALTHCHECK_IP:-$(hostname -i || echo '127.0.0.1')}
port=${HEALTHCHECK_PORT?-is required}

case ${kind} in
  http )
    path=${HEALTHCHECK_PATH:-/health}
    endpoint="http://${ip}:${port}${path}"
    # Use b3:0 to ensure health checks aren't traced
    # Use timeout 1s (-T 1) as the health check interval is often 1s
    out=$(wget -T 1 -qO- "${endpoint}" --header=b3:0 2>&1)
    rc=$?
    ;;
  tcp )
    # Use timeout 1s (-w 1) as the health check interval is often 1s
    out=$(nc -w 1 -z ${ip} ${port} 2>&1)
    rc=$?
    ;;
  * )
    >&2 echo "Invalid HEALTHCHECK_KIND: ${kind}"
    exit 1
    ;;
esac

if [ "$rc" = "0" ]; then exit 0; fi
>&2 echo "Health check failed with code ${rc} response: ${out}"
exit 1


================================================
FILE: build-bin/docker/docker_arch
================================================
#!/bin/sh
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

# This script gets a normalized name for the architecture as used in Docker. This will be a subset
# of ones supported by buildx: https://github.com/docker/buildx/releases. This is a subset because
# for us to support a platform implies also supporting things like running NPM on it, so it should
# be an explicit act to add a platform.

set -ue

# Normalize docker_arch to what's available
#
# Note: s390x and ppc64le were added for Knative
docker_arch=${DOCKER_ARCH:-$(uname -m)}
case ${docker_arch} in
  amd64* )
    docker_arch=amd64
    ;;
  x86_64* )
    docker_arch=amd64
    ;;
  arm64* )
    docker_arch=arm64
    ;;
  aarch64* )
    docker_arch=arm64
    ;;
  s390x* )
    docker_arch=s390x
    ;;
  ppc64le* )
    docker_arch=ppc64le
    ;;
  * )
    >&2 echo "Unsupported DOCKER_ARCH: ${docker_arch}"
    exit 1;
esac

echo ${docker_arch}


================================================
FILE: build-bin/docker/docker_args
================================================
#!/bin/sh
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

# This builds common docker arguments used by docker_build and docker_push.

# This script checks each variable value, so it isn't important to fail on unbound (set -u)
set -e

docker_file=${DOCKER_FILE:-docker/Dockerfile}
if ! test -f ${docker_file}; then
  >&2 echo "${docker_file} doesn't exist"
  exit 1
fi

# Add default labels for the day and the SHA we're building from
docker_args="${DOCKER_ARGS:-} -f ${docker_file} \
--label org.opencontainers.image.created=$(date +%Y-%m-%d) \
--label org.opencontainers.image.revision=$(git rev-parse --short HEAD)"

version=${1:-}
if [ -n "${version}" ]; then
  docker_args="${docker_args} --build-arg version=${version}"
fi

# When true, the artifact searched with `build-bin/maven/unjar` is in the context root
# Ensure .dockerignore allows the artifacts intended.
if [ "${RELEASE_FROM_MAVEN_BUILD}" = "true" ]; then
  docker_args="${docker_args} --build-arg release_from_maven_build=true"
fi

# When non-empty the target to build.
if [ -n "${DOCKER_TARGET}" ]; then
  docker_args="${docker_args} --target ${DOCKER_TARGET}"
fi

# When non-empty, becomes the base layer including tag appropriate for the image being built.
# e.g. ghcr.io/openzipkin/java:21.0.6_p7-jre
#
# This is not required to be a base (FROM scratch) image like ghcr.io/openzipkin/alpine:3.12.3
# See https://docs.docker.com/glossary/#parent-image
if [ -n "${DOCKER_PARENT_IMAGE}" ]; then
  docker_args="${docker_args} --build-arg docker_parent_image=${DOCKER_PARENT_IMAGE}"
fi

# When non-empty, becomes the build-arg alpine_version. e.g. "3.12.3"
# Used to align base layers from https://github.com/orgs/openzipkin/packages/container/package/alpine
if [ -n "${ALPINE_VERSION}" ]; then
  docker_args="${docker_args} --build-arg alpine_version=${ALPINE_VERSION}"
fi

# When non-empty, becomes the build-arg java_version. e.g. "21.0.6_p7"
# Used to align base layers from https://github.com/orgs/openzipkin/packages/container/package/java
if [ -n "${JAVA_VERSION}" ]; then
  docker_args="${docker_args} --build-arg java_version=${JAVA_VERSION}"

  # Only set java_home build arg when we control or can verify it.
  java_major_version=$(echo ${JAVA_VERSION}| cut -f1 -d .)
  case ${java_major_version} in
    8) java_home=/usr/lib/jvm/java-1.8-openjdk;;
    1?|2?|3?) java_home=/usr/lib/jvm/java-${java_major_version}-openjdk;;
  esac

  if [ -n "${java_home}" ]; then docker_args="${docker_args} --build-arg java_home=${java_home}"; fi
fi

# When non-empty, becomes the build-arg maven_classifier. e.g. "module" or "exec"
# Used as the classifier arg to ./build-bin/maven/maven_unjar. Allows building two images with the
# same Dockerfile, varying on classifier, like openzipkin/zipkin vs openzipkin/zipkin-slim
if [ -n "${MAVEN_CLASSIFIER}" ]; then
  docker_args="${docker_args} --build-arg maven_classifier=${MAVEN_CLASSIFIER}"
fi

echo ${docker_args}


================================================
FILE: build-bin/docker/docker_block_on_health
================================================
#!/bin/sh
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

# Blocks until a named docker container with a valid HEALTHCHECK instruction is healthy or not:

set -ue

container_name=${1?container_name is required}
container_id=$(docker ps  -q -f name=${container_name})

while status="$(docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" "${container_id}")"; do
  case $status in
    starting) sleep 1;;
    healthy) exit 0;;
    unhealthy) exit 1;;
  esac
done
exit 1


================================================
FILE: build-bin/docker/docker_build
================================================
#!/bin/sh
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

set -ue

docker_tag=${1?full docker_tag is required. Ex openzipkin/zipkin:test}
version=${2:-}
docker_args=$($(dirname "$0")/docker_args ${version})

# We don't need build kit, but Docker 20.10 no longer accepts --platform
# without it. It is simpler to always enable it vs require maintainers to use
# alternate OCI tools. See https://github.com/moby/moby/issues/41552
export DOCKER_BUILDKIT=1

echo "Building image ${docker_tag}"
docker build --network=host --pull ${docker_args} --tag ${docker_tag} .


================================================
FILE: build-bin/docker/docker_push
================================================
#!/bin/sh
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

# This script pushes images to GitHub Container Registry (ghcr.io).
#
# When a release, and DOCKER_RELEASE_REPOS is unset they also push to Docker Hub (docker.io).
#
# Note: In CI, `configure_docker_push` must be called before invoking this.
#
# Avoid buildx on push for reasons including:
#  * Caching is more complex as builder instances must be considered
#  * Platform builds run in parallel, leading to port conflict failures (ex in cassandra)
#  * 0.4.2 multi-platform builds have failed due to picking the wrong image for a FROM instruction
set -ue

docker_image=${1?docker_image is required, notably without a tag. Ex openzipkin/zipkin}
version=${2:-master}

# We don't need build kit, but Docker 20.10 no longer accepts --platform
# without it. It is simpler to always enable it vs require maintainers to use
# alternate OCI tools. See https://github.com/moby/moby/issues/41552
export DOCKER_BUILDKIT=1

case ${version} in
  master )
    is_release=false
    ;;
  *-SNAPSHOT )
    is_release=false
    ;;
  * )
    is_release=true
    ;;
esac

if [ "${is_release}" = "true" ]; then
  docker_tags=${DOCKER_TAGS:-}
  if [ -z "${docker_tags}" ]; then
    major_tag=$(echo "${version}" | cut -f1 -d. -s)
    minor_tag=$(echo "${version}" | cut -f1-2 -d. -s)
    subminor_tag="${version}"
    docker_tags="$subminor_tag $minor_tag $major_tag latest"
  fi
  docker_repos=${DOCKER_RELEASE_REPOS:-ghcr.io docker.io}
else
  docker_tags=master
  docker_repos=ghcr.io
fi

tags=""
for repo in ${docker_repos}; do
  tags="${tags}\n"
  for tag in ${docker_tags}; do
    tags="${tags} ${repo}/${docker_image}:${tag}"
  done
done

docker_args=$($(dirname "$0")/docker_args ${version})
# Note: s390x and ppc64le were added for Knative
docker_archs=${DOCKER_ARCHS:-amd64 arm64 s390x ppc64le}

echo "Will build the following architectures: ${docker_archs}"

docker_tag0="$(echo ${docker_tags} | awk '{print $1;}')"
docker_arch0="$(echo ${docker_archs} | awk '{print $1;}')"
arch_tags=""
for docker_arch in ${docker_archs}; do
  arch_tag=${docker_image}:${docker_tag0}-${docker_arch}
  echo "Building tag ${arch_tag}..."
  docker build --pull ${docker_args} --platform linux/${docker_arch} --tag ${arch_tag} .
  arch_tags="${arch_tags} ${arch_tag}"
done

echo "Will push the following tags:\n${tags}"

if [ "${docker_arch0}" = "${docker_archs}" ]; then
  # single architecture
  arch_tag=${docker_image}:${docker_tag0}-${docker_arch0}

  for tag in $(echo ${tags} | xargs); do
    docker tag ${arch_tag} ${tag}
    echo "Pushing tag ${tag}..."
    docker push ${tag}
  done

else
  # multi-architecture: make a manifest
  for tag in $(echo ${tags} | xargs); do
    manifest_tags=""
    for arch_tag in ${arch_tags}; do
      docker_arch=$(echo ${arch_tag} | sed 's/.*-//g')
      manifest_tag=${tag}-${docker_arch}
      docker tag ${arch_tag} ${manifest_tag}
      echo "Pushing tag ${manifest_tag}..."
      docker push ${manifest_tag}
      manifest_tags="${manifest_tags} ${manifest_tag}"
    done

    docker manifest create ${tag} ${manifest_tags}

    for manifest_tag in ${manifest_tags}; do
      docker_arch=$(echo ${manifest_tag} | sed 's/.*-//g')
      docker manifest annotate ${tag} ${manifest_tag} --os linux --arch ${docker_arch}
    done

    echo "Pushing manifest ${manifest_tag}..."
    docker manifest push -p ${tag}
  done
fi


================================================
FILE: build-bin/docker/docker_test_image
================================================
#!/bin/sh
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

# Tests a an image by awaiting its HEALTHCHECK.
#
# This can be made more sophisticated via docker-compose. For example, you can set a utility
# container that issues `wget` against your actual container in its HEALTHCHECK.

set -ue

# export this variable so that docker compose can use it
export DOCKER_IMAGE=${1?full docker_tag is required. Ex openzipkin/zipkin:test}
# The two options are to run a single container of the image, or docker compose which includes it.
docker_compose_file=${2:-build-bin/docker-compose-$(echo ${DOCKER_IMAGE}| sed 's~.*/\(.*\):.*~\1~g').yml}
docker_container=${3:-sut}

# First try to run the intended containers.
health_rc=0
if test -f "${docker_compose_file}"; then
  docker compose -f "${docker_compose_file}" up --remove-orphans -d --quiet-pull || health_rc=1
else
  docker run --name ${docker_container} -d ${DOCKER_IMAGE} || health_rc=1
fi

# Next, inspect the health. This is a blocking command which waits until HEALTHCHECK passes or not.
# This will fail if the container isn't healthy or doesn't exist (ex compose failed before creation)
if [ "${health_rc}" = "1" ] || ! build-bin/docker/docker_block_on_health ${docker_container}; then
  >&2 echo "*** Failed waiting for health of ${docker_container}"

  # Sadly, we can't `docker compose inspect`. This means we may not see the inspect output of the
  # container that failed in docker compose until this is revised to work around compose/issues/4155
  docker inspect --format='{{json .State.Health.Log}}' ${docker_container} || true

  # Log any containers output to console before we remove them.
  if test -f "${docker_compose_file}"; then
    docker compose -f "${docker_compose_file}" logs
  else
    docker logs ${docker_container} || true
  fi
  health_rc=1
fi

# Clean up any containers, so that we can run this again without conflict.
if test -f "${docker_compose_file}"; then
  docker compose -f "${docker_compose_file}" down
else
  docker kill ${docker_container} && docker rm ${docker_container}
fi

exit ${health_rc}



================================================
FILE: build-bin/docker-compose-zipkin-eureka.yml
================================================
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

# uses 2.4 so we can use condition: service_healthy
version: "2.4"

# Test both authenticated and unauthenticated, as if there is a Spring problem,
# the latter will crash. We only need to use HEALTHCHECK for this.
services:
  eureka:
    image: openzipkin/zipkin-eureka:test
    container_name: eureka
  sut:
    image: openzipkin/zipkin-eureka:test
    container_name: sut
    environment:
      EUREKA_USERNAME: testuser
      EUREKA_PASSWORD: testpassword
    depends_on:
      eureka:
        condition: service_healthy


================================================
FILE: build-bin/docker-compose-zipkin-ui.yml
================================================
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

# uses 2.4 so we can use condition: service_healthy
version: "2.4"

services:
  zipkin:
    # Use last build of Zipkin instead of adding a matrix build dependency
    image: ghcr.io/openzipkin/zipkin-slim:master
    container_name: zipkin
  # Use fixed service and container name 'sut; so our test script can copy/pasta
  sut:
    # This is the image just built. It is not in a remote repository.
    image: openzipkin/zipkin-ui:test
    container_name: sut
    environment:
      # This is the default value, set explicitly here for visibility
      ZIPKIN_BASE_URL: http://zipkin:9411
    depends_on:
      zipkin:
        condition: service_healthy


================================================
FILE: build-bin/docker-compose-zipkin-uiproxy.yml
================================================
#
# Copyright The OpenZipkin Authors
# SPDX-License-Identifier: Apache-2.0
#

# uses 2.4 so we can use condition: service_healthy
version: "2.4"

services:
  zipkin:
    # Use last build of Zipkin instead of adding a matrix build dependency
    image: ghcr.io/openzipkin/zipkin-slim:master
    container_name: zipkin
    environment:
      ZIPKIN
Download .txt
gitextract_cfx8oy44/

├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.md
│   │   ├── config.yml
│   │   └── feature.md
│   └── workflows/
│       ├── create_release.yml
│       ├── deploy.yml
│       ├── docker_push.yml
│       ├── lint.yml
│       ├── security.yml
│       ├── test.yml
│       └── test_readme.yml
├── .gitignore
├── .mvn/
│   └── wrapper/
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── .settings.xml
├── LICENSE
├── README.md
├── RELEASE.md
├── SECURITY.md
├── benchmarks/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       └── test/
│           ├── assembly/
│           │   └── test-jar.xml
│           ├── java/
│           │   └── zipkin2/
│           │       ├── EndpointBenchmarks.java
│           │       ├── SpanBenchmarks.java
│           │       ├── codec/
│           │       │   ├── CodecBenchmarks.java
│           │       │   ├── JacksonSpanDecoder.java
│           │       │   ├── JacksonSpanDecoderTest.java
│           │       │   ├── JsonCodecBenchmarks.java
│           │       │   ├── MoshiSpanDecoder.java
│           │       │   ├── MoshiSpanDecoderTest.java
│           │       │   ├── ProtoCodecBenchmarks.java
│           │       │   ├── ProtobufSpanDecoder.java
│           │       │   └── WireSpanDecoder.java
│           │       ├── collector/
│           │       │   └── MetricsBenchmarks.java
│           │       ├── elasticsearch/
│           │       │   └── internal/
│           │       │       └── BulkRequestBenchmarks.java
│           │       ├── internal/
│           │       │   ├── DelayLimiterBenchmarks.java
│           │       │   ├── Proto3CodecInteropTest.java
│           │       │   ├── ReadBufferBenchmarks.java
│           │       │   └── WriteBufferBenchmarks.java
│           │       └── server/
│           │           ├── ServerIntegratedBenchmark.java
│           │           └── internal/
│           │               └── throttle/
│           │                   └── ThrottledCallBenchmarks.java
│           └── resources/
│               ├── create-datasource-and-dashboard.sh
│               ├── prometheus.yml
│               ├── simplelogger.properties
│               ├── zipkin2-chinese.json
│               └── zipkin2-client.json
├── build-bin/
│   ├── README.md
│   ├── configure_deploy
│   ├── configure_lint
│   ├── configure_test
│   ├── deploy
│   ├── docker/
│   │   ├── configure_docker
│   │   ├── configure_docker_push
│   │   ├── docker-healthcheck
│   │   ├── docker_arch
│   │   ├── docker_args
│   │   ├── docker_block_on_health
│   │   ├── docker_build
│   │   ├── docker_push
│   │   └── docker_test_image
│   ├── docker-compose-zipkin-eureka.yml
│   ├── docker-compose-zipkin-ui.yml
│   ├── docker-compose-zipkin-uiproxy.yml
│   ├── docker-compose-zipkin.yml
│   ├── docker_push
│   ├── git/
│   │   ├── login_git
│   │   └── version_from_trigger_tag
│   ├── gpg/
│   │   └── configure_gpg
│   ├── javadoc_to_gh_pages
│   ├── lint
│   ├── maven/
│   │   ├── maven_build
│   │   ├── maven_build_or_unjar
│   │   ├── maven_deploy
│   │   ├── maven_go_offline
│   │   ├── maven_opts
│   │   ├── maven_release
│   │   └── maven_unjar
│   ├── maven_go_offline
│   ├── maybe_install_npm
│   ├── mlc_config.json
│   └── test
├── docker/
│   ├── Dockerfile
│   ├── RATIONALE.md
│   ├── README.md
│   ├── examples/
│   │   ├── .dockerignore
│   │   ├── README.md
│   │   ├── docker-compose-activemq.yml
│   │   ├── docker-compose-cassandra.yml
│   │   ├── docker-compose-dependencies.yml
│   │   ├── docker-compose-elasticsearch.yml
│   │   ├── docker-compose-eureka.yml
│   │   ├── docker-compose-example.yml
│   │   ├── docker-compose-kafka.yml
│   │   ├── docker-compose-mysql.yml
│   │   ├── docker-compose-prometheus.yml
│   │   ├── docker-compose-pulsar.yml
│   │   ├── docker-compose-rabbitmq.yml
│   │   ├── docker-compose-ui.yml
│   │   ├── docker-compose-uiproxy.yml
│   │   ├── docker-compose.yml
│   │   └── prometheus/
│   │       ├── create-datasource-and-dashboard.sh
│   │       └── prometheus.yml
│   ├── start-zipkin
│   └── test-images/
│       ├── zipkin-activemq/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   └── start-activemq
│       ├── zipkin-cassandra/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── install.sh
│       │   └── start-cassandra
│       ├── zipkin-elasticsearch7/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── config/
│       │   │   ├── elasticsearch.yml
│       │   │   └── log4j2.properties
│       │   └── start-elasticsearch
│       ├── zipkin-elasticsearch8/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   └── start-elasticsearch
│       ├── zipkin-eureka/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── pom.xml
│       │   ├── src/
│       │   │   └── main/
│       │   │       ├── java/
│       │   │       │   └── zipkin/
│       │   │       │       └── test/
│       │   │       │           ├── EurekaProperties.java
│       │   │       │           ├── EurekaSecurity.java
│       │   │       │           └── EurekaServer.java
│       │   │       └── resources/
│       │   │           └── application.yaml
│       │   └── start-eureka
│       ├── zipkin-kafka/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── install.sh
│       │   └── start-kafka-zookeeper
│       ├── zipkin-mysql/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── install.sh
│       │   └── start-mysql
│       ├── zipkin-opensearch2/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── config/
│       │   │   ├── log4j2.properties
│       │   │   └── opensearch.yml
│       │   └── start-opensearch
│       ├── zipkin-pulsar/
│       │   ├── Dockerfile
│       │   └── README.md
│       ├── zipkin-rabbitmq/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   └── config/
│       │       ├── defs.json
│       │       └── rabbitmq.conf
│       ├── zipkin-ui/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   ├── nginx.conf
│       │   └── start-nginx
│       └── zipkin-uiproxy/
│           ├── Dockerfile
│           ├── README.md
│           ├── nginx.conf
│           └── start-nginx
├── mvnw
├── mvnw.cmd
├── pom.xml
├── src/
│   └── etc/
│       └── header.txt
├── zipkin/
│   ├── RATIONALE.md
│   ├── bnd.bnd
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── zipkin2/
│       │           ├── Annotation.java
│       │           ├── Call.java
│       │           ├── Callback.java
│       │           ├── CheckResult.java
│       │           ├── Component.java
│       │           ├── DependencyLink.java
│       │           ├── Endpoint.java
│       │           ├── Span.java
│       │           ├── SpanBytesDecoderDetector.java
│       │           ├── codec/
│       │           │   ├── BytesDecoder.java
│       │           │   ├── BytesEncoder.java
│       │           │   ├── DependencyLinkBytesDecoder.java
│       │           │   ├── DependencyLinkBytesEncoder.java
│       │           │   ├── Encoding.java
│       │           │   ├── SpanBytesDecoder.java
│       │           │   └── SpanBytesEncoder.java
│       │           ├── internal/
│       │           │   ├── AggregateCall.java
│       │           │   ├── ClosedComponentException.java
│       │           │   ├── DateUtil.java
│       │           │   ├── DelayLimiter.java
│       │           │   ├── Dependencies.java
│       │           │   ├── DependencyLinker.java
│       │           │   ├── FilterTraces.java
│       │           │   ├── HexCodec.java
│       │           │   ├── JsonCodec.java
│       │           │   ├── JsonEscaper.java
│       │           │   ├── Nullable.java
│       │           │   ├── Proto3Codec.java
│       │           │   ├── Proto3Fields.java
│       │           │   ├── Proto3SpanWriter.java
│       │           │   ├── Proto3ZipkinFields.java
│       │           │   ├── ReadBuffer.java
│       │           │   ├── RecyclableBuffers.java
│       │           │   ├── SpanNode.java
│       │           │   ├── ThriftCodec.java
│       │           │   ├── ThriftEndpointCodec.java
│       │           │   ├── ThriftField.java
│       │           │   ├── Trace.java
│       │           │   ├── TracesAdapter.java
│       │           │   ├── V1JsonSpanReader.java
│       │           │   ├── V1JsonSpanWriter.java
│       │           │   ├── V1SpanWriter.java
│       │           │   ├── V1ThriftSpanReader.java
│       │           │   ├── V1ThriftSpanWriter.java
│       │           │   ├── V2SpanReader.java
│       │           │   ├── V2SpanWriter.java
│       │           │   └── WriteBuffer.java
│       │           ├── storage/
│       │           │   ├── AutocompleteTags.java
│       │           │   ├── ForwardingStorageComponent.java
│       │           │   ├── GroupByTraceId.java
│       │           │   ├── InMemoryStorage.java
│       │           │   ├── QueryRequest.java
│       │           │   ├── ServiceAndSpanNames.java
│       │           │   ├── SpanConsumer.java
│       │           │   ├── SpanStore.java
│       │           │   ├── StorageComponent.java
│       │           │   ├── StrictTraceId.java
│       │           │   └── Traces.java
│       │           └── v1/
│       │               ├── V1Annotation.java
│       │               ├── V1BinaryAnnotation.java
│       │               ├── V1Span.java
│       │               ├── V1SpanConverter.java
│       │               └── V2SpanConverter.java
│       └── test/
│           ├── java/
│           │   └── zipkin2/
│           │       ├── AnnotationTest.java
│           │       ├── CallTest.java
│           │       ├── EndpointTest.java
│           │       ├── SpanBytesDecoderDetectorTest.java
│           │       ├── SpanTest.java
│           │       ├── TestObjects.java
│           │       ├── codec/
│           │       │   ├── EncodingTest.java
│           │       │   ├── KryoTest.java
│           │       │   ├── SpanBytesDecoderTest.java
│           │       │   ├── SpanBytesEncoderTest.java
│           │       │   └── V1SpanBytesDecoderTest.java
│           │       ├── internal/
│           │       │   ├── AggregateCallTest.java
│           │       │   ├── DateUtilTest.java
│           │       │   ├── DelayLimiterTest.java
│           │       │   ├── DependenciesTest.java
│           │       │   ├── DependencyLinkerTest.java
│           │       │   ├── FilterTracesTest.java
│           │       │   ├── HexCodecTest.java
│           │       │   ├── JsonCodecTest.java
│           │       │   ├── JsonEscaperTest.java
│           │       │   ├── Proto3FieldsTest.java
│           │       │   ├── Proto3SpanWriterTest.java
│           │       │   ├── Proto3ZipkinFieldsTest.java
│           │       │   ├── ReadBufferTest.java
│           │       │   ├── SpanNodeTest.java
│           │       │   ├── TraceTest.java
│           │       │   ├── TracesAdapterTest.java
│           │       │   ├── V1JsonSpanWriterTest.java
│           │       │   ├── V1ThriftSpanWriterTest.java
│           │       │   ├── V2SpanWriterTest.java
│           │       │   └── WriteBufferTest.java
│           │       ├── storage/
│           │       │   ├── ForwardingStorageComponentTest.java
│           │       │   ├── GroupByTraceIdTest.java
│           │       │   ├── InMemoryStorageTest.java
│           │       │   ├── QueryRequestTest.java
│           │       │   └── StrictTraceIdTest.java
│           │       └── v1/
│           │           ├── SpanConverterTest.java
│           │           ├── V1SpanConverterTest.java
│           │           └── V1SpanTest.java
│           └── resources/
│               └── log4j2.properties
├── zipkin-collector/
│   ├── README.md
│   ├── activemq/
│   │   ├── RATIONALE.md
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── collector/
│   │       │               └── activemq/
│   │       │                   ├── ActiveMQCollector.java
│   │       │                   ├── ActiveMQSpanConsumer.java
│   │       │                   └── LazyInit.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── collector/
│   │           │           └── activemq/
│   │           │               ├── ActiveMQExtension.java
│   │           │               └── ITActiveMQCollector.java
│   │           └── resources/
│   │               └── simplelogger.properties
│   ├── core/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── collector/
│   │       │               ├── Collector.java
│   │       │               ├── CollectorComponent.java
│   │       │               ├── CollectorMetrics.java
│   │       │               ├── CollectorSampler.java
│   │       │               └── InMemoryCollectorMetrics.java
│   │       └── test/
│   │           └── java/
│   │               └── zipkin2/
│   │                   └── collector/
│   │                       ├── CollectorSamplerTest.java
│   │                       └── CollectorTest.java
│   ├── kafka/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── collector/
│   │       │               └── kafka/
│   │       │                   ├── KafkaCollector.java
│   │       │                   └── KafkaCollectorWorker.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── collector/
│   │           │           └── kafka/
│   │           │               ├── ITKafkaCollector.java
│   │           │               └── KafkaExtension.java
│   │           └── resources/
│   │               └── simplelogger.properties
│   ├── pom.xml
│   ├── pulsar/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── collector/
│   │       │               └── pulsar/
│   │       │                   ├── LazyPulsarInit.java
│   │       │                   ├── PulsarCollector.java
│   │       │                   └── PulsarSpanConsumer.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── collector/
│   │           │           └── pulsar/
│   │           │               ├── ITPulsarCollector.java
│   │           │               └── PulsarExtension.java
│   │           └── resources/
│   │               └── simplelogger.properties
│   ├── rabbitmq/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── collector/
│   │       │               └── rabbitmq/
│   │       │                   └── RabbitMQCollector.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── collector/
│   │           │           └── rabbitmq/
│   │           │               ├── ITRabbitMQCollector.java
│   │           │               ├── RabbitMQCollectorTest.java
│   │           │               └── RabbitMQExtension.java
│   │           └── resources/
│   │               └── simplelogger.properties
│   └── scribe/
│       ├── README.md
│       ├── pom.xml
│       └── src/
│           ├── main/
│           │   └── java/
│           │       └── zipkin2/
│           │           └── collector/
│           │               └── scribe/
│           │                   ├── NettyScribeServer.java
│           │                   ├── ScribeCollector.java
│           │                   ├── ScribeInboundHandler.java
│           │                   ├── ScribeSpanConsumer.java
│           │                   └── generated/
│           │                       ├── LogEntry.java
│           │                       ├── ResultCode.java
│           │                       └── Scribe.java
│           └── test/
│               ├── java/
│               │   └── zipkin2/
│               │       └── collector/
│               │           └── scribe/
│               │               ├── ITScribeCollector.java
│               │               ├── ScribeCollectorTest.java
│               │               └── ScribeSpanConsumerTest.java
│               └── resources/
│                   └── simplelogger.properties
├── zipkin-junit5/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── zipkin2/
│       │           └── junit5/
│       │               ├── HttpFailure.java
│       │               ├── ZipkinDispatcher.java
│       │               └── ZipkinExtension.java
│       └── test/
│           ├── java/
│           │   └── zipkin2/
│           │       └── junit5/
│           │           └── ZipkinExtensionTest.java
│           └── resources/
│               └── simplelogger.properties
├── zipkin-lens/
│   ├── .eslintignore
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── .linguirc
│   ├── .npmrc
│   ├── .prettierrc.js
│   ├── README.md
│   ├── index.html
│   ├── javadoc/
│   │   └── README.md
│   ├── package.json
│   ├── pom.xml
│   ├── src/
│   │   ├── components/
│   │   │   ├── App/
│   │   │   │   ├── AlertSnackbar.tsx
│   │   │   │   ├── App.tsx
│   │   │   │   ├── HeaderMenuItem.tsx
│   │   │   │   ├── LanguageSelector.test.tsx
│   │   │   │   ├── LanguageSelector.tsx
│   │   │   │   ├── Layout.test.jsx
│   │   │   │   ├── Layout.tsx
│   │   │   │   ├── ThemeSelector.tsx
│   │   │   │   ├── TraceIdSearch.tsx
│   │   │   │   ├── TraceJsonUploader.tsx
│   │   │   │   ├── index.js
│   │   │   │   ├── slice.test.ts
│   │   │   │   └── slice.ts
│   │   │   ├── DependenciesPage/
│   │   │   │   ├── DependenciesGraph.test.jsx
│   │   │   │   ├── DependenciesGraph.tsx
│   │   │   │   ├── DependenciesPage.test.jsx
│   │   │   │   ├── DependenciesPage.tsx
│   │   │   │   ├── NodeDetailData.test.jsx
│   │   │   │   ├── NodeDetailData.tsx
│   │   │   │   ├── VizceralWrapper.tsx
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── DiscoverPage/
│   │   │   │   ├── Criterion.ts
│   │   │   │   ├── DiscoverPage.tsx
│   │   │   │   ├── DiscoverPageContent.test.jsx
│   │   │   │   ├── DiscoverPageContent.tsx
│   │   │   │   ├── LookbackMenu.test.jsx
│   │   │   │   ├── LookbackMenu.tsx
│   │   │   │   ├── SearchBar/
│   │   │   │   │   ├── CriterionBox.test.jsx
│   │   │   │   │   ├── CriterionBox.tsx
│   │   │   │   │   ├── HowToUse.tsx
│   │   │   │   │   ├── SearchBar.test.jsx
│   │   │   │   │   ├── SearchBar.tsx
│   │   │   │   │   ├── SuggestionList.tsx
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── TraceSummaryRow.test.jsx
│   │   │   │   ├── TraceSummaryRow.tsx
│   │   │   │   ├── TraceSummaryTable.tsx
│   │   │   │   ├── index.js
│   │   │   │   └── lookback.ts
│   │   │   ├── TracePage/
│   │   │   │   ├── AnnotationTable/
│   │   │   │   │   ├── AnnotationTable.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── AnnotationTooltip/
│   │   │   │   │   ├── AnnotationTooltip.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── Header/
│   │   │   │   │   ├── Header.tsx
│   │   │   │   │   ├── HeaderMenu.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── MiniTimeline/
│   │   │   │   │   ├── MiniTimeline.tsx
│   │   │   │   │   ├── MiniTimelineOverlay.tsx
│   │   │   │   │   ├── MiniTimelineRow.tsx
│   │   │   │   │   ├── TimeRangeSelector.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── SpanDetailDrawer/
│   │   │   │   │   ├── AnnotationViewer.tsx
│   │   │   │   │   ├── SpanDetailDrawer.tsx
│   │   │   │   │   ├── TagList.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── SpanTable/
│   │   │   │   │   ├── SpanTable.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── TickMarkers/
│   │   │   │   │   ├── TickMarkers.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── Timeline/
│   │   │   │   │   ├── Timeline.tsx
│   │   │   │   │   ├── TimelineHeader.tsx
│   │   │   │   │   ├── TimelineRow.tsx
│   │   │   │   │   ├── TimelineRowAnnotation.tsx
│   │   │   │   │   ├── TimelineRowBar.tsx
│   │   │   │   │   ├── TimelineRowEdges.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── TracePage.jsx
│   │   │   │   ├── TracePageContent.tsx
│   │   │   │   ├── helpers.test.jsx
│   │   │   │   ├── helpers.ts
│   │   │   │   ├── index.jsx
│   │   │   │   └── types.ts
│   │   │   ├── UiConfig/
│   │   │   │   ├── UiConfig.jsx
│   │   │   │   ├── UiConfig.test.jsx
│   │   │   │   ├── constants.js
│   │   │   │   └── index.js
│   │   │   └── common/
│   │   │       ├── ExplainBox.tsx
│   │   │       ├── LoadingIndicator.tsx
│   │   │       ├── ServiceBadge.jsx
│   │   │       └── ServiceBadge.test.jsx
│   │   ├── constants/
│   │   │   ├── api.test.tsx
│   │   │   ├── api.ts
│   │   │   └── color.ts
│   │   ├── index.css
│   │   ├── index.tsx
│   │   ├── models/
│   │   │   ├── AdjustedTrace.ts
│   │   │   ├── Annotation.ts
│   │   │   ├── Dependencies.ts
│   │   │   ├── Endpoint.ts
│   │   │   ├── Span.ts
│   │   │   └── TraceSummary.ts
│   │   ├── prop-types/
│   │   │   └── index.js
│   │   ├── reducers/
│   │   │   └── index.ts
│   │   ├── setupTests.ts
│   │   ├── slices/
│   │   │   ├── autocompleteKeysSlice.ts
│   │   │   ├── autocompleteValuesSlice.ts
│   │   │   ├── dependenciesSlice.ts
│   │   │   ├── remoteServicesSlice.ts
│   │   │   ├── servicesSlice.ts
│   │   │   ├── spansSlice.ts
│   │   │   ├── tracesSlice.test.ts
│   │   │   └── tracesSlice.ts
│   │   ├── store/
│   │   │   ├── configure-store.js
│   │   │   └── index.ts
│   │   ├── test/
│   │   │   ├── data/
│   │   │   │   ├── malformed.js
│   │   │   │   └── skew.js
│   │   │   └── util/
│   │   │       └── render-with-default-settings.tsx
│   │   ├── translations/
│   │   │   ├── en/
│   │   │   │   ├── messages.d.ts
│   │   │   │   └── translations.json
│   │   │   ├── es/
│   │   │   │   ├── messages.d.ts
│   │   │   │   └── translations.json
│   │   │   ├── fr/
│   │   │   │   ├── messages.d.ts
│   │   │   │   └── translations.json
│   │   │   ├── i18n.ts
│   │   │   └── zh-cn/
│   │   │       ├── messages.d.ts
│   │   │       └── translations.json
│   │   ├── types/
│   │   │   ├── redux-thunk.d.ts
│   │   │   ├── styled-components.d.ts
│   │   │   └── vizceral-react.d.ts
│   │   ├── util/
│   │   │   ├── fetch-resource.js
│   │   │   ├── fetch-resource.test.js
│   │   │   ├── theme.ts
│   │   │   ├── timestamp.js
│   │   │   ├── trace.js
│   │   │   └── trace.test.js
│   │   ├── vite-env.d.ts
│   │   └── zipkin/
│   │       ├── clock-skew.js
│   │       ├── clock-skew.test.js
│   │       ├── dependency-linker.js
│   │       ├── dependency-linker.test.js
│   │       ├── index.js
│   │       ├── span-cleaner.js
│   │       ├── span-cleaner.test.js
│   │       ├── span-node.js
│   │       ├── span-node.test.js
│   │       ├── span-row.js
│   │       ├── span-row.test.js
│   │       ├── trace-constants.js
│   │       ├── trace.js
│   │       └── trace.test.js
│   ├── testdata/
│   │   ├── README.md
│   │   ├── ascend.json
│   │   ├── envoy.json
│   │   ├── messaging-kafka.json
│   │   ├── messaging.json
│   │   ├── messaging2.json
│   │   ├── simple-db-p6.json
│   │   ├── skew.json
│   │   ├── smartthings-mobile-web-install.json
│   │   ├── smartthings-oauth-authorization.json
│   │   └── yelp.json
│   ├── tsconfig.json
│   └── vite.config.ts
├── zipkin-server/
│   ├── RATIONALE.md
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   ├── zipkin/
│       │   │   │   └── server/
│       │   │   │       └── ZipkinServer.java
│       │   │   └── zipkin2/
│       │   │       └── server/
│       │   │           └── internal/
│       │   │               ├── BodyIsExceptionMessage.java
│       │   │               ├── ConditionalOnSelfTracing.java
│       │   │               ├── ConditionalOnThrottledStorage.java
│       │   │               ├── EnableZipkinServer.java
│       │   │               ├── InternalZipkinConfiguration.java
│       │   │               ├── JsonUtil.java
│       │   │               ├── MicrometerCollectorMetrics.java
│       │   │               ├── WrappingExecutorService.java
│       │   │               ├── ZipkinActuatorImporter.java
│       │   │               ├── ZipkinConfiguration.java
│       │   │               ├── ZipkinGrpcCollector.java
│       │   │               ├── ZipkinHttpCollector.java
│       │   │               ├── ZipkinHttpConfiguration.java
│       │   │               ├── ZipkinModuleImporter.java
│       │   │               ├── ZipkinQueryApiV2.java
│       │   │               ├── activemq/
│       │   │               │   ├── ZipkinActiveMQCollectorConfiguration.java
│       │   │               │   └── ZipkinActiveMQCollectorProperties.java
│       │   │               ├── banner/
│       │   │               │   └── ZipkinBanner.java
│       │   │               ├── brave/
│       │   │               │   ├── SelfTracingProperties.java
│       │   │               │   ├── TracedCall.java
│       │   │               │   ├── TracingStorageComponent.java
│       │   │               │   └── ZipkinSelfTracingConfiguration.java
│       │   │               ├── cassandra3/
│       │   │               │   ├── ZipkinCassandra3StorageConfiguration.java
│       │   │               │   └── ZipkinCassandra3StorageProperties.java
│       │   │               ├── elasticsearch/
│       │   │               │   ├── BasicAuthInterceptor.java
│       │   │               │   ├── BasicCredentials.java
│       │   │               │   ├── DynamicCredentialsFileLoader.java
│       │   │               │   ├── HttpClientFactory.java
│       │   │               │   ├── InitialEndpointSupplier.java
│       │   │               │   ├── LazyHttpClientImpl.java
│       │   │               │   ├── SslUtil.java
│       │   │               │   ├── ZipkinElasticsearchStorageConfiguration.java
│       │   │               │   └── ZipkinElasticsearchStorageProperties.java
│       │   │               ├── eureka/
│       │   │               │   ├── ZipkinEurekaDiscoveryConfiguration.java
│       │   │               │   └── ZipkinEurekaDiscoveryProperties.java
│       │   │               ├── health/
│       │   │               │   ├── ComponentHealth.java
│       │   │               │   └── ZipkinHealthController.java
│       │   │               ├── kafka/
│       │   │               │   ├── ZipkinKafkaCollectorConfiguration.java
│       │   │               │   └── ZipkinKafkaCollectorProperties.java
│       │   │               ├── mysql/
│       │   │               │   ├── ZipkinMySQLStorageConfiguration.java
│       │   │               │   ├── ZipkinMySQLStorageProperties.java
│       │   │               │   └── ZipkinSelfTracingMySQLStorageConfiguration.java
│       │   │               ├── package-info.java
│       │   │               ├── prometheus/
│       │   │               │   ├── ZipkinMetricsController.java
│       │   │               │   └── ZipkinPrometheusMetricsConfiguration.java
│       │   │               ├── pulsar/
│       │   │               │   ├── ZipkinPulsarCollectorConfiguration.java
│       │   │               │   └── ZipkinPulsarCollectorProperties.java
│       │   │               ├── rabbitmq/
│       │   │               │   ├── ZipkinRabbitMQCollectorConfiguration.java
│       │   │               │   └── ZipkinRabbitMQCollectorProperties.java
│       │   │               ├── scribe/
│       │   │               │   └── ZipkinScribeCollectorConfiguration.java
│       │   │               ├── throttle/
│       │   │               │   ├── LimiterMetrics.java
│       │   │               │   ├── MicrometerThrottleMetrics.java
│       │   │               │   ├── ThrottledCall.java
│       │   │               │   ├── ThrottledStorageComponent.java
│       │   │               │   └── ZipkinStorageThrottleProperties.java
│       │   │               └── ui/
│       │   │                   ├── CompressionProperties.java
│       │   │                   ├── ZipkinUiConfiguration.java
│       │   │                   └── ZipkinUiProperties.java
│       │   └── resources/
│       │       ├── info.json
│       │       ├── simplelogger.properties
│       │       ├── zipkin-server-shared.yml
│       │       ├── zipkin-server.yml
│       │       └── zipkin.txt
│       └── test/
│           ├── java/
│           │   └── zipkin2/
│           │       ├── collector/
│           │       │   ├── activemq/
│           │       │   │   └── ZipkinActiveMQCollectorPropertiesOverrideTest.java
│           │       │   ├── kafka/
│           │       │   │   └── ZipkinKafkaCollectorPropertiesOverrideTest.java
│           │       │   ├── pulsar/
│           │       │   │   └── ZipkinPulsarCollectorPropertiesOverrideTest.java
│           │       │   ├── rabbitmq/
│           │       │   │   └── ZipkinRabbitMQCollectorPropertiesOverrideTest.java
│           │       │   └── scribe/
│           │       │       └── ZipkinScribeCollectorConfigurationTest.java
│           │       ├── server/
│           │       │   └── internal/
│           │       │       ├── ITActuatorMappings.java
│           │       │       ├── ITZipkinGrpcCollector.java
│           │       │       ├── ITZipkinServer.java
│           │       │       ├── ITZipkinServerAutocomplete.java
│           │       │       ├── ITZipkinServerCORS.java
│           │       │       ├── ITZipkinServerHttpCollectorDisabled.java
│           │       │       ├── ITZipkinServerQueryDisabled.java
│           │       │       ├── ITZipkinServerSsl.java
│           │       │       ├── ITZipkinServerTimeout.java
│           │       │       ├── InMemoryConfiguration.java
│           │       │       ├── NoOpMeterRegistryConfiguration.java
│           │       │       ├── ZipkinActuatorImporterTest.java
│           │       │       ├── ZipkinHttpConfigurationTest.java
│           │       │       ├── ZipkinModuleImporterTest.java
│           │       │       ├── activemq/
│           │       │       │   ├── Access.java
│           │       │       │   ├── ZipkinActiveMQCollectorConfigurationTest.java
│           │       │       │   └── ZipkinActiveMQCollectorPropertiesTest.java
│           │       │       ├── banner/
│           │       │       │   └── ZipkinBannerTest.java
│           │       │       ├── brave/
│           │       │       │   └── ITZipkinSelfTracing.java
│           │       │       ├── cassandra3/
│           │       │       │   └── Access.java
│           │       │       ├── elasticsearch/
│           │       │       │   ├── Access.java
│           │       │       │   ├── ITElasticsearchAuth.java
│           │       │       │   ├── ITElasticsearchClientInitialization.java
│           │       │       │   ├── ITElasticsearchDynamicCredentials.java
│           │       │       │   ├── ITElasticsearchHealthCheck.java
│           │       │       │   ├── ITElasticsearchNoVerify.java
│           │       │       │   ├── ITElasticsearchSelfTracing.java
│           │       │       │   ├── InitialEndpointSupplierTest.java
│           │       │       │   ├── TestResponses.java
│           │       │       │   └── ZipkinElasticsearchStorageConfigurationTest.java
│           │       │       ├── eureka/
│           │       │       │   ├── BaseITZipkinEureka.java
│           │       │       │   ├── ITZipkinEureka.java
│           │       │       │   ├── ITZipkinEurekaAuthenticated.java
│           │       │       │   ├── ZipkinEurekaDiscoveryConfigurationTest.java
│           │       │       │   └── ZipkinEurekaDiscoveryPropertiesTest.java
│           │       │       ├── health/
│           │       │       │   ├── ComponentHealthTest.java
│           │       │       │   ├── ITZipkinHealth.java
│           │       │       │   ├── ITZipkinHealthDown.java
│           │       │       │   └── ZipkinHealthControllerTest.java
│           │       │       ├── kafka/
│           │       │       │   ├── Access.java
│           │       │       │   ├── ZipkinKafkaCollectorConfigurationTest.java
│           │       │       │   └── ZipkinKafkaCollectorPropertiesTest.java
│           │       │       ├── mysql/
│           │       │       │   └── Access.java
│           │       │       ├── prometheus/
│           │       │       │   ├── ITZipkinMetrics.java
│           │       │       │   ├── ITZipkinMetricsDirty.java
│           │       │       │   └── ZipkinPrometheusMetricsConfigurationTest.java
│           │       │       ├── pulsar/
│           │       │       │   ├── Access.java
│           │       │       │   ├── ZipkinPulsarCollectorConfigurationTest.java
│           │       │       │   └── ZipkinPulsarCollectorPropertiesTest.java
│           │       │       ├── rabbitmq/
│           │       │       │   ├── Access.java
│           │       │       │   ├── ZipkinRabbitMQCollectorConfigurationTest.java
│           │       │       │   └── ZipkinRabbitMQCollectorPropertiesTest.java
│           │       │       ├── throttle/
│           │       │       │   ├── FakeCall.java
│           │       │       │   ├── ThrottledCallTest.java
│           │       │       │   └── ThrottledStorageComponentTest.java
│           │       │       └── ui/
│           │       │           ├── ITZipkinUiConfiguration.java
│           │       │           └── ZipkinUiConfigurationTest.java
│           │       └── storage/
│           │           ├── cassandra/
│           │           │   └── ZipkinCassandraStorageAutoConfigurationTest.java
│           │           └── mysql/
│           │               └── v1/
│           │                   └── ZipkinMySQLStorageConfigurationTest.java
│           └── resources/
│               ├── application.yml
│               ├── banner.txt
│               ├── es-credentials
│               ├── es-credentials-invalid
│               ├── keystore.jks
│               ├── keystore.p12
│               ├── log4j2.properties
│               ├── simplelogger.properties
│               └── zipkin-lens/
│                   ├── index.html
│                   └── test.txt
├── zipkin-storage/
│   ├── README.md
│   ├── cassandra/
│   │   ├── RATIONALE.md
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── zipkin2/
│   │       │   │       └── storage/
│   │       │   │           └── cassandra/
│   │       │   │               ├── AnnotationCodec.java
│   │       │   │               ├── CassandraAutocompleteTags.java
│   │       │   │               ├── CassandraSpanConsumer.java
│   │       │   │               ├── CassandraSpanStore.java
│   │       │   │               ├── CassandraStorage.java
│   │       │   │               ├── CassandraStorageBuilder.java
│   │       │   │               ├── CassandraUtil.java
│   │       │   │               ├── DefaultSessionFactory.java
│   │       │   │               ├── EndpointCodec.java
│   │       │   │               ├── InsertSpan.java
│   │       │   │               ├── InsertTraceByServiceRemoteService.java
│   │       │   │               ├── InsertTraceByServiceSpan.java
│   │       │   │               ├── LazySession.java
│   │       │   │               ├── Schema.java
│   │       │   │               ├── SelectAutocompleteValues.java
│   │       │   │               ├── SelectDependencies.java
│   │       │   │               ├── SelectFromSpan.java
│   │       │   │               ├── SelectRemoteServiceNames.java
│   │       │   │               ├── SelectServiceNames.java
│   │       │   │               ├── SelectSpanNames.java
│   │       │   │               ├── SelectTraceIdsFromServiceRemoteService.java
│   │       │   │               ├── SelectTraceIdsFromServiceSpan.java
│   │       │   │               ├── SelectTraceIdsFromSpan.java
│   │       │   │               └── internal/
│   │       │   │                   ├── HostAndPort.java
│   │       │   │                   ├── KeyspaceMetadataUtil.java
│   │       │   │                   ├── Resources.java
│   │       │   │                   ├── SessionBuilder.java
│   │       │   │                   └── call/
│   │       │   │                       ├── AccumulateAllResults.java
│   │       │   │                       ├── AccumulateTraceIdTsUuid.java
│   │       │   │                       ├── AggregateIntoMap.java
│   │       │   │                       ├── DeduplicatingInsert.java
│   │       │   │                       ├── DistinctSortedStrings.java
│   │       │   │                       ├── InsertEntry.java
│   │       │   │                       ├── IntersectKeySets.java
│   │       │   │                       ├── IntersectMaps.java
│   │       │   │                       └── ResultSetFutureCall.java
│   │       │   └── resources/
│   │       │       ├── zipkin2-schema-indexes.cql
│   │       │       ├── zipkin2-schema-upgrade-1.cql
│   │       │       ├── zipkin2-schema-upgrade-2.cql
│   │       │       └── zipkin2-schema.cql
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── storage/
│   │           │           └── cassandra/
│   │           │               ├── CassandraContainer.java
│   │           │               ├── CassandraSpanConsumerTest.java
│   │           │               ├── CassandraSpanStoreTest.java
│   │           │               ├── CassandraStorageBuilderTest.java
│   │           │               ├── CassandraStorageTest.java
│   │           │               ├── CassandraUtilTest.java
│   │           │               ├── ITCassandraStorage.java
│   │           │               ├── ITCassandraStorageHeavy.java
│   │           │               ├── ITEnsureSchema.java
│   │           │               ├── ITSpanConsumer.java
│   │           │               ├── InternalForTests.java
│   │           │               ├── SchemaTest.java
│   │           │               └── internal/
│   │           │                   ├── HostAndPortTest.java
│   │           │                   ├── SessionBuilderTest.java
│   │           │                   └── call/
│   │           │                       ├── DeduplicatingInsertTest.java
│   │           │                       └── ResultSetFutureCallTest.java
│   │           └── resources/
│   │               ├── autocomplete_tags-stress.yaml
│   │               ├── remote_service_by_service-stress.yaml
│   │               ├── simplelogger.properties
│   │               ├── span-stress.yaml
│   │               ├── span_by_service-stress.yaml
│   │               ├── trace_by_service_remote_service-stress.yaml
│   │               ├── trace_by_service_span-stress.yaml
│   │               ├── zipkin2-schema-indexes-original.cql
│   │               └── zipkin2-test-schema.cql
│   ├── elasticsearch/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── zipkin2/
│   │       │           └── elasticsearch/
│   │       │               ├── BaseVersion.java
│   │       │               ├── BodyConverters.java
│   │       │               ├── ElasticsearchAutocompleteTags.java
│   │       │               ├── ElasticsearchSpanConsumer.java
│   │       │               ├── ElasticsearchSpanStore.java
│   │       │               ├── ElasticsearchSpecificTemplates.java
│   │       │               ├── ElasticsearchStorage.java
│   │       │               ├── ElasticsearchVersion.java
│   │       │               ├── EnsureIndexTemplate.java
│   │       │               ├── IndexTemplates.java
│   │       │               ├── OpensearchSpecificTemplates.java
│   │       │               ├── OpensearchVersion.java
│   │       │               ├── VersionSpecificTemplates.java
│   │       │               └── internal/
│   │       │                   ├── BulkCallBuilder.java
│   │       │                   ├── BulkIndexWriter.java
│   │       │                   ├── IndexNameFormatter.java
│   │       │                   ├── Internal.java
│   │       │                   ├── JsonReaders.java
│   │       │                   ├── JsonSerializers.java
│   │       │                   └── client/
│   │       │                       ├── Aggregation.java
│   │       │                       ├── HttpCall.java
│   │       │                       ├── SearchCallFactory.java
│   │       │                       ├── SearchRequest.java
│   │       │                       └── SearchResultConverter.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── elasticsearch/
│   │           │           ├── BaseVersionTest.java
│   │           │           ├── ElasticsearchAutocompleteTagsTest.java
│   │           │           ├── ElasticsearchSpanConsumerTest.java
│   │           │           ├── ElasticsearchSpanStoreTest.java
│   │           │           ├── ElasticsearchSpecificTemplatesTest.java
│   │           │           ├── ElasticsearchStorageTest.java
│   │           │           ├── ElasticsearchVersionTest.java
│   │           │           ├── InternalForTests.java
│   │           │           ├── JsonReadersTest.java
│   │           │           ├── JsonSerializersTest.java
│   │           │           ├── OpensearchSpecificTemplatesTest.java
│   │           │           ├── OpensearchVersionTest.java
│   │           │           ├── SearchResultConverterTest.java
│   │           │           ├── TestResponses.java
│   │           │           ├── integration/
│   │           │           │   ├── ElasticsearchBaseExtension.java
│   │           │           │   ├── ElasticsearchExtension.java
│   │           │           │   ├── ITElasticsearchStorage.java
│   │           │           │   ├── ITElasticsearchStorageV7.java
│   │           │           │   ├── ITElasticsearchStorageV8.java
│   │           │           │   ├── ITEnsureIndexTemplate.java
│   │           │           │   ├── ITOpenSearchStorageV2.java
│   │           │           │   ├── IgnoredDeprecationWarnings.java
│   │           │           │   └── OpenSearchExtension.java
│   │           │           └── internal/
│   │           │               ├── BulkCallBuilderTest.java
│   │           │               ├── BulkIndexWriterTest.java
│   │           │               ├── IndexNameFormatterTest.java
│   │           │               └── client/
│   │           │                   ├── HttpCallTest.java
│   │           │                   ├── SearchCallFactoryTest.java
│   │           │                   └── SearchRequestTest.java
│   │           └── resources/
│   │               └── simplelogger.properties
│   ├── mysql-v1/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── zipkin2/
│   │       │   │       └── storage/
│   │       │   │           └── mysql/
│   │       │   │               └── v1/
│   │       │   │                   ├── AggregateDependencies.java
│   │       │   │                   ├── DSLContexts.java
│   │       │   │                   ├── DataSourceCall.java
│   │       │   │                   ├── DependencyLinkV2SpanIterator.java
│   │       │   │                   ├── HasErrorCount.java
│   │       │   │                   ├── HasIpv6.java
│   │       │   │                   ├── HasPreAggregatedDependencies.java
│   │       │   │                   ├── HasRemoteServiceName.java
│   │       │   │                   ├── HasTraceIdHigh.java
│   │       │   │                   ├── MySQLAutocompleteTags.java
│   │       │   │                   ├── MySQLSpanConsumer.java
│   │       │   │                   ├── MySQLSpanStore.java
│   │       │   │                   ├── MySQLStorage.java
│   │       │   │                   ├── Pair.java
│   │       │   │                   ├── PeekingIterator.java
│   │       │   │                   ├── Schema.java
│   │       │   │                   ├── SelectAnnotationServiceNames.java
│   │       │   │                   ├── SelectAutocompleteValues.java
│   │       │   │                   ├── SelectDependencies.java
│   │       │   │                   ├── SelectRemoteServiceNames.java
│   │       │   │                   ├── SelectSpanNames.java
│   │       │   │                   ├── SelectSpansAndAnnotations.java
│   │       │   │                   └── internal/
│   │       │   │                       └── generated/
│   │       │   │                           ├── DefaultCatalog.java
│   │       │   │                           ├── Indexes.java
│   │       │   │                           ├── Keys.java
│   │       │   │                           ├── Tables.java
│   │       │   │                           ├── Zipkin.java
│   │       │   │                           └── tables/
│   │       │   │                               ├── ZipkinAnnotations.java
│   │       │   │                               ├── ZipkinDependencies.java
│   │       │   │                               └── ZipkinSpans.java
│   │       │   └── resources/
│   │       │       └── mysql.sql
│   │       └── test/
│   │           ├── java/
│   │           │   └── zipkin2/
│   │           │       └── storage/
│   │           │           └── mysql/
│   │           │               └── v1/
│   │           │                   ├── DependencyLinkV2SpanIteratorTest.java
│   │           │                   ├── ITMySQLStorage.java
│   │           │                   ├── MySQLExtension.java
│   │           │                   ├── MySQLStorageTest.java
│   │           │                   ├── SchemaTest.java
│   │           │                   └── SelectSpansAndAnnotationsTest.java
│   │           └── resources/
│   │               ├── drop_zipkin_tables.sql
│   │               └── simplelogger.properties
│   └── pom.xml
└── zipkin-tests/
    ├── pom.xml
    └── src/
        ├── main/
        │   └── java/
        │       └── zipkin2/
        │           ├── TestObjects.java
        │           └── storage/
        │               ├── ITAutocompleteTags.java
        │               ├── ITDependencies.java
        │               ├── ITDependenciesHeavy.java
        │               ├── ITSearchEnabledFalse.java
        │               ├── ITServiceAndSpanNames.java
        │               ├── ITSpanStore.java
        │               ├── ITSpanStoreHeavy.java
        │               ├── ITStorage.java
        │               ├── ITStrictTraceIdFalse.java
        │               └── ITTraces.java
        └── test/
            └── java/
                └── zipkin2/
                    └── storage/
                        └── ITInMemoryStorage.java
Download .txt
Showing preview only (520K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5515 symbols across 513 files)

FILE: benchmarks/src/test/java/zipkin2/EndpointBenchmarks.java
  class EndpointBenchmarks (line 27) | @Measurement(iterations = 5, time = 1)
    method parseIpv4_literal (line 49) | @Benchmark public boolean parseIpv4_literal() {
    method parseIpv4_addr (line 53) | @Benchmark public boolean parseIpv4_addr() {
    method parseIpv4_bytes (line 57) | @Benchmark public boolean parseIpv4_bytes() {
    method parseIpv6_literal (line 61) | @Benchmark public boolean parseIpv6_literal() {
    method parseIpv6_addr (line 65) | @Benchmark public boolean parseIpv6_addr() {
    method parseIpv6_bytes (line 69) | @Benchmark public boolean parseIpv6_bytes() {
    method main (line 74) | public static void main(String[] args) throws RunnerException {

FILE: benchmarks/src/test/java/zipkin2/SpanBenchmarks.java
  class SpanBenchmarks (line 29) | @Measurement(iterations = 5, time = 1)
    method SpanBenchmarks (line 45) | public SpanBenchmarks() {
    method buildClientSpan (line 53) | @Benchmark
    method buildClientSpan_longs (line 58) | @Benchmark
    method buildClientSpan (line 63) | static Span buildClientSpan(Span.Builder builder) {
    method buildClientSpan_longs (line 81) | static Span buildClientSpan_longs(Span.Builder builder) {
    method buildClientSpan_clear (line 99) | @Benchmark
    method buildClientSpan_clone (line 104) | @Benchmark
    method serialize_kryo (line 121) | @Benchmark
    method deserialize_kryo (line 126) | @Benchmark
    method padLeft_1Char (line 134) | @Benchmark
    method padLeft_15Chars (line 139) | @Benchmark
    method padLeft_17Chars (line 144) | @Benchmark
    method padLeft_31Chars (line 149) | @Benchmark
    method main (line 155) | public static void main(String[] args) throws RunnerException {

FILE: benchmarks/src/test/java/zipkin2/codec/CodecBenchmarks.java
  class CodecBenchmarks (line 39) | @Measurement(iterations = 5, time = 1)
    method decodeClientSpan_JSON_V1 (line 55) | @Benchmark
    method decodeClientSpan_JSON_V2 (line 60) | @Benchmark
    method decodeClientSpan_PROTO3 (line 65) | @Benchmark
    method decodeClientSpan_THRIFT (line 70) | @Benchmark
    method sizeInBytesClientSpan_JSON_V2 (line 75) | @Benchmark
    method sizeInBytesClientSpan_JSON_V1 (line 80) | @Benchmark
    method sizeInBytesClientSpan_PROTO3 (line 85) | @Benchmark
    method sizeInBytesClientSpan_THRIFT (line 90) | @Benchmark
    method writeClientSpan_JSON_V2 (line 95) | @Benchmark
    method writeClientSpan_JSON_V1 (line 100) | @Benchmark
    method writeClientSpan_PROTO3 (line 105) | @Benchmark
    method writeClientSpan_THRIFT (line 110) | @Benchmark
    method decodeTenClientSpans_JSON_V2 (line 115) | @Benchmark
    method writeTenClientSpans_JSON_V2 (line 120) | @Benchmark
    method decodeChineseSpan_JSON_V1 (line 131) | @Benchmark
    method decodeChineseSpan_JSON_V2 (line 136) | @Benchmark
    method decodeChineseSpan_PROTO3 (line 141) | @Benchmark
    method decodeChineseSpan_THRIFT (line 146) | @Benchmark
    method writeChineseSpan_JSON_V2 (line 151) | @Benchmark
    method writeChineseSpan_JSON_V1 (line 156) | @Benchmark
    method writeChineseSpan_PROTO3 (line 161) | @Benchmark
    method writeChineseSpan_THRIFT (line 166) | @Benchmark
    method main (line 172) | public static void main(String[] args) throws RunnerException {

FILE: benchmarks/src/test/java/zipkin2/codec/JacksonSpanDecoder.java
  class JacksonSpanDecoder (line 20) | public final class JacksonSpanDecoder {
    method decodeList (line 24) | public static List<Span> decodeList(byte[] spans) {
    method decodeList (line 32) | public static List<Span> decodeList(ByteBuffer spans) {
    method decodeOne (line 40) | public static Span decodeOne(byte[] span) {
    method decodeOne (line 48) | public static Span decodeOne(ByteBuffer span) {
    method decodeList (line 56) | static List<Span> decodeList(JsonParser jsonParser) {
    method decodeOne (line 74) | static Span decodeOne(JsonParser jsonParser) {
    method parseSpan (line 85) | static Span parseSpan(JsonParser jsonParser) throws IOException {
    method parseEndpoint (line 159) | static Endpoint parseEndpoint(JsonParser jsonParser) throws IOException {
    method parseAnnotation (line 202) | static Annotation parseAnnotation(JsonParser jsonParser) throws IOExce...

FILE: benchmarks/src/test/java/zipkin2/codec/JacksonSpanDecoderTest.java
  class JacksonSpanDecoderTest (line 15) | public class JacksonSpanDecoderTest {
    method decodeList_bytes (line 19) | @Test void decodeList_bytes() {
    method decodeList_byteBuffer (line 24) | @Test void decodeList_byteBuffer() {
    method decodeOne (line 35) | @Test void decodeOne() {
    method decodeOne_byteBuffer (line 40) | @Test void decodeOne_byteBuffer() {

FILE: benchmarks/src/test/java/zipkin2/codec/JsonCodecBenchmarks.java
  class JsonCodecBenchmarks (line 32) | @Measurement(iterations = 5, time = 1)
    method setup (line 51) | @Setup public void setup() {
    method tearDown (line 56) | @TearDown public void tearDown() {
    method bytes_jacksonDecoder (line 60) | @Benchmark public List<Span> bytes_jacksonDecoder() {
    method bytes_moshiDecoder (line 64) | @Benchmark public List<Span> bytes_moshiDecoder() {
    method bytes_zipkinDecoder (line 68) | @Benchmark public List<Span> bytes_zipkinDecoder() {
    method bytebuffer_jacksonDecoder (line 72) | @Benchmark public List<Span> bytebuffer_jacksonDecoder() {
    method bytebuffer_moshiDecoder (line 76) | @Benchmark public List<Span> bytebuffer_moshiDecoder() {
    method bytebuffer_zipkinDecoder (line 80) | @Benchmark public List<Span> bytebuffer_zipkinDecoder() {
    method main (line 85) | public static void main(String[] args) throws Exception {

FILE: benchmarks/src/test/java/zipkin2/codec/MoshiSpanDecoder.java
  class MoshiSpanDecoder (line 28) | public final class MoshiSpanDecoder {
    method create (line 31) | public static MoshiSpanDecoder create() {
    method MoshiSpanDecoder (line 35) | MoshiSpanDecoder() {
    method decodeList (line 41) | public List<Span> decodeList(byte[] spans) {
    method decodeList (line 50) | public List<Span> decodeList(ByteBuffer spans) {
    class ByteBufferSource (line 58) | static final class ByteBufferSource implements okio.Source {
      method ByteBufferSource (line 63) | ByteBufferSource(ByteBuffer source) {
      method read (line 67) | @Override public long read(Buffer sink, long byteCount) {
      method timeout (line 79) | @Override public Timeout timeout() {
      method close (line 83) | @Override public void close() {
    method fromJson (line 89) | @Override
    method toJson (line 156) | @Override
    method fromJson (line 164) | @Override
    method toJson (line 188) | @Override
    method fromJson (line 196) | @Override
    method toJson (line 234) | @Override

FILE: benchmarks/src/test/java/zipkin2/codec/MoshiSpanDecoderTest.java
  class MoshiSpanDecoderTest (line 14) | public class MoshiSpanDecoderTest {
    method decodeList_bytes (line 17) | @Test void decodeList_bytes() {
    method decodeList_byteBuffer (line 22) | @Test void decodeList_byteBuffer() {

FILE: benchmarks/src/test/java/zipkin2/codec/ProtoCodecBenchmarks.java
  class ProtoCodecBenchmarks (line 32) | @Measurement(iterations = 5, time = 1)
    method setup (line 50) | @Setup
    method tearDown (line 56) | @TearDown
    method bytes_zipkinDecoder (line 61) | @Benchmark
    method bytes_protobufDecoder (line 66) | @Benchmark
    method bytes_wireDecoder (line 71) | @Benchmark
    method bytebuffer_zipkinDecoder (line 76) | @Benchmark
    method bytebuffer_protobufDecoder (line 81) | @Benchmark
    method bytebuffer_wireDecoder (line 86) | @Benchmark
    method main (line 92) | public static void main(String[] args) throws Exception {

FILE: benchmarks/src/test/java/zipkin2/codec/ProtobufSpanDecoder.java
  class ProtobufSpanDecoder (line 18) | public class ProtobufSpanDecoder {
    method decodeTag (line 26) | static boolean decodeTag(CodedInputStream input, Span.Builder span) th...
    method decodeAnnotation (line 57) | static boolean decodeAnnotation(CodedInputStream input, Span.Builder s...
    method decodeEndpoint (line 88) | private static Endpoint decodeEndpoint(CodedInputStream input) throws ...
    method decodeOne (line 120) | public static Span decodeOne(CodedInputStream input) throws IOException {
    method decodeList (line 219) | public static List<Span> decodeList(byte[] spans) {
    method decodeList (line 223) | public static List<Span> decodeList(ByteBuffer spans) {
    method decodeList (line 227) | public static List<Span> decodeList(CodedInputStream input) {
    method readHexString (line 261) | private static String readHexString(CodedInputStream input) throws IOE...
    method logAndSkip (line 281) | static void logAndSkip(CodedInputStream input, int tag) throws IOExcep...

FILE: benchmarks/src/test/java/zipkin2/codec/WireSpanDecoder.java
  class WireSpanDecoder (line 22) | public class WireSpanDecoder {
    method decodeTag (line 26) | static boolean decodeTag(ProtoReader input, Span.Builder span) throws ...
    method decodeAnnotation (line 57) | static boolean decodeAnnotation(ProtoReader input, Span.Builder span) ...
    method decodeEndpoint (line 88) | private static Endpoint decodeEndpoint(ProtoReader input) throws IOExc...
    method decodeOne (line 121) | public static Span decodeOne(ProtoReader input) throws IOException {
    method decodeList (line 213) | public static List<Span> decodeList(byte[] spans) {
    method decodeList (line 217) | public static List<Span> decodeList(ByteBuffer spans) {
    method decodeList (line 227) | public static List<Span> decodeList(ProtoReader input) {
    method readHexString (line 276) | private static String readHexString(ProtoReader input) throws IOExcept...
    method logAndSkip (line 296) | static void logAndSkip(ProtoReader input, int tag) throws IOException {

FILE: benchmarks/src/test/java/zipkin2/collector/MetricsBenchmarks.java
  class MetricsBenchmarks (line 27) | @Measurement(iterations = 80, time = 1)
    method incrementBytes_longSpans_inMemory (line 45) | @Benchmark
    method incrementBytes_longSpans_Actuate (line 50) | @Benchmark
    method incrementBytes_mediumSpans_inMemory (line 55) | @Benchmark
    method incrementBytes_mediumSpans_Actuate (line 60) | @Benchmark
    method incrementBytes_shortSpans_inMemory (line 65) | @Benchmark
    method incrementBytes_shortSpans_Actuate (line 70) | @Benchmark
    method incrementBytes (line 75) | private int incrementBytes(CollectorMetrics collectorMetrics, int byte...
    method main (line 81) | public static void main(String[] args) throws RunnerException {

FILE: benchmarks/src/test/java/zipkin2/elasticsearch/internal/BulkRequestBenchmarks.java
  class BulkRequestBenchmarks (line 34) | @Measurement(iterations = 5, time = 1)
    method writeRequest_singleSpan (line 52) | @Benchmark public ByteBuf writeRequest_singleSpan() {
    method buildAndWriteRequest_singleSpan (line 56) | @Benchmark public HttpRequest buildAndWriteRequest_singleSpan() {
    method buildAndWriteRequest_tenSpans (line 62) | @Benchmark public HttpRequest buildAndWriteRequest_tenSpans() {
    method main (line 71) | public static void main(String[] args) throws RunnerException {

FILE: benchmarks/src/test/java/zipkin2/internal/DelayLimiterBenchmarks.java
  class DelayLimiterBenchmarks (line 24) | @Measurement(iterations = 5, time = 1)
    method shouldInvoke_randomData (line 39) | @Benchmark public boolean shouldInvoke_randomData() {
    method shouldInvoke_sameData (line 43) | @Benchmark public boolean shouldInvoke_sameData() {
    method main (line 48) | public static void main(String[] args) throws RunnerException {

FILE: benchmarks/src/test/java/zipkin2/internal/Proto3CodecInteropTest.java
  class Proto3CodecInteropTest (line 32) | public class Proto3CodecInteropTest {
    method encodeIsCompatible (line 90) | @Test void encodeIsCompatible() throws IOException {
    method decodeOneIsCompatible (line 99) | @Test void decodeOneIsCompatible() {
    method decodeListIsCompatible (line 104) | @Test void decodeListIsCompatible() {
    method encodeListIsCompatible_buff (line 109) | @Test void encodeListIsCompatible_buff() {
    method encodeListIsCompatible (line 122) | @Test void encodeListIsCompatible() {
    method span_sizeInBytes_matchesWire (line 129) | @Test void span_sizeInBytes_matchesWire() {
    method annotation_sizeInBytes_matchesWire (line 134) | @Test void annotation_sizeInBytes_matchesWire() {
    method annotation_write_matchesWire (line 142) | @Test void annotation_write_matchesWire() {
    method annotation_read_matchesWireEncodingWithTag (line 153) | @Test void annotation_read_matchesWireEncodingWithTag() {
    method endpoint_sizeInBytes_matchesWireEncodingWithTag (line 167) | @Test void endpoint_sizeInBytes_matchesWireEncodingWithTag() {
    method localEndpoint_write_matchesWire (line 177) | @Test void localEndpoint_write_matchesWire() {
    method remoteEndpoint_write_matchesWire (line 186) | @Test void remoteEndpoint_write_matchesWire() {
    method tag_sizeInBytes_matchesWire (line 195) | @Test void tag_sizeInBytes_matchesWire() {
    method writeTagField_matchesWire (line 203) | @Test void writeTagField_matchesWire() {
    method writeTagField_matchesWire_emptyValue (line 214) | @Test void writeTagField_matchesWire_emptyValue() {
    method zipkinSpanBuilder (line 225) | static zipkin2.Span.Builder zipkinSpanBuilder() {

FILE: benchmarks/src/test/java/zipkin2/internal/ReadBufferBenchmarks.java
  class ReadBufferBenchmarks (line 23) | @Measurement(iterations = 5, time = 1)
    method readLong (line 36) | @Benchmark public long readLong() {
    method readLong_localArray (line 48) | @Benchmark public long readLong_localArray() {
    method readLong_8arity_localArray (line 61) | @Benchmark public long readLong_8arity_localArray() {
    method readLong_8arity (line 75) | @Benchmark public long readLong_8arity() {
    method readLong (line 90) | static long readLong(int p0, int p1, int p2, int p3, int p4, int p5, i...
    method readLongReverseBytes (line 101) | @Benchmark public long readLongReverseBytes() {
    method main (line 106) | public static void main(String[] args) throws RunnerException {

FILE: benchmarks/src/test/java/zipkin2/internal/WriteBufferBenchmarks.java
  class WriteBufferBenchmarks (line 26) | @Measurement(iterations = 5, time = 1)
    method utf8SizeInBytes_chinese (line 44) | @Benchmark public int utf8SizeInBytes_chinese() {
    method writeUtf8_chinese (line 48) | @Benchmark public byte[] writeUtf8_chinese() {
    method writeUtf8_chinese_jdk (line 54) | @Benchmark public ByteBuffer writeUtf8_chinese_jdk() {
    method varIntSizeInBytes_32 (line 58) | @Benchmark public int varIntSizeInBytes_32() {
    method varIntSizeInBytes_64 (line 62) | @Benchmark public int varIntSizeInBytes_64() {
    method writeVarint_32 (line 66) | @Benchmark public int writeVarint_32() {
    method writeVarint_64 (line 71) | @Benchmark public int writeVarint_64() {
    method writeLongLe (line 76) | @Benchmark public int writeLongLe() {
    method main (line 82) | public static void main(String[] args) throws RunnerException {

FILE: benchmarks/src/test/java/zipkin2/server/ServerIntegratedBenchmark.java
  class ServerIntegratedBenchmark (line 58) | @Disabled  // Run manually
    method setUp (line 70) | @BeforeEach void setUp() {
    method tearDown (line 74) | @AfterEach void tearDown() {
    method inMemory (line 78) | @Test void inMemory() throws Exception {
    method elasticsearch (line 82) | @Test void elasticsearch() throws Exception {
    method cassandra3 (line 96) | @Test void cassandra3() throws Exception {
    method mysql (line 110) | @Test void mysql() throws Exception {
    method runBenchmark (line 124) | void runBenchmark(@Nullable GenericContainer<?> storage) throws Except...
    method runBenchmark (line 128) | void runBenchmark(@Nullable GenericContainer<?> storage, GenericContai...
    method createZipkinContainer (line 248) | GenericContainer<?> createZipkinContainer(@Nullable GenericContainer<?...
    method printContainerMapping (line 324) | static void printContainerMapping(GenericContainer<?> container) {
    method printQuartiles (line 333) | static void printQuartiles(WebClient prometheus, String metric) throws...
    method printHistogram (line 340) | static void printHistogram(WebClient prometheus, String metric) throws...
    method prometheusValue (line 348) | static String prometheusValue(WebClient prometheus, String query) thro...

FILE: benchmarks/src/test/java/zipkin2/server/internal/throttle/ThrottledCallBenchmarks.java
  class ThrottledCallBenchmarks (line 36) | @Measurement(iterations = 5, time = 1)
    method setup (line 48) | @Setup public void setup() {
    method tearDown (line 58) | @TearDown public void tearDown() {
    method execute (line 63) | @Benchmark public Object execute() throws IOException {
    method execute_overCapacity (line 67) | @Benchmark public void execute_overCapacity() throws IOException {
    method execute_throttled (line 78) | @Benchmark public void execute_throttled() throws IOException {
    class FakeCall (line 85) | static final class FakeCall extends Call.Base<Void> {
      method FakeCall (line 89) | FakeCall(Executor executor) {
      method doExecute (line 93) | @Override public Void doExecute() throws IOException {
      method doEnqueue (line 98) | @Override public void doEnqueue(Callback<Void> callback) {
      method clone (line 108) | @Override public FakeCall clone() {
    method main (line 114) | public static void main(String[] args) throws RunnerException {

FILE: docker/test-images/zipkin-eureka/src/main/java/zipkin/test/EurekaProperties.java
  class EurekaProperties (line 10) | @ConfigurationProperties("eureka")
    method getUsername (line 19) | public String getUsername() {
    method setUsername (line 23) | public void setUsername(String username) {
    method getPassword (line 27) | public String getPassword() {
    method setPassword (line 31) | public void setPassword(String password) {

FILE: docker/test-images/zipkin-eureka/src/main/java/zipkin/test/EurekaSecurity.java
  class EurekaSecurity (line 23) | @Configuration
    method authFilter (line 27) | @Bean FilterRegistrationBean<BasicAuthFilter> authFilter(EurekaPropert...
    class BasicAuthFilter (line 36) | static final class BasicAuthFilter extends OncePerRequestFilter {
      method BasicAuthFilter (line 39) | BasicAuthFilter(String username, String password) {
      method doFilterInternal (line 44) | @Override protected void doFilterInternal(HttpServletRequest req, Ht...

FILE: docker/test-images/zipkin-eureka/src/main/java/zipkin/test/EurekaServer.java
  class EurekaServer (line 18) | @SpringBootApplication(
    method main (line 25) | public static void main(String[] args) {

FILE: zipkin-collector/activemq/src/main/java/zipkin2/collector/activemq/ActiveMQCollector.java
  class ActiveMQCollector (line 19) | public final class ActiveMQCollector extends CollectorComponent {
    method builder (line 20) | public static Builder builder() {
    class Builder (line 25) | public static final class Builder extends CollectorComponent.Builder {
      method storage (line 32) | @Override public Builder storage(StorageComponent storage) {
      method sampler (line 37) | @Override public Builder sampler(CollectorSampler sampler) {
      method metrics (line 42) | @Override public Builder metrics(CollectorMetrics metrics) {
      method connectionFactory (line 49) | public Builder connectionFactory(ActiveMQConnectionFactory connectio...
      method queue (line 56) | public Builder queue(String queue) {
      method concurrency (line 63) | public Builder concurrency(int concurrency) {
      method build (line 69) | @Override public ActiveMQCollector build() {
    method ActiveMQCollector (line 78) | ActiveMQCollector(Builder builder) {
    method start (line 83) | @Override public ActiveMQCollector start() {
    method check (line 88) | @Override public CheckResult check() {
    method close (line 95) | @Override public void close() throws IOException {
    method toString (line 99) | @Override public final String toString() {
    method uncheckedException (line 106) | static RuntimeException uncheckedException(String prefix, JMSException...
    method message (line 114) | static String message(Exception cause) {

FILE: zipkin-collector/activemq/src/main/java/zipkin2/collector/activemq/ActiveMQSpanConsumer.java
  class ActiveMQSpanConsumer (line 33) | final class ActiveMQSpanConsumer implements TransportListener, MessageLi...
    method onSuccess (line 35) | @Override public void onSuccess(Void value) {
    method onError (line 38) | @Override public void onError(Throwable t) {
    method ActiveMQSpanConsumer (line 54) | ActiveMQSpanConsumer(Collector collector, CollectorMetrics metrics, Ac...
    method registerInNewSession (line 62) | void registerInNewSession(ActiveMQConnection connection, String queue)...
    method onCommand (line 72) | @Override public void onCommand(Object o) {
    method onException (line 75) | @Override public void onException(IOException error) {
    method transportInterupted (line 79) | @Override public void transportInterupted() {
    method transportResumed (line 83) | @Override public void transportResumed() {
    method onMessage (line 87) | @Override public void onMessage(Message message) {
    method close (line 111) | @Override public void close() {

FILE: zipkin-collector/activemq/src/main/java/zipkin2/collector/activemq/LazyInit.java
  class LazyInit (line 19) | final class LazyInit {
    method LazyInit (line 28) | LazyInit(ActiveMQCollector.Builder builder) {
    method init (line 36) | ActiveMQSpanConsumer init() {
    method close (line 47) | void close() {
    method doInit (line 52) | ActiveMQSpanConsumer doInit() {

FILE: zipkin-collector/activemq/src/test/java/zipkin2/collector/activemq/ActiveMQExtension.java
  class ActiveMQExtension (line 19) | class ActiveMQExtension implements BeforeAllCallback, AfterAllCallback {
    method beforeAll (line 25) | @Override public void beforeAll(ExtensionContext context) {
    method afterAll (line 35) | @Override public void afterAll(ExtensionContext context) {
    method newCollectorBuilder (line 44) | ActiveMQCollector.Builder newCollectorBuilder(String queue) {
    method brokerURL (line 50) | String brokerURL() {
    class ActiveMQContainer (line 55) | static final class ActiveMQContainer extends GenericContainer<ActiveMQ...
      method ActiveMQContainer (line 56) | ActiveMQContainer() {

FILE: zipkin-collector/activemq/src/test/java/zipkin2/collector/activemq/ITActiveMQCollector.java
  class ITActiveMQCollector (line 50) | @TestInstance(TestInstance.Lifecycle.PER_CLASS)
    method start (line 67) | @BeforeEach void start(TestInfo testInfo) {
    method stop (line 83) | @AfterEach void stop() throws IOException {
    method checkPasses (line 87) | @Test void checkPasses() {
    method startFailsWithInvalidActiveMqServer (line 91) | @Test void startFailsWithInvalidActiveMqServer() {
    method toStringContainsOnlySummaryInformation (line 110) | @Test void toStringContainsOnlySummaryInformation() {
    method messageWithMultipleSpans_json (line 116) | @Test void messageWithMultipleSpans_json() throws Exception {
    method messageWithMultipleSpans_json2 (line 121) | @Test void messageWithMultipleSpans_json2() throws Exception {
    method messageWithMultipleSpans_proto3 (line 126) | @Test void messageWithMultipleSpans_proto3() throws Exception {
    method messageWithMultipleSpans (line 130) | void messageWithMultipleSpans(SpanBytesEncoder encoder) throws Excepti...
    method skipsMalformedData (line 144) | @Test void skipsMalformedData() throws Exception {
    method skipsOnSpanStorageException (line 164) | @Test void skipsOnSpanStorageException() throws Exception {
    method messagesDistributedAcrossMultipleThreadsSuccessfully (line 204) | @Test void messagesDistributedAcrossMultipleThreadsSuccessfully() thro...
    method builder (line 235) | ActiveMQCollector.Builder builder() {
    method buildStorage (line 243) | static StorageComponent buildStorage(final SpanConsumer spanConsumer) {
    method pushMessage (line 255) | void pushMessage(String queueName, byte[] message) throws Exception {

FILE: zipkin-collector/core/src/main/java/zipkin2/collector/Collector.java
  class Collector (line 32) | public class Collector { // not final for mock
    method onSuccess (line 34) | @Override public void onSuccess(Void value) {
    method onError (line 37) | @Override public void onError(Throwable t) {
    method newBuilder (line 42) | public static Builder newBuilder(Class<?> loggingClass) {
    class Builder (line 47) | public static final class Builder {
      method Builder (line 53) | Builder(Logger logger) {
      method storage (line 58) | public Builder storage(StorageComponent storage) {
      method metrics (line 65) | public Builder metrics(CollectorMetrics metrics) {
      method sampler (line 72) | public Builder sampler(CollectorSampler sampler) {
      method build (line 78) | public Collector build() {
    method Collector (line 88) | Collector(Builder builder) {
    method accept (line 97) | public void accept(List<Span> spans, Callback<Void> callback) {
    method accept (line 107) | public void accept(List<Span> spans, Callback<Void> callback, Executor...
    method acceptSpans (line 134) | public void acceptSpans(ByteBuffer encoded, SpanBytesDecoder decoder, ...
    method acceptSpans (line 153) | public void acceptSpans(byte[] serialized, Callback<Void> callback) {
    method acceptSpans (line 171) | public void acceptSpans(
    method decodeList (line 183) | List<Span> decodeList(BytesDecoder<Span> decoder, byte[] serialized) {
    method store (line 189) | void store(List<Span> sampledSpans, Callback<Void> callback) {
    method idString (line 193) | String idString(Span span) {
    method sample (line 197) | List<Span> sample(List<Span> input) {
    class StoreSpans (line 210) | class StoreSpans implements Callback<Void>, Runnable {
      method StoreSpans (line 213) | StoreSpans(List<Span> spans) {
      method run (line 217) | @Override public void run() {
      method onSuccess (line 228) | @Override public void onSuccess(Void value) {
      method onError (line 231) | @Override public void onError(Throwable t) {
      method toString (line 235) | @Override public String toString() {
    method handleDecodeError (line 240) | void handleDecodeError(Throwable e, Callback<Void> callback) {
    method handleStorageError (line 249) | void handleStorageError(List<Span> spans, Throwable e, Callback<Void> ...
    method handleError (line 256) | void handleError(Throwable e, Supplier<String> defaultLogMessage, Call...
    method appendSpanIds (line 274) | String appendSpanIds(List<Span> spans, StringBuilder message) {

FILE: zipkin-collector/core/src/main/java/zipkin2/collector/CollectorComponent.java
  class CollectorComponent (line 18) | public abstract class CollectorComponent extends Component {
    method start (line 25) | public abstract CollectorComponent start();
    class Builder (line 27) | public abstract static class Builder {
      method storage (line 32) | public abstract Builder storage(StorageComponent storage);
      method metrics (line 38) | public abstract Builder metrics(CollectorMetrics metrics);
      method sampler (line 44) | public abstract Builder sampler(CollectorSampler sampler);
      method build (line 46) | public abstract CollectorComponent build();

FILE: zipkin-collector/core/src/main/java/zipkin2/collector/CollectorMetrics.java
  type CollectorMetrics (line 47) | public interface CollectorMetrics {
    method forTransport (line 59) | CollectorMetrics forTransport(String transportType);
    method incrementMessages (line 65) | void incrementMessages();
    method incrementMessagesDropped (line 70) | void incrementMessagesDropped();
    method incrementSpans (line 76) | void incrementSpans(int quantity);
    method incrementBytes (line 84) | void incrementBytes(int quantity);
    method incrementSpansDropped (line 90) | void incrementSpansDropped(int quantity);
    method forTransport (line 95) | @Override
    method incrementMessages (line 100) | @Override
    method incrementMessagesDropped (line 103) | @Override
    method incrementSpans (line 106) | @Override
    method incrementBytes (line 109) | @Override
    method incrementSpansDropped (line 112) | @Override
    method toString (line 115) | @Override

FILE: zipkin-collector/core/src/main/java/zipkin2/collector/CollectorSampler.java
  class CollectorSampler (line 24) | public abstract class CollectorSampler {
    method create (line 32) | public static CollectorSampler create(float rate) {
    method boundary (line 44) | protected abstract long boundary();
    method isSampled (line 58) | public boolean isSampled(String hexTraceId, boolean debug) {
    method toString (line 67) | @Override
    method CollectorSampler (line 72) | protected CollectorSampler() {}

FILE: zipkin-collector/core/src/main/java/zipkin2/collector/InMemoryCollectorMetrics.java
  class InMemoryCollectorMetrics (line 10) | public final class InMemoryCollectorMetrics implements CollectorMetrics {
    method InMemoryCollectorMetrics (line 19) | public InMemoryCollectorMetrics() {
    method InMemoryCollectorMetrics (line 23) | InMemoryCollectorMetrics(ConcurrentHashMap<String, AtomicInteger> metr...
    method forTransport (line 32) | @Override
    method incrementMessages (line 38) | @Override
    method messages (line 43) | public int messages() {
    method incrementMessagesDropped (line 47) | @Override
    method messagesDropped (line 52) | public int messagesDropped() {
    method incrementBytes (line 56) | @Override
    method bytes (line 61) | public int bytes() {
    method incrementSpans (line 65) | @Override
    method spans (line 70) | public int spans() {
    method incrementSpansDropped (line 74) | @Override
    method spansDropped (line 79) | public int spansDropped() {
    method clear (line 83) | public void clear() {
    method get (line 87) | private int get(String key) {
    method increment (line 92) | private void increment(String key, int quantity) {
    method scope (line 109) | static String scope(String key, String transport) {

FILE: zipkin-collector/core/src/test/java/zipkin2/collector/CollectorSamplerTest.java
  class CollectorSamplerTest (line 16) | class CollectorSamplerTest {
    method mostNegativeNumberDefence (line 22) | @Test void mostNegativeNumberDefence() {
    method debugWins (line 29) | @Test void debugWins() {
    method retain10Percent (line 35) | @Test void retain10Percent() {
    method idempotent (line 46) | @Test void idempotent() {
    method zeroMeansDropAllTraces (line 55) | @Test void zeroMeansDropAllTraces() {
    method oneMeansKeepAllTraces (line 61) | @Test void oneMeansKeepAllTraces() {
    method rateCantBeNegative (line 68) | @Test void rateCantBeNegative() {
    method rateCantBeOverOne (line 73) | @Test void rateCantBeOverOne() {
    method lotsOfSpans (line 78) | static Stream<Span> lotsOfSpans() {

FILE: zipkin-collector/core/src/test/java/zipkin2/collector/CollectorTest.java
  class CollectorTest (line 36) | @ExtendWith(TestLoggerFactoryExtension.class)
    method setup (line 44) | @BeforeEach void setup() {
    method after (line 50) | @AfterEach void after() {
    method unsampledSpansArentStored (line 54) | @Test void unsampledSpansArentStored() {
    method errorDetectingFormat (line 70) | @Test void errorDetectingFormat() {
    method acceptSpans_jsonV2 (line 77) | @Test void acceptSpans_jsonV2() {
    method acceptSpans_decodingError (line 89) | @Test void acceptSpans_decodingError() {
    method acceptSpans_decodingError_nonStringValue (line 99) | @Test void acceptSpans_decodingError_nonStringValue() {
    method accept_storageError (line 117) | @Test void accept_storageError() {
    method acceptSpans_emptyMessageOk (line 134) | @Test void acceptSpans_emptyMessageOk() {
    method storeSpansCallback_toStringIncludesSpanIds (line 145) | @Test void storeSpansCallback_toStringIncludesSpanIds() {
    method storeSpansCallback_toStringIncludesSpanIds_noMoreThan3 (line 153) | @Test void storeSpansCallback_toStringIncludesSpanIds_noMoreThan3() {
    method storeSpansCallback_onErrorWithNullMessage (line 158) | @Test void storeSpansCallback_onErrorWithNullMessage() {
    method storeSpansCallback_onErrorWithMessage (line 168) | @Test void storeSpansCallback_onErrorWithMessage() {
    method errorAcceptingSpans_onErrorRejectedExecution (line 177) | @Test void errorAcceptingSpans_onErrorRejectedExecution() {
    method handleStorageError_onErrorWithNullMessage (line 187) | @Test void handleStorageError_onErrorWithNullMessage() {
    method handleStorageError_onErrorWithMessage (line 196) | @Test void handleStorageError_onErrorWithMessage() {
    method handleDecodeError_onErrorWithNullMessage (line 205) | @Test void handleDecodeError_onErrorWithNullMessage() {
    method handleDecodeError_onErrorWithMessage (line 214) | @Test void handleDecodeError_onErrorWithMessage() {
    method handleDecodeError_doesntWrapMessageOnMalformedException (line 223) | @Test void handleDecodeError_doesntWrapMessageOnMalformedException() {
    method handleDecodeError_doesntWrapMessageOnTruncatedException (line 232) | @Test void handleDecodeError_doesntWrapMessageOnTruncatedException() {
    method unprefixIdString (line 241) | private String unprefixIdString(String msg) {
    method assertDebugLogIs (line 245) | private void assertDebugLogIs(String message) {

FILE: zipkin-collector/kafka/src/main/java/zipkin2/collector/kafka/KafkaCollector.java
  class KafkaCollector (line 45) | public final class KafkaCollector extends CollectorComponent {
    method builder (line 48) | public static Builder builder() {
    class Builder (line 53) | public static final class Builder extends CollectorComponent.Builder {
      method storage (line 60) | @Override
      method sampler (line 66) | @Override
      method metrics (line 72) | @Override
      method topic (line 84) | public Builder topic(String topic) {
      method bootstrapServers (line 91) | public Builder bootstrapServers(String bootstrapServers) {
      method groupId (line 98) | public Builder groupId(String groupId) {
      method streams (line 105) | public Builder streams(int streams) {
      method overrides (line 125) | public final Builder overrides(Map<String, ?> overrides) {
      method build (line 131) | @Override
      method Builder (line 136) | Builder() {
    method KafkaCollector (line 150) | KafkaCollector(Builder builder) {
    method start (line 155) | @Override
    method check (line 161) | @Override
    method getAdminClient (line 175) | AdminClient getAdminClient() {
    method close (line 186) | @Override
    method toString (line 192) | @Override public final String toString() {
    class LazyKafkaWorkers (line 199) | static final class LazyKafkaWorkers {
      method LazyKafkaWorkers (line 206) | LazyKafkaWorkers(Builder builder) {
      method start (line 211) | void start() {
      method close (line 221) | void close() {
      method compute (line 238) | ExecutorService compute() {
      method guardFailures (line 253) | Runnable guardFailures(final Runnable delegate) {

FILE: zipkin-collector/kafka/src/main/java/zipkin2/collector/kafka/KafkaCollectorWorker.java
  class KafkaCollectorWorker (line 29) | final class KafkaCollectorWorker implements Runnable {
    method onSuccess (line 33) | @Override
    method onError (line 36) | @Override
    method KafkaCollectorWorker (line 49) | KafkaCollectorWorker(KafkaCollector.Builder builder) {
    method run (line 56) | @Override
    method stop (line 116) | public void stop() {
    method protobuf3 (line 121) | static boolean protobuf3(byte[] bytes) {

FILE: zipkin-collector/kafka/src/test/java/zipkin2/collector/kafka/ITKafkaCollector.java
  class ITKafkaCollector (line 43) | @TestInstance(TestInstance.Lifecycle.PER_CLASS)
    method setup (line 63) | @BeforeEach void setup() {
    method tearDown (line 71) | @AfterEach void tearDown() {
    method checkPasses (line 75) | @Test void checkPasses() {
    method check_failsOnInvalidBootstrapServers (line 85) | @Test void check_failsOnInvalidBootstrapServers() throws Exception {
    method reconnectsIndefinitelyAndReportsUnhealthyWhenKafkaUnavailable (line 111) | @Test void reconnectsIndefinitelyAndReportsUnhealthyWhenKafkaUnavailab...
    method messageWithSingleThriftSpan (line 123) | @Test void messageWithSingleThriftSpan() throws Exception {
    method messageWithMultipleSpans_thrift (line 142) | @Test void messageWithMultipleSpans_thrift() throws Exception {
    method messageWithMultipleSpans_json (line 147) | @Test void messageWithMultipleSpans_json() throws Exception {
    method messageWithMultipleSpans_json2 (line 152) | @Test void messageWithMultipleSpans_json2() throws Exception {
    method messageWithMultipleSpans_proto3 (line 157) | @Test void messageWithMultipleSpans_proto3() throws Exception {
    method messageWithMultipleSpans (line 161) | void messageWithMultipleSpans(KafkaCollector.Builder builder, SpanByte...
    method skipsMalformedData (line 180) | @Test void skipsMalformedData() throws Exception {
    method skipsOnSpanStorageException (line 207) | @Test void skipsOnSpanStorageException() throws Exception {
    method messagesDistributedAcrossMultipleThreadsSuccessfully (line 248) | @Test void messagesDistributedAcrossMultipleThreadsSuccessfully() thro...
    method multipleTopicsCommaDelimited (line 273) | @Test void multipleTopicsCommaDelimited() {
    method toStringContainsOnlySummaryInformation (line 287) | @Test void toStringContainsOnlySummaryInformation() {
    method warmUpTopic (line 308) | void warmUpTopic(String topic) {
    method waitForPartitionAssignments (line 315) | void waitForPartitionAssignments(KafkaCollector collector) throws Exce...
    method produceSpans (line 329) | void produceSpans(byte[] spans, String topic) {
    method produceSpans (line 333) | void produceSpans(byte[] spans, String topic, Integer partition) {
    method builder (line 338) | KafkaCollector.Builder builder(String topic) {
    method builder (line 342) | KafkaCollector.Builder builder(String topic, int streams) {
    method buildStorage (line 348) | static StorageComponent buildStorage(final SpanConsumer spanConsumer) {

FILE: zipkin-collector/kafka/src/test/java/zipkin2/collector/kafka/KafkaExtension.java
  class KafkaExtension (line 28) | class KafkaExtension implements BeforeAllCallback, AfterAllCallback {
    method beforeAll (line 34) | @Override public void beforeAll(ExtensionContext context) {
    method prepareTopics (line 44) | void prepareTopics(String topics, int partitions) {
    method bootstrapServer (line 63) | String bootstrapServer() {
    method newCollectorBuilder (line 67) | KafkaCollector.Builder newCollectorBuilder(String topic, int streams) {
    method afterAll (line 75) | @Override public void afterAll(ExtensionContext context) {
    class KafkaContainer (line 84) | static final class KafkaContainer extends GenericContainer<KafkaContai...
      method KafkaContainer (line 85) | KafkaContainer() {

FILE: zipkin-collector/pulsar/src/main/java/zipkin2/collector/pulsar/LazyPulsarInit.java
  class LazyPulsarInit (line 16) | class LazyPulsarInit {
    method LazyPulsarInit (line 26) | LazyPulsarInit(PulsarCollector.Builder builder) {
    method init (line 35) | void init() {
    method subscribe (line 45) | private PulsarClient subscribe() {
    method close (line 73) | void close() throws PulsarClientException {

FILE: zipkin-collector/pulsar/src/main/java/zipkin2/collector/pulsar/PulsarCollector.java
  class PulsarCollector (line 22) | public final class PulsarCollector extends CollectorComponent {
    method builder (line 24) | public static Builder builder() {
    class Builder (line 29) | public static final class Builder extends CollectorComponent.Builder {
      method storage (line 37) | @Override
      method metrics (line 43) | @Override
      method sampler (line 51) | @Override
      method build (line 57) | @Override
      method concurrency (line 63) | public Builder concurrency(Integer concurrency) {
      method topic (line 70) | public Builder topic(String topic) {
      method serviceUrl (line 77) | public Builder serviceUrl(String serviceUrl) {
      method subscriptionName (line 84) | public Builder subscriptionName(String subscriptionName) {
      method clientProps (line 97) | public Builder clientProps(Map<String, Object> clientPropsMap) {
      method consumerProps (line 110) | public Builder consumerProps(Map<String, Object> consumerPropsMap) {
    method PulsarCollector (line 121) | PulsarCollector(Builder builder) {
    method start (line 128) | @Override
    method close (line 134) | @Override public void close() throws IOException {
    method check (line 138) | @Override public CheckResult check() {
    method toString (line 149) | @Override public String toString() {

FILE: zipkin-collector/pulsar/src/main/java/zipkin2/collector/pulsar/PulsarSpanConsumer.java
  class PulsarSpanConsumer (line 23) | public class PulsarSpanConsumer implements Closeable {
    method onSuccess (line 25) | @Override public void onSuccess(Void value) {
    method onError (line 28) | @Override public void onError(Throwable t) {
    method PulsarSpanConsumer (line 40) | public PulsarSpanConsumer(String topic, Map<String, Object> consumerPr...
    method startConsumer (line 48) | public void startConsumer() throws PulsarClientException {
    method close (line 58) | @Override public void close() {
    method received (line 75) | @Override public void received(Consumer<T> consumer, Message<T> msg) {

FILE: zipkin-collector/pulsar/src/test/java/zipkin2/collector/pulsar/ITPulsarCollector.java
  class ITPulsarCollector (line 45) | @TestInstance(TestInstance.Lifecycle.PER_CLASS)
    method start (line 63) | @BeforeEach void start(TestInfo testInfo) throws PulsarClientException {
    method builder (line 81) | PulsarCollector.Builder builder() {
    method tearDown (line 89) | @AfterEach void tearDown() throws PulsarClientException {
    method checkPasses (line 93) | @Test void checkPasses() {
    method startFailsWithInvalidServiceUrl (line 97) | @Test void startFailsWithInvalidServiceUrl() {
    method toStringContainsOnlySummaryInformation (line 111) | @Test void toStringContainsOnlySummaryInformation() throws IOException {
    method messageWithMultipleSpans_json (line 123) | @Test void messageWithMultipleSpans_json() throws Exception {
    method messageWithMultipleSpans_json2 (line 128) | @Test void messageWithMultipleSpans_json2() throws Exception {
    method messageWithMultipleSpans_proto3 (line 133) | @Test void messageWithMultipleSpans_proto3() throws Exception {
    method messageWithMultipleSpans_thrift (line 138) | @Test void messageWithMultipleSpans_thrift() throws Exception {
    method skipsMalformedData (line 143) | @Test void skipsMalformedData() throws Exception {
    method skipsOnSpanStorageException (line 163) | @Test void skipsOnSpanStorageException() throws Exception {
    method messagesDistributedAcrossMultipleThreadsSuccessfully (line 203) | @Test void messagesDistributedAcrossMultipleThreadsSuccessfully() thro...
    method messageWithMultipleSpans (line 235) | private void messageWithMultipleSpans(SpanBytesEncoder encoder) throws...
    method pushMessage (line 247) | private void pushMessage(String topic, byte[] message) {
    method buildStorage (line 256) | static StorageComponent buildStorage(final SpanConsumer spanConsumer) {

FILE: zipkin-collector/pulsar/src/test/java/zipkin2/collector/pulsar/PulsarExtension.java
  class PulsarExtension (line 20) | public class PulsarExtension implements BeforeAllCallback, AfterAllCallb...
    method beforeAll (line 28) | @Override public void beforeAll(ExtensionContext context) throws Excep...
    method serviceUrl (line 38) | String serviceUrl() {
    method afterAll (line 42) | @Override public void afterAll(ExtensionContext context) throws Except...
    method newCollectorBuilder (line 51) | PulsarCollector.Builder newCollectorBuilder(String topic) {
    class PulsarContainer (line 58) | static final class PulsarContainer extends GenericContainer<PulsarCont...
      method PulsarContainer (line 59) | PulsarContainer() {

FILE: zipkin-collector/rabbitmq/src/main/java/zipkin2/collector/rabbitmq/RabbitMQCollector.java
  class RabbitMQCollector (line 30) | public final class RabbitMQCollector extends CollectorComponent {
    method onSuccess (line 32) | @Override public void onSuccess(Void value) {
    method onError (line 35) | @Override public void onError(Throwable t) {
    method builder (line 39) | public static Builder builder() {
    class Builder (line 44) | public static final class Builder extends CollectorComponent.Builder {
      method storage (line 52) | @Override
      method sampler (line 58) | @Override
      method metrics (line 64) | @Override
      method addresses (line 72) | public Builder addresses(List<String> addresses) {
      method concurrency (line 77) | public Builder concurrency(int concurrency) {
      method connectionFactory (line 82) | public Builder connectionFactory(ConnectionFactory connectionFactory) {
      method queue (line 89) | public Builder queue(String queue) {
      method build (line 95) | @Override
    method RabbitMQCollector (line 104) | RabbitMQCollector(Builder builder) {
    method start (line 109) | @Override
    method check (line 115) | @Override
    method close (line 128) | @Override
    method toString (line 133) | @Override public final String toString() {
    class LazyInit (line 142) | static final class LazyInit {
      method LazyInit (line 149) | LazyInit(Builder builder) {
      method get (line 153) | Connection get() {
      method close (line 164) | void close() throws IOException {
      method compute (line 169) | Connection compute() {
      method declareQueueIfMissing (line 202) | private void declareQueueIfMissing(Connection connection) throws IOE...
    class RabbitMQSpanConsumer (line 225) | static class RabbitMQSpanConsumer extends DefaultConsumer {
      method RabbitMQSpanConsumer (line 229) | RabbitMQSpanConsumer(Channel channel, Collector collector, Collector...
      method handleDelivery (line 235) | @Override
    method convertAddresses (line 246) | static Address[] convertAddresses(List<String> addresses) {

FILE: zipkin-collector/rabbitmq/src/test/java/zipkin2/collector/rabbitmq/ITRabbitMQCollector.java
  class ITRabbitMQCollector (line 36) | @TestInstance(TestInstance.Lifecycle.PER_CLASS)
    method setup (line 56) | @BeforeEach void setup() throws Exception {
    method tearDown (line 64) | @AfterEach void tearDown() throws Exception {
    method checkPasses (line 68) | @Test void checkPasses() throws Exception {
    method messageWithMultipleSpans_thrift (line 75) | @Test void messageWithMultipleSpans_thrift() throws Exception {
    method messageWithMultipleSpans_json (line 80) | @Test void messageWithMultipleSpans_json() throws Exception {
    method messageWithMultipleSpans_json2 (line 85) | @Test void messageWithMultipleSpans_json2() throws Exception {
    method messageWithMultipleSpans_proto3 (line 90) | @Test void messageWithMultipleSpans_proto3() throws Exception {
    method messageWithMultipleSpans (line 94) | void messageWithMultipleSpans(RabbitMQCollector.Builder builder, SpanB...
    method skipsMalformedData (line 113) | @Test void skipsMalformedData() throws Exception {
    method startsWhenConfiguredQueueDoesntExist (line 139) | @Test void startsWhenConfiguredQueueDoesntExist() throws Exception {
    method skipsOnSpanStorageException (line 146) | @Test void skipsOnSpanStorageException() throws Exception {
    method toStringContainsOnlySummaryInformation (line 194) | @Test void toStringContainsOnlySummaryInformation() throws Exception {
    method produceSpans (line 205) | void produceSpans(byte[] spans, String queue) throws Exception {
    method builder (line 215) | RabbitMQCollector.Builder builder(String queue) {
    method buildStorage (line 221) | static StorageComponent buildStorage(final SpanConsumer spanConsumer) {

FILE: zipkin-collector/rabbitmq/src/test/java/zipkin2/collector/rabbitmq/RabbitMQCollectorTest.java
  class RabbitMQCollectorTest (line 18) | class RabbitMQCollectorTest {
    method before (line 22) | @BeforeEach void before() {
    method checkFalseWhenRabbitMQIsDown (line 30) | @Test void checkFalseWhenRabbitMQIsDown() {
    method startFailsWhenRabbitMQIsDown (line 36) | @Test void startFailsWhenRabbitMQIsDown() {
    method toStringContainsOnlySummaryInformation (line 49) | @Test void toStringContainsOnlySummaryInformation() {

FILE: zipkin-collector/rabbitmq/src/test/java/zipkin2/collector/rabbitmq/RabbitMQExtension.java
  class RabbitMQExtension (line 22) | class RabbitMQExtension implements BeforeAllCallback, AfterAllCallback {
    method beforeAll (line 28) | @Override public void beforeAll(ExtensionContext context) {
    method afterAll (line 38) | @Override public void afterAll(ExtensionContext context) {
    method newCollectorBuilder (line 47) | RabbitMQCollector.Builder newCollectorBuilder(String queue) {
    method declareQueue (line 52) | void declareQueue(String queue) {
    method host (line 66) | String host() {
    method port (line 70) | int port() {
    class RabbitMQContainer (line 75) | static final class RabbitMQContainer extends GenericContainer<RabbitMQ...
      method RabbitMQContainer (line 76) | RabbitMQContainer() {

FILE: zipkin-collector/scribe/src/main/java/zipkin2/collector/scribe/NettyScribeServer.java
  class NettyScribeServer (line 19) | final class NettyScribeServer {
    method NettyScribeServer (line 26) | NettyScribeServer(int port, ScribeSpanConsumer scribe) {
    method start (line 31) | void start() {
    method close (line 55) | @SuppressWarnings("FutureReturnValueIgnored")
    method isRunning (line 64) | boolean isRunning() {
    method port (line 68) | int port() {

FILE: zipkin-collector/scribe/src/main/java/zipkin2/collector/scribe/ScribeCollector.java
  class ScribeCollector (line 20) | public final class ScribeCollector extends CollectorComponent {
    method newBuilder (line 22) | public static Builder newBuilder() {
    class Builder (line 27) | public static final class Builder extends CollectorComponent.Builder {
      method storage (line 33) | @Override public Builder storage(StorageComponent storage) {
      method metrics (line 38) | @Override public Builder metrics(CollectorMetrics metrics) {
      method sampler (line 45) | @Override public Builder sampler(CollectorSampler sampler) {
      method category (line 51) | public Builder category(String category) {
      method port (line 58) | public Builder port(int port) {
      method build (line 63) | @Override public ScribeCollector build() {
    method ScribeCollector (line 70) | ScribeCollector(Builder builder) {
    method start (line 76) | @Override public ScribeCollector start() {
    method check (line 81) | @Override public CheckResult check() {
    method port (line 89) | public int port() {
    method toString (line 93) | @Override public final String toString() {
    method close (line 97) | @Override public void close() {

FILE: zipkin-collector/scribe/src/main/java/zipkin2/collector/scribe/ScribeInboundHandler.java
  class ScribeInboundHandler (line 32) | @SuppressWarnings("FutureReturnValueIgnored")
    method ScribeInboundHandler (line 49) | ScribeInboundHandler(ScribeSpanConsumer scribe) {
    method channelRead (line 57) | @Override public void channelRead(ChannelHandlerContext ctx, Object pa...
    method channelInactive (line 105) | @Override public void channelInactive(ChannelHandlerContext ctx) {
    method exceptionCaught (line 109) | @Override public void exceptionCaught(ChannelHandlerContext ctx, Throw...
    method flushResponses (line 116) | void flushResponses(ChannelHandlerContext ctx) {
    method release (line 128) | void release() {
    method closeOnFlush (line 136) | static void closeOnFlush(Channel ch) {

FILE: zipkin-collector/scribe/src/main/java/zipkin2/collector/scribe/ScribeSpanConsumer.java
  class ScribeSpanConsumer (line 22) | final class ScribeSpanConsumer implements Scribe.AsyncIface {
    method ScribeSpanConsumer (line 27) | ScribeSpanConsumer(Collector collector, CollectorMetrics metrics, Stri...
    method Log (line 33) | @Override

FILE: zipkin-collector/scribe/src/main/java/zipkin2/collector/scribe/generated/LogEntry.java
  class LogEntry (line 9) | @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
    type _Fields (line 24) | public enum _Fields implements org.apache.thrift.TFieldIdEnum {
      method findByThriftId (line 39) | @org.apache.thrift.annotation.Nullable
      method findByThriftIdOrThrow (line 55) | public static _Fields findByThriftIdOrThrow(int fieldId) {
      method findByName (line 64) | @org.apache.thrift.annotation.Nullable
      method _Fields (line 72) | _Fields(short thriftId, java.lang.String fieldName) {
      method getThriftFieldId (line 77) | public short getThriftFieldId() {
      method getFieldName (line 81) | public java.lang.String getFieldName() {
    method LogEntry (line 98) | public LogEntry() {
    method LogEntry (line 101) | public LogEntry(
    method LogEntry (line 113) | public LogEntry(LogEntry other) {
    method deepCopy (line 122) | public LogEntry deepCopy() {
    method clear (line 126) | @Override
    method getCategory (line 132) | @org.apache.thrift.annotation.Nullable
    method setCategory (line 137) | public LogEntry setCategory(@org.apache.thrift.annotation.Nullable jav...
    method unsetCategory (line 142) | public void unsetCategory() {
    method isSetCategory (line 147) | public boolean isSetCategory() {
    method setCategoryIsSet (line 151) | public void setCategoryIsSet(boolean value) {
    method getMessage (line 157) | @org.apache.thrift.annotation.Nullable
    method setMessage (line 162) | public LogEntry setMessage(@org.apache.thrift.annotation.Nullable java...
    method unsetMessage (line 167) | public void unsetMessage() {
    method isSetMessage (line 172) | public boolean isSetMessage() {
    method setMessageIsSet (line 176) | public void setMessageIsSet(boolean value) {
    method setFieldValue (line 182) | public void setFieldValue(_Fields field, @org.apache.thrift.annotation...
    method getFieldValue (line 203) | @org.apache.thrift.annotation.Nullable
    method isSet (line 217) | public boolean isSet(_Fields field) {
    method equals (line 231) | @Override
    method equals (line 240) | public boolean equals(LogEntry that) {
    method hashCode (line 267) | @Override
    method compareTo (line 282) | @Override
    method fieldForId (line 313) | @org.apache.thrift.annotation.Nullable
    method read (line 318) | public void read(org.apache.thrift.protocol.TProtocol iprot) throws or...
    method write (line 322) | public void write(org.apache.thrift.protocol.TProtocol oprot) throws o...
    method toString (line 326) | @Override
    method validate (line 350) | public void validate() throws org.apache.thrift.TException {
    method writeObject (line 355) | private void writeObject(java.io.ObjectOutputStream out) throws java.i...
    method readObject (line 363) | private void readObject(java.io.ObjectInputStream in) throws java.io.I...
    class LogEntryStandardSchemeFactory (line 371) | private static class LogEntryStandardSchemeFactory implements org.apac...
      method getScheme (line 372) | public LogEntryStandardScheme getScheme() {
    class LogEntryStandardScheme (line 377) | private static class LogEntryStandardScheme extends org.apache.thrift....
      method read (line 379) | public void read(org.apache.thrift.protocol.TProtocol iprot, LogEntr...
      method write (line 416) | public void write(org.apache.thrift.protocol.TProtocol oprot, LogEnt...
    class LogEntryTupleSchemeFactory (line 436) | private static class LogEntryTupleSchemeFactory implements org.apache....
      method getScheme (line 437) | public LogEntryTupleScheme getScheme() {
    class LogEntryTupleScheme (line 442) | private static class LogEntryTupleScheme extends org.apache.thrift.sch...
      method write (line 444) | @Override
      method read (line 463) | @Override
    method scheme (line 478) | private static <S extends org.apache.thrift.scheme.IScheme> S scheme(o...

FILE: zipkin-collector/scribe/src/main/java/zipkin2/collector/scribe/generated/ResultCode.java
  type ResultCode (line 10) | @javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0...
    method ResultCode (line 17) | private ResultCode(int value) {
    method getValue (line 24) | public int getValue() {
    method findByValue (line 32) | @org.apache.thrift.annotation.Nullable

FILE: zipkin-collector/scribe/src/main/java/zipkin2/collector/scribe/generated/Scribe.java
  class Scribe (line 9) | @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
    type Iface (line 13) | public interface Iface {
      method Log (line 15) | public ResultCode Log(java.util.List<LogEntry> messages) throws org....
    type AsyncIface (line 19) | public interface AsyncIface {
      method Log (line 21) | public void Log(java.util.List<LogEntry> messages, org.apache.thrift...
    class Client (line 25) | public static class Client extends org.apache.thrift.TServiceClient im...
      class Factory (line 26) | public static class Factory implements org.apache.thrift.TServiceCli...
        method Factory (line 27) | public Factory() {}
        method getClient (line 28) | public Client getClient(org.apache.thrift.protocol.TProtocol prot) {
        method getClient (line 31) | public Client getClient(org.apache.thrift.protocol.TProtocol iprot...
      method Client (line 36) | public Client(org.apache.thrift.protocol.TProtocol prot)
      method Client (line 41) | public Client(org.apache.thrift.protocol.TProtocol iprot, org.apache...
      method Log (line 45) | public ResultCode Log(java.util.List<LogEntry> messages) throws org....
      method send_Log (line 51) | public void send_Log(java.util.List<LogEntry> messages) throws org.a...
      method recv_Log (line 58) | public ResultCode recv_Log() throws org.apache.thrift.TException
    class AsyncClient (line 69) | public static class AsyncClient extends org.apache.thrift.async.TAsync...
      class Factory (line 70) | public static class Factory implements org.apache.thrift.async.TAsyn...
        method Factory (line 73) | public Factory(org.apache.thrift.async.TAsyncClientManager clientM...
        method getAsyncClient (line 77) | public AsyncClient getAsyncClient(org.apache.thrift.transport.TNon...
      method AsyncClient (line 82) | public AsyncClient(org.apache.thrift.protocol.TProtocolFactory proto...
      method Log (line 86) | public void Log(java.util.List<LogEntry> messages, org.apache.thrift...
      class Log_call (line 93) | public static class Log_call extends org.apache.thrift.async.TAsyncM...
        method Log_call (line 95) | public Log_call(java.util.List<LogEntry> messages, org.apache.thri...
        method write_args (line 100) | public void write_args(org.apache.thrift.protocol.TProtocol prot) ...
        method getResult (line 108) | public ResultCode getResult() throws org.apache.thrift.TException {
    class Processor (line 120) | public static class Processor<I extends Iface> extends org.apache.thri...
      method Processor (line 122) | public Processor(I iface) {
      method Processor (line 126) | protected Processor(I iface, java.util.Map<java.lang.String, org.apa...
      method getProcessMap (line 130) | private static <I extends Iface> java.util.Map<java.lang.String,  or...
      class Log (line 135) | public static class Log<I extends Iface> extends org.apache.thrift.P...
        method Log (line 136) | public Log() {
        method getEmptyArgsInstance (line 140) | public Log_args getEmptyArgsInstance() {
        method isOneway (line 144) | protected boolean isOneway() {
        method rethrowUnhandledExceptions (line 148) | @Override
        method getResult (line 153) | public Log_result getResult(I iface, Log_args args) throws org.apa...
    class AsyncProcessor (line 162) | public static class AsyncProcessor<I extends AsyncIface> extends org.a...
      method AsyncProcessor (line 164) | public AsyncProcessor(I iface) {
      method AsyncProcessor (line 168) | protected AsyncProcessor(I iface, java.util.Map<java.lang.String,  o...
      method getProcessMap (line 172) | private static <I extends AsyncIface> java.util.Map<java.lang.String...
      class Log (line 177) | public static class Log<I extends AsyncIface> extends org.apache.thr...
        method Log (line 178) | public Log() {
        method getEmptyArgsInstance (line 182) | public Log_args getEmptyArgsInstance() {
        method getResultHandler (line 186) | public org.apache.thrift.async.AsyncMethodCallback<ResultCode> get...
        method isOneway (line 229) | protected boolean isOneway() {
        method start (line 233) | public void start(I iface, Log_args args, org.apache.thrift.async....
    class Log_args (line 240) | public static class Log_args implements org.apache.thrift.TBase<Log_ar...
      type _Fields (line 251) | public enum _Fields implements org.apache.thrift.TFieldIdEnum {
        method findByThriftId (line 265) | @org.apache.thrift.annotation.Nullable
        method findByThriftIdOrThrow (line 279) | public static _Fields findByThriftIdOrThrow(int fieldId) {
        method findByName (line 288) | @org.apache.thrift.annotation.Nullable
        method _Fields (line 296) | _Fields(short thriftId, java.lang.String fieldName) {
        method getThriftFieldId (line 301) | public short getThriftFieldId() {
        method getFieldName (line 305) | public java.lang.String getFieldName() {
      method Log_args (line 321) | public Log_args() {
      method Log_args (line 324) | public Log_args(
      method Log_args (line 334) | public Log_args(Log_args other) {
      method deepCopy (line 344) | public Log_args deepCopy() {
      method clear (line 348) | @Override
      method getMessagesSize (line 353) | public int getMessagesSize() {
      method getMessagesIterator (line 357) | @org.apache.thrift.annotation.Nullable
      method addToMessages (line 362) | public void addToMessages(LogEntry elem) {
      method getMessages (line 369) | @org.apache.thrift.annotation.Nullable
      method setMessages (line 374) | public Log_args setMessages(@org.apache.thrift.annotation.Nullable j...
      method unsetMessages (line 379) | public void unsetMessages() {
      method isSetMessages (line 384) | public boolean isSetMessages() {
      method setMessagesIsSet (line 388) | public void setMessagesIsSet(boolean value) {
      method setFieldValue (line 394) | public void setFieldValue(_Fields field, @org.apache.thrift.annotati...
      method getFieldValue (line 407) | @org.apache.thrift.annotation.Nullable
      method isSet (line 418) | public boolean isSet(_Fields field) {
      method equals (line 430) | @Override
      method equals (line 439) | public boolean equals(Log_args that) {
      method hashCode (line 457) | @Override
      method compareTo (line 468) | @Override
      method fieldForId (line 489) | @org.apache.thrift.annotation.Nullable
      method read (line 494) | public void read(org.apache.thrift.protocol.TProtocol iprot) throws ...
      method write (line 498) | public void write(org.apache.thrift.protocol.TProtocol oprot) throws...
      method toString (line 502) | @Override
      method validate (line 518) | public void validate() throws org.apache.thrift.TException {
      method writeObject (line 523) | private void writeObject(java.io.ObjectOutputStream out) throws java...
      method readObject (line 531) | private void readObject(java.io.ObjectInputStream in) throws java.io...
      class Log_argsStandardSchemeFactory (line 539) | private static class Log_argsStandardSchemeFactory implements org.ap...
        method getScheme (line 540) | public Log_argsStandardScheme getScheme() {
      class Log_argsStandardScheme (line 545) | private static class Log_argsStandardScheme extends org.apache.thrif...
        method read (line 547) | public void read(org.apache.thrift.protocol.TProtocol iprot, Log_a...
        method write (line 587) | public void write(org.apache.thrift.protocol.TProtocol oprot, Log_...
      class Log_argsTupleSchemeFactory (line 609) | private static class Log_argsTupleSchemeFactory implements org.apach...
        method getScheme (line 610) | public Log_argsTupleScheme getScheme() {
      class Log_argsTupleScheme (line 615) | private static class Log_argsTupleScheme extends org.apache.thrift.s...
        method write (line 617) | @Override
        method read (line 636) | @Override
      method scheme (line 657) | private static <S extends org.apache.thrift.scheme.IScheme> S scheme...
    class Log_result (line 662) | public static class Log_result implements org.apache.thrift.TBase<Log_...
      type _Fields (line 677) | public enum _Fields implements org.apache.thrift.TFieldIdEnum {
        method findByThriftId (line 695) | @org.apache.thrift.annotation.Nullable
        method findByThriftIdOrThrow (line 709) | public static _Fields findByThriftIdOrThrow(int fieldId) {
        method findByName (line 718) | @org.apache.thrift.annotation.Nullable
        method _Fields (line 726) | _Fields(short thriftId, java.lang.String fieldName) {
        method getThriftFieldId (line 731) | public short getThriftFieldId() {
        method getFieldName (line 735) | public java.lang.String getFieldName() {
      method Log_result (line 750) | public Log_result() {
      method Log_result (line 753) | public Log_result(
      method Log_result (line 763) | public Log_result(Log_result other) {
      method deepCopy (line 769) | public Log_result deepCopy() {
      method clear (line 773) | @Override
      method getSuccess (line 782) | @org.apache.thrift.annotation.Nullable
      method setSuccess (line 791) | public Log_result setSuccess(@org.apache.thrift.annotation.Nullable ...
      method unsetSuccess (line 796) | public void unsetSuccess() {
      method isSetSuccess (line 801) | public boolean isSetSuccess() {
      method setSuccessIsSet (line 805) | public void setSuccessIsSet(boolean value) {
      method setFieldValue (line 811) | public void setFieldValue(_Fields field, @org.apache.thrift.annotati...
      method getFieldValue (line 824) | @org.apache.thrift.annotation.Nullable
      method isSet (line 835) | public boolean isSet(_Fields field) {
      method equals (line 847) | @Override
      method equals (line 856) | public boolean equals(Log_result that) {
      method hashCode (line 874) | @Override
      method compareTo (line 885) | @Override
      method fieldForId (line 906) | @org.apache.thrift.annotation.Nullable
      method read (line 911) | public void read(org.apache.thrift.protocol.TProtocol iprot) throws ...
      method write (line 915) | public void write(org.apache.thrift.protocol.TProtocol oprot) throws...
      method toString (line 919) | @Override
      method validate (line 935) | public void validate() throws org.apache.thrift.TException {
      method writeObject (line 940) | private void writeObject(java.io.ObjectOutputStream out) throws java...
      method readObject (line 948) | private void readObject(java.io.ObjectInputStream in) throws java.io...
      class Log_resultStandardSchemeFactory (line 956) | private static class Log_resultStandardSchemeFactory implements org....
        method getScheme (line 957) | public Log_resultStandardScheme getScheme() {
      class Log_resultStandardScheme (line 962) | private static class Log_resultStandardScheme extends org.apache.thr...
        method read (line 964) | public void read(org.apache.thrift.protocol.TProtocol iprot, Log_r...
        method write (line 993) | public void write(org.apache.thrift.protocol.TProtocol oprot, Log_...
      class Log_resultTupleSchemeFactory (line 1008) | private static class Log_resultTupleSchemeFactory implements org.apa...
        method getScheme (line 1009) | public Log_resultTupleScheme getScheme() {
      class Log_resultTupleScheme (line 1014) | private static class Log_resultTupleScheme extends org.apache.thrift...
        method write (line 1016) | @Override
        method read (line 1029) | @Override
      method scheme (line 1040) | private static <S extends org.apache.thrift.scheme.IScheme> S scheme...

FILE: zipkin-collector/scribe/src/test/java/zipkin2/collector/scribe/ITScribeCollector.java
  class ITScribeCollector (line 37) | class ITScribeCollector {
    method startServer (line 42) | @BeforeAll static void startServer() {
    method stopServer (line 56) | @AfterAll static void stopServer() {
    method normal (line 60) | @Test void normal() throws Exception {
    method logEntry (line 87) | static LogEntry logEntry(Span span) {

FILE: zipkin-collector/scribe/src/test/java/zipkin2/collector/scribe/ScribeCollectorTest.java
  class ScribeCollectorTest (line 15) | class ScribeCollectorTest {
    method check_failsWhenNotStarted (line 18) | @Test void check_failsWhenNotStarted() {
    method anonymousPort (line 30) | @Test void anonymousPort() {
    method start_failsWhenCantBindPort (line 40) | @Test void start_failsWhenCantBindPort() {
    method toStringContainsOnlySummaryInformation (line 58) | @Test void toStringContainsOnlySummaryInformation() {

FILE: zipkin-collector/scribe/src/test/java/zipkin2/collector/scribe/ScribeSpanConsumerTest.java
  class ScribeSpanConsumerTest (line 33) | class ScribeSpanConsumerTest {
    class CaptureAsyncMethodCallback (line 40) | static class CaptureAsyncMethodCallback implements AsyncMethodCallback...
      method onComplete (line 47) | @Override public void onComplete(ResultCode resultCode) {
      method onError (line 52) | @Override public void onError(Exception error) {
    method entriesWithSpansAreConsumed (line 92) | @Test void entriesWithSpansAreConsumed() throws Exception {
    method entriesWithoutSpansAreSkipped (line 111) | @Test void entriesWithoutSpansAreSkipped() throws Exception {
    method expectSuccess (line 132) | private void expectSuccess(ScribeSpanConsumer scribe, LogEntry entry) ...
    method malformedDataIsDropped (line 139) | @Test void malformedDataIsDropped() {
    method consumerExceptionBeforeCallbackDoesntSetFutureException (line 158) | @Test void consumerExceptionBeforeCallbackDoesntSetFutureException() {
    method callbackExceptionDoesntThrow (line 187) | @Test void callbackExceptionDoesntThrow() throws Exception {
    method decodesSpanGeneratedByFinagle (line 219) | @Test void decodesSpanGeneratedByFinagle() throws Exception {
    method newScribeSpanConsumer (line 242) | ScribeSpanConsumer newScribeSpanConsumer(String category, SpanConsumer...

FILE: zipkin-junit5/src/main/java/zipkin2/junit5/HttpFailure.java
  class HttpFailure (line 16) | public final class HttpFailure {
    method disconnectDuringBody (line 19) | public static HttpFailure disconnectDuringBody() {
    method sendErrorResponse (line 24) | public static HttpFailure sendErrorResponse(int code, String body) {
    method HttpFailure (line 31) | HttpFailure(MockResponse response) {

FILE: zipkin-junit5/src/main/java/zipkin2/junit5/ZipkinDispatcher.java
  class ZipkinDispatcher (line 21) | final class ZipkinDispatcher extends Dispatcher {
    method ZipkinDispatcher (line 26) | ZipkinDispatcher(StorageComponent storage, CollectorMetrics metrics, M...
    method dispatch (line 32) | @Override
    method acceptSpans (line 56) | MockResponse acceptSpans(RecordedRequest request, SpanBytesDecoder dec...

FILE: zipkin-junit5/src/main/java/zipkin2/junit5/ZipkinExtension.java
  class ZipkinExtension (line 36) | public final class ZipkinExtension implements BeforeEachCallback, AfterE...
    method ZipkinExtension (line 43) | public ZipkinExtension() {
    method httpUrl (line 66) | public String httpUrl() {
    method httpRequestCount (line 71) | public int httpRequestCount() {
    method collectorMetrics (line 76) | public InMemoryCollectorMetrics collectorMetrics() {
    method storeSpans (line 86) | public ZipkinExtension storeSpans(List<Span> spans) {
    method enqueueFailure (line 106) | public ZipkinExtension enqueueFailure(HttpFailure failure) {
    method getTraces (line 112) | public List<List<Span>> getTraces() {
    method getTrace (line 117) | @Nullable public List<Span> getTrace(String traceId) {
    method getDependencies (line 129) | public List<DependencyLink> getDependencies() {
    method start (line 138) | public void start(int httpPort) throws IOException {
    method shutdown (line 145) | public void shutdown() throws IOException {
    method beforeEach (line 149) | @Override public void beforeEach(ExtensionContext extensionContext) {
    method afterEach (line 152) | @Override public void afterEach(ExtensionContext extensionContext) {

FILE: zipkin-junit5/src/test/java/zipkin2/junit5/ZipkinExtensionTest.java
  class ZipkinExtensionTest (line 27) | public class ZipkinExtensionTest {
    method getTraces_storedViaPost (line 34) | @Test void getTraces_storedViaPost() throws IOException {
    method getTraces_storedViaPostVersion2_json (line 42) | @Test void getTraces_storedViaPostVersion2_json() throws IOException {
    method getTraces_storedViaPostVersion2_proto3 (line 46) | @Test void getTraces_storedViaPostVersion2_proto3() throws IOException {
    method getTraces_storedViaPostVersion2 (line 50) | void getTraces_storedViaPostVersion2(String mediaType, SpanBytesEncode...
    method getTraces_whenMissingTimestamps (line 68) | @Test void getTraces_whenMissingTimestamps() throws IOException {
    method storeSpans_readbackRaw (line 78) | @Test void storeSpans_readbackRaw() {
    method httpRequestCountIncrements (line 90) | @Test void httpRequestCountIncrements() throws IOException {
    method collectorMetrics_spans (line 102) | @Test void collectorMetrics_spans() throws IOException {
    method postSpans_disconnectDuringBody (line 108) | @Test void postSpans_disconnectDuringBody() throws IOException {
    method postSpans_sendErrorResponse400 (line 126) | @Test void postSpans_sendErrorResponse400() throws IOException {
    method gzippedSpans (line 141) | @Test void gzippedSpans() throws IOException {
    method postSpansV1 (line 164) | Response postSpansV1(List<Span> spans) throws IOException {
    method assertPostSpansV1Success (line 171) | void assertPostSpansV1Success(Span... spans) throws IOException {
    method assertPostSpansV1Success (line 175) | void assertPostSpansV1Success(List<Span> spans) throws IOException {

FILE: zipkin-lens/src/components/App/HeaderMenuItem.tsx
  type HeaderMenuItemProps (line 42) | interface HeaderMenuItemProps {

FILE: zipkin-lens/src/components/App/LanguageSelector.tsx
  constant LANGUAGES (line 16) | const LANGUAGES = [

FILE: zipkin-lens/src/components/App/slice.ts
  type Alert (line 8) | interface Alert {
  type AppState (line 13) | interface AppState {
  method clearAlert (line 32) | clearAlert(state): AppState {
  method setAlert (line 38) | setAlert(state, action: PayloadAction<Alert>): AppState {

FILE: zipkin-lens/src/components/DependenciesPage/DependenciesGraph.tsx
  type DependenciesGraphProps (line 87) | interface DependenciesGraphProps {

FILE: zipkin-lens/src/components/DependenciesPage/DependenciesPage.tsx
  type DependenciesPageProps (line 46) | type DependenciesPageProps = RouteComponentProps;

FILE: zipkin-lens/src/components/DependenciesPage/NodeDetailData.tsx
  type NodeDetailDataProps (line 55) | interface NodeDetailDataProps extends RouteComponentProps {

FILE: zipkin-lens/src/components/DependenciesPage/VizceralWrapper.tsx
  class VizceralExt (line 11) | class VizceralExt extends Vizceral {
    method componentWillUnmount (line 12) | componentWillUnmount() {

FILE: zipkin-lens/src/components/DependenciesPage/types.ts
  type Edge (line 5) | type Edge = {

FILE: zipkin-lens/src/components/DiscoverPage/Criterion.ts
  type Criterion (line 7) | type Criterion = {

FILE: zipkin-lens/src/components/DiscoverPage/DiscoverPage.tsx
  type DiscoverPageImplProps (line 17) | interface DiscoverPageImplProps {

FILE: zipkin-lens/src/components/DiscoverPage/DiscoverPageContent.tsx
  type DiscoverPageContentProps (line 41) | interface DiscoverPageContentProps {

FILE: zipkin-lens/src/components/DiscoverPage/LookbackMenu.tsx
  type LookbackMenuProps (line 50) | interface LookbackMenuProps {

FILE: zipkin-lens/src/components/DiscoverPage/SearchBar/CriterionBox.tsx
  type CriterionBoxProps (line 76) | interface CriterionBoxProps {

FILE: zipkin-lens/src/components/DiscoverPage/SearchBar/HowToUse.tsx
  type HowToUseProps (line 43) | interface HowToUseProps {

FILE: zipkin-lens/src/components/DiscoverPage/SearchBar/SearchBar.tsx
  type SearchBarProps (line 48) | type SearchBarProps = {

FILE: zipkin-lens/src/components/DiscoverPage/SearchBar/SuggestionList.tsx
  type SuggestionListProps (line 56) | interface SuggestionListProps {

FILE: zipkin-lens/src/components/DiscoverPage/SearchBar/constants.ts
  constant CRITERION_BOX_HEIGHT (line 5) | const CRITERION_BOX_HEIGHT = 34;

FILE: zipkin-lens/src/components/DiscoverPage/TraceSummaryRow.tsx
  type TraceSummaryRowProps (line 26) | interface TraceSummaryRowProps {
  function shouldShowIcon (line 33) | function shouldShowIcon(traceSummary: TraceSummary) {

FILE: zipkin-lens/src/components/DiscoverPage/TraceSummaryTable.tsx
  type TraceSummaryTableProps (line 18) | interface TraceSummaryTableProps {

FILE: zipkin-lens/src/components/DiscoverPage/lookback.ts
  type FixedLookbackValue (line 7) | type FixedLookbackValue =
  type FixedLookback (line 36) | interface FixedLookback {
  type RangeLookback (line 42) | interface RangeLookback {
  type MillisLookback (line 48) | interface MillisLookback {
  type Lookback (line 54) | type Lookback = FixedLookback | RangeLookback | MillisLookback;
  type FixedLookbackEntry (line 56) | interface FixedLookbackEntry {

FILE: zipkin-lens/src/components/TracePage/AnnotationTable/AnnotationTable.tsx
  type AnnotationTableProps (line 38) | type AnnotationTableProps = {

FILE: zipkin-lens/src/components/TracePage/AnnotationTooltip/AnnotationTooltip.tsx
  type AnnotationTooltipProps (line 21) | type AnnotationTooltipProps = {

FILE: zipkin-lens/src/components/TracePage/Header/Header.tsx
  type HeaderProps (line 60) | type HeaderProps = {

FILE: zipkin-lens/src/components/TracePage/Header/HeaderMenu.tsx
  type HeaderMenuProps (line 24) | type HeaderMenuProps = {

FILE: zipkin-lens/src/components/TracePage/MiniTimeline/MiniTimeline.tsx
  type MiniTimelineProps (line 50) | type MiniTimelineProps = {

FILE: zipkin-lens/src/components/TracePage/MiniTimeline/MiniTimelineOverlay.tsx
  type MiniTimelineOverlayProps (line 26) | type MiniTimelineOverlayProps = {

FILE: zipkin-lens/src/components/TracePage/MiniTimeline/MiniTimelineRow.tsx
  type MiniTimelineRowProps (line 10) | type MiniTimelineRowProps = {

FILE: zipkin-lens/src/components/TracePage/MiniTimeline/TimeRangeSelector.tsx
  type TimeRangeSelectorProps (line 115) | type TimeRangeSelectorProps = {

FILE: zipkin-lens/src/components/TracePage/SpanDetailDrawer/AnnotationViewer.tsx
  type AnnotationViewerProps (line 56) | type AnnotationViewerProps = {

FILE: zipkin-lens/src/components/TracePage/SpanDetailDrawer/SpanDetailDrawer.tsx
  type SpanDetailDrawerProps (line 31) | type SpanDetailDrawerProps = {

FILE: zipkin-lens/src/components/TracePage/SpanDetailDrawer/TagList.tsx
  type TagListProps (line 42) | type TagListProps = {

FILE: zipkin-lens/src/components/TracePage/SpanTable/SpanTable.tsx
  type SpanTableProps (line 20) | type SpanTableProps = {

FILE: zipkin-lens/src/components/TracePage/TickMarkers/TickMarkers.tsx
  type TickMarkersProps (line 33) | type TickMarkersProps = {

FILE: zipkin-lens/src/components/TracePage/Timeline/Timeline.tsx
  type TimelineProps (line 32) | type TimelineProps = {

FILE: zipkin-lens/src/components/TracePage/Timeline/TimelineHeader.tsx
  type TimelineHeaderProps (line 54) | type TimelineHeaderProps = {

FILE: zipkin-lens/src/components/TracePage/Timeline/TimelineRow.tsx
  type TimelineRowProps (line 34) | type TimelineRowProps = SpanRow & {

FILE: zipkin-lens/src/components/TracePage/Timeline/TimelineRowAnnotation.tsx
  type TimelineRowAnnotationProps (line 22) | type TimelineRowAnnotationProps = {

FILE: zipkin-lens/src/components/TracePage/Timeline/TimelineRowBar.tsx
  type TimelineRowBarProps (line 37) | type TimelineRowBarProps = {

FILE: zipkin-lens/src/components/TracePage/Timeline/TimelineRowEdges.tsx
  type TimelineRowEdgeProps (line 51) | type TimelineRowEdgeProps = {

FILE: zipkin-lens/src/components/TracePage/TracePageContent.tsx
  constant SPAN_DETAIL_DRAWER_WIDTH (line 19) | const SPAN_DETAIL_DRAWER_WIDTH = '480px';
  type TracePageContentProps (line 21) | type TracePageContentProps = {

FILE: zipkin-lens/src/components/TracePage/helpers.ts
  type SpanTreeNode (line 8) | type SpanTreeNode = AdjustedSpan & {
  function fn (line 29) | function fn(span: AdjustedSpan, depth: number): SpanTreeNode {
  function fn (line 55) | function fn(node: SpanTreeNode) {
  function findRerootedSpan (line 69) | function findRerootedSpan(node: SpanTreeNode) {
  function fn (line 115) | function fn(

FILE: zipkin-lens/src/components/TracePage/types.ts
  type TreeEdgeShapeType (line 34) | type TreeEdgeShapeType = 'B' | 'M' | 'E' | '-';
  type SpanRow (line 36) | type SpanRow = AdjustedSpan & {
  type ServiceTreeNode (line 43) | type ServiceTreeNode = {
  type ServiceTreeEdge (line 47) | type ServiceTreeEdge = {

FILE: zipkin-lens/src/components/common/ExplainBox.tsx
  type ExplainBoxProps (line 10) | interface ExplainBoxProps {

FILE: zipkin-lens/src/constants/api.ts
  constant BASE_PATH (line 13) | const BASE_PATH = extractBasePath();
  constant ZIPKIN_API (line 15) | const ZIPKIN_API = `${BASE_PATH}/api/v2`;
  constant UI_CONFIG (line 16) | const UI_CONFIG = `${BASE_PATH}/config.json`;
  constant SERVICES (line 17) | const SERVICES = `${ZIPKIN_API}/services`;
  constant REMOTE_SERVICES (line 18) | const REMOTE_SERVICES = `${ZIPKIN_API}/remoteServices`;
  constant SPANS (line 19) | const SPANS = `${ZIPKIN_API}/spans`;
  constant TRACES (line 20) | const TRACES = `${ZIPKIN_API}/traces`;
  constant TRACE (line 21) | const TRACE = `${ZIPKIN_API}/trace`;
  constant DEPENDENCIES (line 22) | const DEPENDENCIES = `${ZIPKIN_API}/dependencies`;
  constant AUTOCOMPLETE_KEYS (line 23) | const AUTOCOMPLETE_KEYS = `${ZIPKIN_API}/autocompleteKeys`;
  constant AUTOCOMPLETE_VALUES (line 24) | const AUTOCOMPLETE_VALUES = `${ZIPKIN_API}/autocompleteValues`;

FILE: zipkin-lens/src/constants/color.ts
  constant THEME (line 13) | const THEME = [
  function getCurrentTheme (line 126) | function getCurrentTheme() {
  function getCurrentThemeServicePalette (line 136) | function getCurrentThemeServicePalette() {

FILE: zipkin-lens/src/models/AdjustedTrace.ts
  type AdjustedAnnotation (line 7) | type AdjustedAnnotation = {
  type AdjustedSpan (line 14) | type AdjustedSpan = {
  type AdjustedTrace (line 35) | type AdjustedTrace = {

FILE: zipkin-lens/src/models/Annotation.ts
  type Annotation (line 8) | type Annotation = {

FILE: zipkin-lens/src/models/Dependencies.ts
  type Dependencies (line 5) | type Dependencies = {

FILE: zipkin-lens/src/models/Endpoint.ts
  type Endpoint (line 8) | type Endpoint = {

FILE: zipkin-lens/src/models/Span.ts
  type Span (line 11) | type Span = {

FILE: zipkin-lens/src/models/TraceSummary.ts
  type ServiceNameAndSpanCount (line 5) | type ServiceNameAndSpanCount = {
  type TraceSummary (line 10) | type TraceSummary = {

FILE: zipkin-lens/src/slices/autocompleteKeysSlice.ts
  type AutocompleteKeysState (line 27) | interface AutocompleteKeysState {

FILE: zipkin-lens/src/slices/autocompleteValuesSlice.ts
  type AutocompleteValuesState (line 29) | interface AutocompleteValuesState {

FILE: zipkin-lens/src/slices/dependenciesSlice.ts
  type DependenciesState (line 34) | interface DependenciesState {

FILE: zipkin-lens/src/slices/remoteServicesSlice.ts
  type RemoteServicesState (line 29) | interface RemoteServicesState {

FILE: zipkin-lens/src/slices/servicesSlice.ts
  type ServicesState (line 24) | interface ServicesState {

FILE: zipkin-lens/src/slices/spansSlice.ts
  type SpansState (line 29) | interface SpansState {

FILE: zipkin-lens/src/slices/tracesSlice.ts
  type TracesState (line 160) | interface TracesState {

FILE: zipkin-lens/src/store/configure-store.js
  function configureStore (line 10) | function configureStore(config) {

FILE: zipkin-lens/src/store/index.ts
  type RootState (line 7) | type RootState = ReturnType<ReturnType<typeof createReducer>>;

FILE: zipkin-lens/src/test/util/render-with-default-settings.tsx
  type RenderProps (line 20) | interface RenderProps {

FILE: zipkin-lens/src/translations/i18n.ts
  constant FALLBACK_LOCALE (line 9) | const FALLBACK_LOCALE = 'en';

FILE: zipkin-lens/src/types/redux-thunk.d.ts
  type Dispatch (line 13) | interface Dispatch<A extends Action = AnyAction> {

FILE: zipkin-lens/src/types/styled-components.d.ts
  type DefaultTheme (line 10) | interface DefaultTheme extends Theme {}

FILE: zipkin-lens/src/util/fetch-resource.js
  method read (line 28) | read() {

FILE: zipkin-lens/src/util/theme.ts
  function getTheme (line 8) | function getTheme(): string {
  function setTheme (line 16) | function setTheme(theme: string) {

FILE: zipkin-lens/src/zipkin/clock-skew.js
  class ClockSkew (line 7) | class ClockSkew {
    method constructor (line 8) | constructor(params) {
    method endpoint (line 14) | get endpoint() {
    method skew (line 18) | get skew() {
  function ipsMatch (line 23) | function ipsMatch(a, b) {
  function adjustTimestamps (line 34) | function adjustTimestamps(span, skew) {
  function getClockSkew (line 52) | function getClockSkew(node) {
  function adjust (line 112) | function adjust(node, skewFromParent) {
  function treeCorrectedForClockSkew (line 131) | function treeCorrectedForClockSkew(spans, debug = false) {

FILE: zipkin-lens/src/zipkin/clock-skew.test.js
  function expectChildrenHappenAfterParent (line 287) | function expectChildrenHappenAfterParent(root) {
  function expectChildrenToBeInOrder (line 300) | function expectChildrenToBeInOrder(root) {

FILE: zipkin-lens/src/zipkin/dependency-linker.js
  function keyString (line 8) | function keyString(parent, child) {
  function link (line 12) | function link(callCounts, errorCounts) {
  class DependencyLinker (line 38) | class DependencyLinker {
    method constructor (line 39) | constructor(params) {
    method _firstRemoteAncestor (line 46) | _firstRemoteAncestor(node) {
    method _addLink (line 60) | _addLink(parent, child, isError) {
    method putTrace (line 73) | putTrace(traceTree) {
    method link (line 180) | link() {

FILE: zipkin-lens/src/zipkin/dependency-linker.test.js
  function putTrace (line 54) | function putTrace(spans) {
  function withLateParent (line 91) | function withLateParent() {

FILE: zipkin-lens/src/zipkin/span-cleaner.js
  function normalizeTraceId (line 9) | function normalizeTraceId(traceId) {
  function isEndpoint (line 19) | function isEndpoint(endpoint) {
  function clean (line 24) | function clean(span) {
  function merge (line 67) | function merge(left, right) {
  function compare (line 111) | function compare(a, b) {
  function isUndefined (line 118) | function isUndefined(ref) {
  function compareEndpoint (line 127) | function compareEndpoint(left, right) {
  function compareShared (line 140) | function compareShared(left, right) {
  function cleanupComparator (line 152) | function cleanupComparator(left, right) {
  function tryMerge (line 161) | function tryMerge(current, endpoint) {
  function spanComparator (line 189) | function spanComparator(a, b) {
  function mergeV2ById (line 211) | function mergeV2ById(spans) {

FILE: zipkin-lens/src/zipkin/span-node.js
  class SpanNode (line 13) | class SpanNode {
    method constructor (line 14) | constructor(span) {
    method parent (line 21) | get parent() {
    method _setParent (line 25) | _setParent(newParent) {
    method span (line 30) | get span() {
    method children (line 35) | get children() {
    method setSpan (line 40) | setSpan(span) {
    method addChild (line 46) | addChild(child) {
    method queueRootMostSpans (line 55) | queueRootMostSpans() {
    method traverse (line 69) | traverse(spanCallback) {
    method toString (line 84) | toString() {
  function keyString (line 91) | function keyString(id, shared = false, endpoint) {
  function nodeByTimestamp (line 97) | function nodeByTimestamp(a, b) {
  function sortChildren (line 101) | function sortChildren(node) {
  function sortTreeByTimestamp (line 107) | function sortTreeByTimestamp(root) {
  class SpanNodeBuilder (line 123) | class SpanNodeBuilder {
    method constructor (line 124) | constructor(params) {
    method _index (line 145) | _index(span) {
    method _process (line 172) | _process(span) {
    method build (line 227) | build(spans) {

FILE: zipkin-lens/src/zipkin/span-row.js
  function getErrorType (line 10) | function getErrorType(span, currentErrorType) {
  function formatEndpoint (line 22) | function formatEndpoint(endpoint) {
  function toAnnotationRow (line 38) | function toAnnotationRow(a, localFormatted, isDerived = false) {
  function parseAnnotationRows (line 48) | function parseAnnotationRows(span) {
  function parseTagRows (line 203) | function parseTagRows(span) {
  function maybePushAnnotation (line 259) | function maybePushAnnotation(annotations, a) {
  function maybePushTag (line 270) | function maybePushTag(tags, a) {
  function maybePushServiceName (line 293) | function maybePushServiceName(serviceNames, serviceName) {
  function getServiceName (line 300) | function getServiceName(endpoint) {
  function isNullOrUndefined (line 304) | function isNullOrUndefined(ref) {
  function newSpanRow (line 309) | function newSpanRow(spansToMerge, isLeafSpan) {

FILE: zipkin-lens/src/zipkin/trace-constants.js
  constant CLIENT_SEND (line 5) | const CLIENT_SEND = 'cs';
  constant CLIENT_SEND_FRAGMENT (line 6) | const CLIENT_SEND_FRAGMENT = 'csf';
  constant CLIENT_RECEIVE (line 7) | const CLIENT_RECEIVE = 'cr';
  constant CLIENT_RECEIVE_FRAGMENT (line 8) | const CLIENT_RECEIVE_FRAGMENT = 'crf';
  constant MESSAGE_SEND (line 9) | const MESSAGE_SEND = 'ms';
  constant MESSAGE_RECEIVE (line 10) | const MESSAGE_RECEIVE = 'mr';
  constant SERVER_SEND (line 11) | const SERVER_SEND = 'ss';
  constant SERVER_SEND_FRAGMENT (line 12) | const SERVER_SEND_FRAGMENT = 'ssf';
  constant SERVER_RECEIVE (line 13) | const SERVER_RECEIVE = 'sr';
  constant SERVER_RECEIVE_FRAGMENT (line 14) | const SERVER_RECEIVE_FRAGMENT = 'srf';
  constant SERVER_ADDR (line 15) | const SERVER_ADDR = 'sa';
  constant CLIENT_ADDR (line 16) | const CLIENT_ADDR = 'ca';
  constant MESSAGE_ADDR (line 17) | const MESSAGE_ADDR = 'ma';
  constant WIRE_SEND (line 18) | const WIRE_SEND = 'ws';
  constant WIRE_RECEIVE (line 19) | const WIRE_RECEIVE = 'wr';
  constant LOCAL_COMPONENT (line 20) | const LOCAL_COMPONENT = 'lc';

FILE: zipkin-lens/src/zipkin/trace.js
  function addTimestamps (line 12) | function addTimestamps(span, timestamps) {
  function getMaxDuration (line 19) | function getMaxDuration(timestamps) {
  function pushEntry (line 27) | function pushEntry(dict, key, value) {
  function addServiceNameTimestampDuration (line 35) | function addServiceNameTimestampDuration(span, groupedTimestamps) {
  function nodeByTimestamp (line 52) | function nodeByTimestamp(a, b) {
  function traceSummary (line 57) | function traceSummary(root) {
  function formatDate (line 99) | function formatDate(timestamp, utc) {
  function mkDurationStr (line 107) | function mkDurationStr(duration) {
  function getServiceSummaries (line 128) | function getServiceSummaries(groupedTimestamps) {
  function traceSummaries (line 146) | function traceSummaries(serviceName, summaries, utc = false) {
  function incrementEntry (line 192) | function incrementEntry(dict, key) {
  function getTraceTimestampAndDuration (line 202) | function getTraceTimestampAndDuration(root) {
  function addLayoutDetails (line 211) | function addLayoutDetails(
  function detailedTraceSummary (line 255) | function detailedTraceSummary(root) {

FILE: zipkin-lens/vite.config.ts
  method assetFileNames (line 46) | assetFileNames({name}):string {

FILE: zipkin-server/src/main/java/zipkin/server/ZipkinServer.java
  class ZipkinServer (line 30) | @SpringBootConfiguration
    method main (line 39) | public static void main(String[] args) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/BodyIsExceptionMessage.java
  class BodyIsExceptionMessage (line 20) | final class BodyIsExceptionMessage implements ExceptionHandlerFunction {
    method handleException (line 22) | @Override

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ConditionalOnSelfTracing.java
  class SelfTracingCondition (line 33) | class SelfTracingCondition extends SpringBootCondition {
    method checkForBrave (line 36) | static boolean checkForBrave() {
    method getMatchOutcome (line 45) | @Override

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ConditionalOnThrottledStorage.java
  class ThrottledStorageCondition (line 21) | class ThrottledStorageCondition extends SpringBootCondition {
    method getMatchOutcome (line 22) | @Override

FILE: zipkin-server/src/main/java/zipkin2/server/internal/InternalZipkinConfiguration.java
  class InternalZipkinConfiguration (line 24) | @Import({

FILE: zipkin-server/src/main/java/zipkin2/server/internal/JsonUtil.java
  class JsonUtil (line 17) | public final class JsonUtil {
    method createGenerator (line 27) | public static JsonGenerator createGenerator(Writer writer) throws IOEx...

FILE: zipkin-server/src/main/java/zipkin2/server/internal/MicrometerCollectorMetrics.java
  class MicrometerCollectorMetrics (line 35) | public final class MicrometerCollectorMetrics implements CollectorMetrics {
    method MicrometerCollectorMetrics (line 40) | public MicrometerCollectorMetrics(MeterRegistry registry) {
    method MicrometerCollectorMetrics (line 44) | MicrometerCollectorMetrics(@Nullable String transport, MeterRegistry m...
    method forTransport (line 92) | @Override
    method incrementMessages (line 98) | @Override
    method incrementMessagesDropped (line 104) | @Override
    method incrementSpans (line 110) | @Override
    method incrementBytes (line 117) | @Override
    method incrementSpansDropped (line 124) | @Override
    method checkScoped (line 130) | void checkScoped() {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/WrappingExecutorService.java
  class WrappingExecutorService (line 19) | public abstract class WrappingExecutorService implements ExecutorService {
    method WrappingExecutorService (line 20) | protected WrappingExecutorService() {
    method delegate (line 23) | protected abstract ExecutorService delegate();
    method wrap (line 25) | protected abstract <C> Callable<C> wrap(Callable<C> task);
    method wrap (line 27) | protected abstract Runnable wrap(Runnable task);
    method awaitTermination (line 29) | @Override public boolean awaitTermination(long timeout, TimeUnit unit)...
    method invokeAll (line 33) | @Override  public <T> List<Future<T>> invokeAll(Collection<? extends C...
    method invokeAll (line 38) | @Override public <T> List<Future<T>> invokeAll(Collection<? extends Ca...
    method invokeAny (line 43) | @Override public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
    method invokeAny (line 48) | @Override  public <T> T invokeAny(Collection<? extends Callable<T>> ta...
    method isShutdown (line 53) | @Override public boolean isShutdown() {
    method isTerminated (line 57) | @Override public boolean isTerminated() {
    method shutdown (line 61) | @Override public void shutdown() {
    method shutdownNow (line 65) | @Override public List<Runnable> shutdownNow() {
    method execute (line 69) | @Override public void execute(Runnable task) {
    method submit (line 73) | @Override public <T> Future<T> submit(Callable<T> task) {
    method submit (line 77) | @Override public Future<?> submit(Runnable task) {
    method submit (line 81) | @Override public <T> Future<T> submit(Runnable task, T result) {
    method wrap (line 85) | <T> Collection<? extends Callable<T>> wrap(Collection<? extends Callab...

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ZipkinActuatorImporter.java
  class ZipkinActuatorImporter (line 30) | public final class ZipkinActuatorImporter
    method ZipkinActuatorImporter (line 41) | public ZipkinActuatorImporter() {
    method ZipkinActuatorImporter (line 45) | ZipkinActuatorImporter(String actuatorImplClass) { // visible for testing
    method initialize (line 49) | @Override public void initialize(GenericApplicationContext context) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ZipkinConfiguration.java
  class ZipkinConfiguration (line 32) | @Import({
    method traceIdSampler (line 39) | @Bean CollectorSampler traceIdSampler(@Value("${zipkin.collector.sampl...
    method metrics (line 43) | @Bean CollectorMetrics metrics(MeterRegistry registry) {
    class ThrottledStorageComponentEnhancer (line 47) | @EnableConfigurationProperties(ZipkinStorageThrottleProperties.class)
      method postProcessAfterInitialization (line 60) | @Override public Object postProcessAfterInitialization(Object bean, ...
      method setBeanFactory (line 74) | @Override public void setBeanFactory(BeanFactory beanFactory) throws...
    class TracingStorageComponentEnhancer (line 79) | @ConditionalOnSelfTracing
      method postProcessBeforeInitialization (line 89) | @Override public Object postProcessBeforeInitialization(Object bean,...
      method postProcessAfterInitialization (line 93) | @Override public Object postProcessAfterInitialization(Object bean, ...
      method setBeanFactory (line 101) | @Override public void setBeanFactory(BeanFactory beanFactory) throws...
    class InMemoryConfiguration (line 110) | @Conditional(StorageTypeMemAbsentOrEmpty.class)
      method storage (line 113) | @Bean
    class StorageTypeMemAbsentOrEmpty (line 128) | static final class StorageTypeMemAbsentOrEmpty implements Condition {
      method matches (line 129) | @Override

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ZipkinGrpcCollector.java
  class ZipkinGrpcCollector (line 24) | @ConditionalOnProperty(name = "zipkin.collector.grpc.enabled", matchIfMi...
    method grpcCollectorConfigurator (line 27) | @Bean ArmeriaServerConfigurator grpcCollectorConfigurator(StorageCompo...
    class SpanService (line 40) | static final class SpanService extends AbstractUnsafeUnaryGrpcService {
      method SpanService (line 45) | SpanService(Collector collector, CollectorMetrics metrics) {
      method handleMessage (line 50) | @Override
    class CompletableFutureCallback (line 69) | static final class CompletableFutureCallback extends CompletableFuture...
      method onSuccess (line 72) | @Override public void onSuccess(Void value) {
      method onError (line 76) | @Override public void onError(Throwable t) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ZipkinHttpCollector.java
  class ZipkinHttpCollector (line 42) | @ConditionalOnProperty(name = "zipkin.collector.http.enabled", matchIfMi...
    method ZipkinHttpCollector (line 49) | @SuppressWarnings("StaticAssignmentInConstructor")
    method uploadSpans (line 58) | @Post("/api/v2/spans")
    method uploadSpansJson (line 63) | @Post("/api/v2/spans")
    method uploadSpansProtobuf (line 69) | @Post("/api/v2/spans")
    method uploadSpansV1 (line 75) | @Post("/api/v1/spans")
    method uploadSpansV1Json (line 80) | @Post("/api/v1/spans")
    method uploadSpansV1Thrift (line 86) | @Post("/api/v1/spans")
    method validateAndStoreSpans (line 93) | @SuppressWarnings("FutureReturnValueIgnored")
    method maybeLog (line 158) | static void maybeLog(String prefix, ServiceRequestContext ctx, Aggrega...
    method testForUnexpectedFormat (line 169) | static SpanBytesDecoder testForUnexpectedFormat(BytesDecoder<Span> dec...
    method contains (line 188) | static boolean contains(ByteBuffer bytes, byte[] subsequence) {
  class CompletableCallback (line 212) | final class CompletableCallback extends CompletableFuture<HttpResponse>
    method onSuccess (line 217) | @Override public void onSuccess(Void value) {
    method onError (line 221) | @Override public void onError(Throwable t) {
  class UnzippingBytesRequestConverter (line 226) | final class UnzippingBytesRequestConverter {
    method convertRequest (line 228) | static HttpData convertRequest(ServiceRequestContext ctx, AggregatedHt...

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ZipkinHttpConfiguration.java
  class ZipkinHttpConfiguration (line 32) | @Configuration(proxyBeanMethods = false)
    method serverConfigurator (line 37) | @Bean ArmeriaServerConfigurator serverConfigurator(
    method corsConfigurator (line 81) | @Order @Bean ArmeriaServerConfigurator corsConfigurator(
    method infoService (line 98) | HttpService infoService(HttpData info, MediaType mediaType) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ZipkinModuleImporter.java
  class ZipkinModuleImporter (line 37) | public final class ZipkinModuleImporter implements ApplicationContextIni...
    method initialize (line 42) | @Override public void initialize(GenericApplicationContext context) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ZipkinQueryApiV2.java
  class ZipkinQueryApiV2 (line 46) | @ConditionalOnProperty(name = "zipkin.query.enabled", matchIfMissing = t...
    method ZipkinQueryApiV2 (line 61) | ZipkinQueryApiV2(
    method getDependencies (line 75) | @Get("/api/v2/dependencies")
    method getServiceNames (line 85) | @Get("/api/v2/services")
    method getSpanNames (line 93) | @Get("/api/v2/spans")
    method getRemoteServiceNames (line 102) | @Get("/api/v2/remoteServices")
    method getTraces (line 112) | @Get("/api/v2/traces")
    method getTrace (line 142) | @Get("/api/v2/trace/{traceId}")
    method getTraces (line 154) | @Get("/api/v2/traceMany")
    method jsonResponse (line 176) | static AggregatedHttpResponse jsonResponse(byte[] body) {
    method getAutocompleteKeys (line 182) | @Get("/api/v2/autocompleteKeys")
    method getAutocompleteValues (line 188) | @Get("/api/v2/autocompleteValues")
    method maybeCacheNames (line 201) | AggregatedHttpResponse maybeCacheNames(
    method writeTraces (line 232) | static byte[] writeTraces(SpanBytesEncoder codec, List<List<zipkin2.Sp...

FILE: zipkin-server/src/main/java/zipkin2/server/internal/activemq/ZipkinActiveMQCollectorConfiguration.java
  class ZipkinActiveMQCollectorConfiguration (line 20) | @ConditionalOnClass(ActiveMQCollector.class)
    method activeMq (line 25) | @Bean(initMethod = "start")
    class ActiveMQUrlSet (line 45) | static final class ActiveMQUrlSet implements Condition {
      method matches (line 46) | @Override public boolean matches(ConditionContext context, Annotated...
      method isEmpty (line 52) | private static boolean isEmpty(String s) {
      method notFalse (line 56) | private static boolean notFalse(String s){

FILE: zipkin-server/src/main/java/zipkin2/server/internal/activemq/ZipkinActiveMQCollectorProperties.java
  class ZipkinActiveMQCollectorProperties (line 12) | @ConfigurationProperties("zipkin.collector.activemq")
    method getUrl (line 35) | public String getUrl() {
    method setUrl (line 39) | public void setUrl(String url) {
    method getQueue (line 43) | public String getQueue() {
    method setQueue (line 47) | public void setQueue(String queue) {
    method getClientIdPrefix (line 51) | public String getClientIdPrefix() {
    method setClientIdPrefix (line 55) | public void setClientIdPrefix(String clientIdPrefix) {
    method getConnectionIdPrefix (line 59) | public String getConnectionIdPrefix() {
    method setConnectionIdPrefix (line 63) | public void setConnectionIdPrefix(String connectionIdPrefix) {
    method getConcurrency (line 67) | public Integer getConcurrency() {
    method setConcurrency (line 71) | public void setConcurrency(Integer concurrency) {
    method getUsername (line 75) | public String getUsername() {
    method setUsername (line 79) | public void setUsername(String username) {
    method getPassword (line 83) | public String getPassword() {
    method setPassword (line 87) | public void setPassword(String password) {
    method toBuilder (line 91) | public ActiveMQCollector.Builder toBuilder() {
    method emptyToNull (line 108) | private static String emptyToNull(String s) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/banner/ZipkinBanner.java
  class ZipkinBanner (line 23) | public class ZipkinBanner implements Banner {
    method toString (line 25) | @Override public String toString() {
    method printBanner (line 30) | @Override

FILE: zipkin-server/src/main/java/zipkin2/server/internal/brave/SelfTracingProperties.java
  class SelfTracingProperties (line 12) | @ConfigurationProperties("zipkin.self-tracing")
    method isEnabled (line 33) | public boolean isEnabled() {
    method setEnabled (line 37) | public void setEnabled(boolean enabled) {
    method getSampleRate (line 41) | public float getSampleRate() {
    method setSampleRate (line 45) | public void setSampleRate(float sampleRate) {
    method getTracesPerSecond (line 49) | public int getTracesPerSecond() {
    method setTracesPerSecond (line 53) | public void setTracesPerSecond(int tracesPerSecond) {
    method getMessageTimeout (line 57) | public Duration getMessageTimeout() {
    method setMessageTimeout (line 61) | public void setMessageTimeout(Duration messageTimeout) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/brave/TracedCall.java
  class TracedCall (line 14) | public final class TracedCall<V> extends Call<V> {
    method TracedCall (line 19) | public TracedCall(Tracer tracer, Call<V> delegate, String name) {
    method execute (line 25) | @Override public V execute() throws IOException {
    method enqueue (line 37) | @Override public void enqueue(Callback<V> callback) {
    method cancel (line 52) | @Override public void cancel() {
    method isCanceled (line 56) | @Override public boolean isCanceled() {
    method clone (line 60) | @Override public Call<V> clone() {
    method toString (line 64) | @Override public String toString() {
    class SpanFinishingCallback (line 68) | static final class SpanFinishingCallback<V> implements Callback<V> {
      method SpanFinishingCallback (line 72) | SpanFinishingCallback(Callback<V> delegate, Span span) {
      method onSuccess (line 77) | @Override public void onSuccess(V value) {
      method onError (line 82) | @Override public void onError(Throwable t) {
      method toString (line 87) | @Override public String toString() {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/brave/TracingStorageComponent.java
  class TracingStorageComponent (line 25) | public final class TracingStorageComponent extends ForwardingStorageComp...
    method TracingStorageComponent (line 29) | public TracingStorageComponent(Tracing tracing, StorageComponent deleg...
    method delegate (line 34) | @Override protected StorageComponent delegate() {
    method serviceAndSpanNames (line 38) | @Override public ServiceAndSpanNames serviceAndSpanNames() {
    method traces (line 42) | @Override public Traces traces() {
    method spanStore (line 46) | @Override public SpanStore spanStore() {
    method autocompleteTags (line 50) | @Override public AutocompleteTags autocompleteTags() {
    method spanConsumer (line 54) | @Override public SpanConsumer spanConsumer() {
    method check (line 58) | @Override public CheckResult check() {
    method close (line 62) | @Override public void close() throws IOException {
    method toString (line 66) | @Override public String toString() {
    class TracingTraces (line 70) | static final class TracingTraces implements Traces {
      method TracingTraces (line 74) | TracingTraces(Tracing tracing, Traces delegate) {
      method getTrace (line 79) | @Override public Call<List<Span>> getTrace(String traceId) {
      method getTraces (line 83) | @Override public Call<List<List<Span>>> getTraces(Iterable<String> t...
      method toString (line 87) | @Override public String toString() {
    class TracingSpanStore (line 92) | static final class TracingSpanStore implements SpanStore {
      method TracingSpanStore (line 96) | TracingSpanStore(Tracing tracing, SpanStore delegate) {
      method getTraces (line 101) | @Override public Call<List<List<Span>>> getTraces(QueryRequest reque...
      method getTrace (line 105) | @Override @Deprecated public Call<List<Span>> getTrace(String traceI...
      method getServiceNames (line 109) | @Override @Deprecated public Call<List<String>> getServiceNames() {
      method getSpanNames (line 113) | @Override @Deprecated public Call<List<String>> getSpanNames(String ...
      method getDependencies (line 117) | @Override public Call<List<DependencyLink>> getDependencies(long end...
      method toString (line 122) | @Override public String toString() {
    class TracingAutocompleteTags (line 127) | static final class TracingAutocompleteTags implements AutocompleteTags {
      method TracingAutocompleteTags (line 131) | TracingAutocompleteTags(Tracing tracing, AutocompleteTags delegate) {
      method getKeys (line 136) | @Override public Call<List<String>> getKeys() {
      method getValues (line 140) | @Override public Call<List<String>> getValues(String key) {
      method toString (line 144) | @Override public String toString() {
    class TracingServiceAndSpanNames (line 149) | static final class TracingServiceAndSpanNames implements ServiceAndSpa...
      method TracingServiceAndSpanNames (line 153) | TracingServiceAndSpanNames(Tracing tracing, ServiceAndSpanNames dele...
      method getServiceNames (line 158) | @Override public Call<List<String>> getServiceNames() {
      method getRemoteServiceNames (line 162) | @Override public Call<List<String>> getRemoteServiceNames(String ser...
      method getSpanNames (line 167) | @Override public Call<List<String>> getSpanNames(String serviceName) {
      method toString (line 171) | @Override public String toString() {
    class TracingSpanConsumer (line 176) | static final class TracingSpanConsumer implements SpanConsumer {
      method TracingSpanConsumer (line 180) | TracingSpanConsumer(Tracing tracing, SpanConsumer delegate) {
      method accept (line 185) | @Override public Call<Void> accept(List<Span> spans) {
      method toString (line 189) | @Override public String toString() {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/brave/ZipkinSelfTracingConfiguration.java
  class ZipkinSelfTracingConfiguration (line 36) | @EnableConfigurationProperties(SelfTracingProperties.class)
    method reporter (line 40) | @Bean AsyncZipkinSpanHandler reporter(BeanFactory factory, SelfTracing...
    method currentTraceContext (line 57) | @Bean CurrentTraceContext currentTraceContext() {
    method threadLocalSpan (line 67) | @Bean ThreadLocalSpan threadLocalSpan(Tracing tracing) {
    method sampler (line 79) | @Bean Sampler sampler(SelfTracingProperties config) {
    method tracing (line 93) | @Bean Tracing tracing(AsyncZipkinSpanHandler zipkinSpanHandler,
    method httpTracing (line 107) | @Bean HttpTracing httpTracing(Tracing tracing, Sampler sampler) {
    method tracingConfigurator (line 121) | @Bean ArmeriaServerConfigurator tracingConfigurator(HttpTracing tracin...
    class LocalSender (line 126) | static final class LocalSender extends BytesMessageSender.Base {
      method LocalSender (line 130) | LocalSender(BeanFactory factory) {
      method messageMaxBytes (line 137) | @Override public int messageMaxBytes() {
      method send (line 141) | @Override public void send(List<byte[]> encodedSpans) throws IOExcep...
      method toString (line 151) | @Override public String toString() {
      method close (line 156) | @Override public void close() {
      method delegate (line 161) | StorageComponent delegate() {
    class ReporterMetricsAdapter (line 173) | static final class ReporterMetricsAdapter implements ReporterMetrics {
      method ReporterMetricsAdapter (line 177) | ReporterMetricsAdapter(BeanFactory factory) {
      method incrementMessages (line 181) | @Override public void incrementMessages() {
      method incrementMessagesDropped (line 185) | @Override public void incrementMessagesDropped(Throwable throwable) {
      method incrementSpans (line 189) | @Override public void incrementSpans(int i) {
      method incrementSpanBytes (line 193) | @Override public void incrementSpanBytes(int i) {
      method incrementMessageBytes (line 197) | @Override public void incrementMessageBytes(int i) {
      method incrementSpansDropped (line 200) | @Override public void incrementSpansDropped(int i) {
      method updateQueuedSpans (line 204) | @Override public void updateQueuedSpans(int i) {
      method updateQueuedBytes (line 207) | @Override public void updateQueuedBytes(int i) {
      method delegate (line 211) | CollectorMetrics delegate() {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/cassandra3/ZipkinCassandra3StorageConfiguration.java
  class ZipkinCassandra3StorageConfiguration (line 29) | @ConditionalOnClass(CassandraStorage.class)
    method sessionFactory (line 37) | @Bean SessionFactory sessionFactory() {
    method storage (line 40) | @Bean @ConditionalOnMissingBean StorageComponent storage(
    class TracingSessionFactoryEnhancer (line 57) | @ConditionalOnSelfTracing
      method postProcessBeforeInitialization (line 67) | @Override public Object postProcessBeforeInitialization(Object bean,...
      method postProcessAfterInitialization (line 71) | @Override public Object postProcessAfterInitialization(Object bean, ...
      method setBeanFactory (line 80) | @Override public void setBeanFactory(BeanFactory beanFactory) throws...

FILE: zipkin-server/src/main/java/zipkin2/server/internal/cassandra3/ZipkinCassandra3StorageProperties.java
  class ZipkinCassandra3StorageProperties (line 11) | @ConfigurationProperties("zipkin.storage.cassandra3")
    method getKeyspace (line 27) | public String getKeyspace() {
    method setKeyspace (line 31) | public void setKeyspace(String keyspace) {
    method getContactPoints (line 35) | public String getContactPoints() {
    method setContactPoints (line 39) | public void setContactPoints(String contactPoints) {
    method getLocalDc (line 43) | public String getLocalDc() {
    method setLocalDc (line 47) | public void setLocalDc(String localDc) {
    method getMaxConnections (line 51) | public int getMaxConnections() {
    method setMaxConnections (line 55) | public void setMaxConnections(int maxConnections) {
    method isEnsureSchema (line 59) | public boolean isEnsureSchema() {
    method setEnsureSchema (line 63) | public void setEnsureSchema(boolean ensureSchema) {
    method isUseSsl (line 67) | public boolean isUseSsl() {
    method setUseSsl (line 71) | public void setUseSsl(boolean useSsl) {
    method isSslHostnameValidation (line 75) | public boolean isSslHostnameValidation() {
    method setSslHostnameValidation (line 79) | public void setSslHostnameValidation(boolean sslHostnameValidation) {
    method getUsername (line 83) | public String getUsername() {
    method setUsername (line 87) | public void setUsername(String username) {
    method getPassword (line 91) | public String getPassword() {
    method setPassword (line 95) | public void setPassword(String password) {
    method getIndexFetchMultiplier (line 99) | public int getIndexFetchMultiplier() {
    method setIndexFetchMultiplier (line 103) | public void setIndexFetchMultiplier(int indexFetchMultiplier) {
    method toBuilder (line 107) | public CassandraStorage.Builder toBuilder() {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/elasticsearch/BasicAuthInterceptor.java
  class BasicAuthInterceptor (line 20) | final class BasicAuthInterceptor extends SimpleDecoratingHttpClient {
    method BasicAuthInterceptor (line 24) | BasicAuthInterceptor(HttpClient client, BasicCredentials basicCredenti...
    method execute (line 29) | @Override

FILE: zipkin-server/src/main/java/zipkin2/server/internal/elasticsearch/BasicCredentials.java
  class BasicCredentials (line 18) | final class BasicCredentials {
    method BasicCredentials (line 22) | BasicCredentials() {
    method BasicCredentials (line 26) | BasicCredentials(String username, String password) {
    method updateCredentials (line 30) | void updateCredentials(String username, String password) {
    method getCredentials (line 35) | @Nullable

FILE: zipkin-server/src/main/java/zipkin2/server/internal/elasticsearch/DynamicCredentialsFileLoader.java
  class DynamicCredentialsFileLoader (line 24) | class DynamicCredentialsFileLoader implements Runnable {
    method DynamicCredentialsFileLoader (line 31) | public DynamicCredentialsFileLoader(BasicCredentials basicCredentials,
    method run (line 37) | @Override public void run() {
    method updateCredentialsFromProperties (line 45) | void updateCredentialsFromProperties() throws IOException {
    method ensureNotEmptyOrNull (line 55) | @Nullable static String ensureNotEmptyOrNull(Properties properties, St...

FILE: zipkin-server/src/main/java/zipkin2/server/internal/elasticsearch/HttpClientFactory.java
  class HttpClientFactory (line 29) | public class HttpClientFactory implements Function<EndpointGroup, WebCli...
    method HttpClientFactory (line 36) | HttpClientFactory(ZipkinElasticsearchStorageProperties es, ClientFacto...
    method configureHttpLogging (line 53) | void configureHttpLogging(HttpLogging httpLogging, ClientOptionsBuilde...
    method apply (line 83) | @Override public WebClient apply(EndpointGroup endpoint) {
    method close (line 89) | @Override public void close() {
    method configureOptionsExceptHttpLogging (line 94) | ClientOptionsBuilder configureOptionsExceptHttpLogging(ClientOptionsBu...

FILE: zipkin-server/src/main/java/zipkin2/server/internal/elasticsearch/InitialEndpointSupplier.java
  class InitialEndpointSupplier (line 19) | final class InitialEndpointSupplier implements Supplier<EndpointGroup> {
    method InitialEndpointSupplier (line 25) | InitialEndpointSupplier(SessionProtocol sessionProtocol, @Nullable Str...
    method get (line 32) | @Override public EndpointGroup get() {
    method getPort (line 76) | int getPort(URI url) {
    method isIpAddress (line 81) | static boolean isIpAddress(String address) {
    method toString (line 85) | @Override public String toString() {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/elasticsearch/LazyHttpClientImpl.java
  class LazyHttpClientImpl (line 18) | final class LazyHttpClientImpl implements LazyHttpClient {
    method LazyHttpClientImpl (line 28) | LazyHttpClientImpl(HttpClientFactory factory, SessionProtocol protocol,
    method get (line 39) | @Override public WebClient get() {
    method getEndpoint (line 50) | EndpointGroup getEndpoint() {
    method decorateHealthCheck (line 60) | HealthCheckedEndpointGroup decorateHealthCheck(EndpointGroup endpointG...
    method toString (line 84) | @Override public final String toString() {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/elasticsearch/SslUtil.java
  class SslUtil (line 15) | final class SslUtil {
    method getKeyManagerFactory (line 17) | static KeyManagerFactory getKeyManagerFactory(Ssl ssl) throws Exception {
    method getTrustManagerFactory (line 29) | static TrustManagerFactory getTrustManagerFactory(Ssl ssl) throws Exce...
    method loadKeyStore (line 39) | static KeyStore loadKeyStore(String type, String resource, String pass...

FILE: zipkin-server/src/main/java/zipkin2/server/internal/elasticsearch/ZipkinElasticsearchStorageConfiguration.java
  class ZipkinElasticsearchStorageConfiguration (line 48) | @Configuration(proxyBeanMethods = false)
    method esInitialEndpoints (line 62) | @Bean @Qualifier(QUALIFIER) @ConditionalOnMissingBean
    method esSessionProtocol (line 69) | @Bean @Qualifier(QUALIFIER) @ConditionalOnMissingBean
    method esClientFactory (line 78) | @Bean @Qualifier(QUALIFIER) @ConditionalOnMissingBean ClientFactory es...
    method esHttpClientFactory (line 97) | @Bean HttpClientFactory esHttpClientFactory(ZipkinElasticsearchStorage...
    method storage (line 105) | @Bean @ConditionalOnMissingBean StorageComponent storage(
    method esBasicAuth (line 130) | @Bean @Qualifier(QUALIFIER) @Conditional(BasicAuthRequired.class)
    method basicCredentials (line 145) | @Bean @Qualifier(QUALIFIER) @Conditional(BasicAuthRequired.class)
    method dynamicCredentialsScheduledExecutorService (line 153) | @Bean(destroyMethod = "shutdown") @Qualifier(QUALIFIER) @Conditional(D...
    method esTracing (line 169) | @Bean @Qualifier(QUALIFIER) @ConditionalOnSelfTracing
    class BasicAuthRequired (line 199) | static final class BasicAuthRequired implements Condition {
      method matches (line 200) | @Override public boolean matches(ConditionContext condition, Annotat...
    class DynamicRefreshRequired (line 211) | static final class DynamicRefreshRequired implements Condition {
      method matches (line 212) | @Override public boolean matches(ConditionContext condition, Annotat...
    method configureSsl (line 217) | static ClientFactoryBuilder configureSsl(ClientFactoryBuilder builder,...
    method isEmpty (line 226) | private static boolean isEmpty(String s) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/elasticsearch/ZipkinElasticsearchStorageProperties.java
  class ZipkinElasticsearchStorageProperties (line 47) | @ConfigurationProperties("zipkin.storage.elasticsearch")
    type HttpLogging (line 53) | enum HttpLogging {
    class Ssl (line 60) | public static class Ssl {
      method getKeyStore (line 72) | public String getKeyStore() {
      method setKeyStore (line 76) | public void setKeyStore(String keyStore) {
      method getKeyStorePassword (line 80) | public String getKeyStorePassword() {
      method setKeyStorePassword (line 84) | public void setKeyStorePassword(String keyStorePassword) {
      method getKeyStoreType (line 88) | public String getKeyStoreType() {
      method setKeyStoreType (line 92) | public void setKeyStoreType(String keyStoreType) {
      method getTrustStore (line 96) | public String getTrustStore() {
      method setTrustStore (line 100) | public void setTrustStore(String trustStore) {
      method getTrustStorePassword (line 104) | public String getTrustStorePassword() {
      method setTrustStorePassword (line 108) | public void setTrustStorePassword(String trustStorePassword) {
      method getTrustStoreType (line 112) | public String getTrustStoreType() {
      method setTrustStoreType (line 116) | public void setTrustStoreType(String trustStoreType) {
      method isNoVerify (line 120) | public boolean isNoVerify() {
      method setNoVerify (line 124) | public void setNoVerify(boolean noVerify) {
    class HealthCheck (line 132) | public static class HealthCheck {
      method isEnabled (line 142) | public boolean isEnabled() {
      method setEnabled (line 146) | public void setEnabled(boolean enabled) {
      method getHttpLogging (line 150) | public HttpLogging getHttpLogging() {
      method setHttpLogging (line 154) | public void setHttpLogging(HttpLogging httpLogging) {
      method getInterval (line 158) | public Duration getInterval() {
      method setInterval (line 162) | public void setInterval(Duration interval) {
    method getPipeline (line 209) | public String getPipeline() {
    method setPipeline (line 213) | public void setPipeline(String pipeline) {
    method getHosts (line 217) | public String getHosts() {
    method setHosts (line 221) | public void setHosts(String hosts) {
    method getIndex (line 225) | public String getIndex() {
    method getMaxRequests (line 229) | public Integer getMaxRequests() {
    method setMaxRequests (line 233) | public void setMaxRequests(Integer maxRequests) {
    method setIndex (line 237) | public void setIndex(String index) {
    method getIndexShards (line 241) | public Integer getIndexShards() {
    method setIndexShards (line 245) | public void setIndexShards(Integer indexShards) {
    method isEnsureTemplates (line 249) | public Boolean isEnsureTemplates() {
    method setEnsureTemplates (line 253) | public void setEnsureTemplates(Boolean ensureTemplates) {
    method getDateSeparator (line 257) | public String getDateSeparator() {
    method setDateSeparator (line 261) | public void setDateSeparator(String dateSeparator) {
    method getIndexReplicas (line 269) | public Integer getIndexReplicas() {
    method setIndexReplicas (line 273) | public void setIndexReplicas(Integer indexReplicas) {
    method getUsername (line 277) | public String getUsername() {
    method setUsername (line 281) | public void setUsername(String username) {
    method getPassword (line 285) | public String getPassword() {
    method setPassword (line 289) | public void setPassword(String password) {
    method getCredentialsFile (line 293) | public String getCredentialsFile() {
    method setCredentialsFile (line 297) | public void setCredentialsFile(final String credentialsFile) {
    method getCredentialsRefreshInterval (line 301) | public Integer getCredentialsRefreshInterval() {
    method setCredentialsRefreshInterval (line 305) | public void setCredentialsRefreshInterval(
    method getHttpLogging (line 310) | public HttpLogging getHttpLogging() {
    method setHttpLogging (line 314) | public void setHttpLogging(HttpLogging httpLogging) {
    method getTimeout (line 318) | public Integer getTimeout() {
    method setTimeout (line 322) | public void setTimeout(Integer timeout) {
    method getHealthCheck (line 326) | public HealthCheck getHealthCheck() {
    method setHealthCheck (line 330) | public void setHealthCheck(
    method getSsl (line 335) | public Ssl getSsl() {
    method setSsl (line 339) | public void setSsl(Ssl ssl) {
    method getTemplatePriority (line 343) | public Integer getTemplatePriority() { return templatePriority; }
    method setTemplatePriority (line 345) | public void setTemplatePriority(Integer templatePriority) { this.templ...
    method toBuilder (line 347) | public ElasticsearchStorage.Builder toBuilder(LazyHttpClient httpClien...
    method emptyToNull (line 365) | private static String emptyToNull(String s) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/eureka/ZipkinEurekaDiscoveryConfiguration.java
  class ZipkinEurekaDiscoveryConfiguration (line 24) | @ConditionalOnClass(EurekaUpdatingListener.class)
    method eurekaListener (line 29) | @Bean EurekaUpdatingListener eurekaListener(ZipkinEurekaDiscoveryPrope...
    method eurekaListenerConfigurator (line 33) | @Bean ArmeriaServerConfigurator eurekaListenerConfigurator(EurekaUpdat...
    class EurekaServiceUrlSet (line 47) | static final class EurekaServiceUrlSet implements Condition {
      method matches (line 48) | @Override public boolean matches(ConditionContext context, Annotated...
      method isEmpty (line 54) | private static boolean isEmpty(String s) {
      method notFalse (line 58) | private static boolean notFalse(String s) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/eureka/ZipkinEurekaDiscoveryProperties.java
  class ZipkinEurekaDiscoveryProperties (line 25) | @ConfigurationProperties("zipkin.discovery.eureka")
    method getServiceUrl (line 44) | public URI getServiceUrl() {
    method setServiceUrl (line 48) | public void setServiceUrl(URI serviceUrl) {
    method stripBaseUrl (line 65) | static URI stripBaseUrl(URI serviceUrl) {
    method getAppName (line 74) | public String getAppName() {
    method setAppName (line 78) | public void setAppName(String appName) {
    method getInstanceId (line 82) | public String getInstanceId() {
    method setInstanceId (line 86) | public void setInstanceId(String instanceId) {
    method getHostname (line 90) | public String getHostname() {
    method setHostname (line 94) | public void setHostname(String hostname) {
    method toBuilder (line 98) | EurekaUpdatingListenerBuilder toBuilder() {
    method emptyToNull (line 110) | private static String emptyToNull(String s) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/health/ComponentHealth.java
  class ComponentHealth (line 15) | final class ComponentHealth {
    method ofComponent (line 19) | static ComponentHealth ofComponent(Component component) {
    method ComponentHealth (line 44) | ComponentHealth(String name, String status, String error) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/health/ZipkinHealthController.java
  class ZipkinHealthController (line 25) | public class ZipkinHealthController {
    method ZipkinHealthController (line 28) | ZipkinHealthController(List<Component> components) {
    method getActuatorHealth (line 32) | @Get("/actuator/health")
    method getHealth (line 37) | @Get("/health")
    method health (line 42) | @SuppressWarnings("FutureReturnValueIgnored")
    method newHealthResponse (line 85) | static HttpResponse newHealthResponse(List<ComponentHealth> healths, M...
    method newHealthResponse (line 105) | static HttpResponse newHealthResponse(String status, MediaType mediaTy...
    method writeJsonError (line 110) | static String writeJsonError(String error) throws IOException {
    method writeJson (line 126) | static String writeJson(String overallStatus, List<ComponentHealth> he...

FILE: zipkin-server/src/main/java/zipkin2/server/internal/kafka/ZipkinKafkaCollectorConfiguration.java
  class ZipkinKafkaCollectorConfiguration (line 23) | @ConditionalOnClass(KafkaCollector.class)
    method kafka (line 28) | @Bean(initMethod = "start")
    class KafkaBootstrapServersSet (line 47) | static final class KafkaBootstrapServersSet implements Condition {
      method matches (line 48) | @Override
      method isEmpty (line 55) | private static boolean isEmpty(String s) {
      method notFalse (line 59) | private static boolean notFalse(String s){

FILE: zipkin-server/src/main/java/zipkin2/server/internal/kafka/ZipkinKafkaCollectorProperties.java
  class ZipkinKafkaCollectorProperties (line 12) | @ConfigurationProperties("zipkin.collector.kafka")
    method getBootstrapServers (line 25) | public String getBootstrapServers() {
    method setBootstrapServers (line 29) | public void setBootstrapServers(String bootstrapServers) {
    method getGroupId (line 33) | public String getGroupId() {
    method setGroupId (line 37) | public void setGroupId(String groupId) {
    method getTopic (line 41) | public String getTopic() {
    method setTopic (line 45) | public void setTopic(String topic) {
    method getStreams (line 49) | public Integer getStreams() {
    method setStreams (line 53) | public void setStreams(Integer streams) {
    method getOverrides (line 57) | public Map<String, String> getOverrides() {
    method setOverrides (line 61) | public void setOverrides(Map<String, String> overrides) {
    method toBuilder (line 65) | public KafkaCollector.Builder toBuilder() {
    method emptyToNull (line 75) | private static String emptyToNull(String s) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/mysql/ZipkinMySQLStorageConfiguration.java
  class ZipkinMySQLStorageConfiguration (line 23) | @EnableConfigurationProperties(ZipkinMySQLStorageProperties.class)
    method mysqlExecutor (line 32) | @Bean @ConditionalOnMissingBean
    method mysqlDataSource (line 40) | @Bean @ConditionalOnMissingBean
    method storage (line 45) | @Bean StorageComponent storage(

FILE: zipkin-server/src/main/java/zipkin2/server/internal/mysql/ZipkinMySQLStorageProperties.java
  class ZipkinMySQLStorageProperties (line 13) | @ConfigurationProperties("zipkin.storage.mysql")
    method getJdbcUrl (line 26) | public String getJdbcUrl() {
    method setJdbcUrl (line 30) | public void setJdbcUrl(String jdbcUrl) {
    method getHost (line 34) | public String getHost() {
    method setHost (line 38) | public void setHost(String host) {
    method getPort (line 42) | public int getPort() {
    method setPort (line 46) | public void setPort(int port) {
    method getUsername (line 50) | public String getUsername() {
    method setUsername (line 54) | public void setUsername(String username) {
    method getPassword (line 58) | public String getPassword() {
    method setPassword (line 62) | public void setPassword(String password) {
    method getDb (line 66) | public String getDb() {
    method setDb (line 70) | public void setDb(String db) {
    method getMaxActive (line 74) | public int getMaxActive() {
    method setMaxActive (line 78) | public void setMaxActive(int maxActive) {
    method isUseSsl (line 82) | public boolean isUseSsl() {
    method setUseSsl (line 86) | public void setUseSsl(boolean useSsl) {
    method toDataSource (line 90) | public DataSource toDataSource() {
    method determineJdbcUrl (line 100) | private String determineJdbcUrl() {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/mysql/ZipkinSelfTracingMySQLStorageConfiguration.java
  class ZipkinSelfTracingMySQLStorageConfiguration (line 22) | @ConditionalOnSelfTracing
    method mysqlListener (line 30) | @Bean ExecuteListenerProvider mysqlListener() {
    method mysqlExecutor (line 34) | @Bean Executor mysqlExecutor() {
    method makeContextAware (line 46) | static Executor makeContextAware(Executor delegate, CurrentTraceContex...
    method renderEnd (line 55) | @Override public void renderEnd(ExecuteContext ctx) {
    method executeEnd (line 72) | @Override public void executeEnd(ExecuteContext ctx) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/prometheus/ZipkinMetricsController.java
  class ZipkinMetricsController (line 21) | public class ZipkinMetricsController {
    method ZipkinMetricsController (line 26) | ZipkinMetricsController(MeterRegistry meterRegistry, CollectorRegistry...
    method fetchMetricsFromMicrometer (line 32) | @Get("/metrics")

FILE: zipkin-server/src/main/java/zipkin2/server/internal/prometheus/ZipkinPrometheusMetricsConfiguration.java
  class ZipkinPrometheusMetricsConfiguration (line 39) | @Configuration(proxyBeanMethods=false)
    method ZipkinPrometheusMetricsConfiguration (line 51) | ZipkinPrometheusMetricsConfiguration(
    method clock (line 58) | @Bean @ConditionalOnMissingBean public Clock clock() {
    method config (line 62) | @Bean @ConditionalOnMissingBean public PrometheusConfig config() {
    method registry (line 66) | @Bean @ConditionalOnMissingBean public CollectorRegistry registry() {
    method prometheusMeterRegistry (line 70) | @Bean @ConditionalOnMissingBean public PrometheusMeterRegistry prometh...
    method httpRequestDurationConfigurator (line 82) | @Bean ArmeriaServerConfigurator httpRequestDurationConfigurator(MeterR...
    method notFoundMetricCollector (line 92) | @Bean
    class MetricCollectingService (line 100) | static final class MetricCollectingService extends SimpleDecoratingHtt...
      method MetricCollectingService (line 104) | MetricCollectingService(HttpService delegate, MeterRegistry registry...
      method serve (line 110) | @Override
    method setup (line 121) | @SuppressWarnings("FutureReturnValueIgnored") // no known action to ta...
    method getTimeBuilder (line 131) | private static Timer.Builder getTimeBuilder(RequestLog requestLog, Str...
    method getTags (line 138) | private static Iterable<Tag> getTags(RequestLog requestLog) {
    method uri (line 146) | private static Tag uri(RequestLog requestLog) {
    method getPathInfo (line 171) | static String getPathInfo(RequestLog requestLog) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/pulsar/ZipkinPulsarCollectorConfiguration.java
  class ZipkinPulsarCollectorConfiguration (line 24) | @ConditionalOnClass(PulsarCollector.class)
    method pulsar (line 29) | @Bean(initMethod = "start")
    class PulsarConditions (line 50) | static final class PulsarConditions extends AllNestedConditions {
      method PulsarConditions (line 52) | PulsarConditions() {
      class PulsarEnabledCondition (line 56) | @ConditionalOnProperty(prefix = "zipkin.collector.pulsar", name = "e...
      class PulsarServiceUrlCondition (line 61) | @Conditional(PulsarServiceUrlCondition.class)
        method matches (line 63) | @Override public boolean matches(ConditionContext context, Annotat...

FILE: zipkin-server/src/main/java/zipkin2/server/internal/pulsar/ZipkinPulsarCollectorProperties.java
  class ZipkinPulsarCollectorProperties (line 14) | @ConfigurationProperties("zipkin.collector.pulsar")
    method getServiceUrl (line 30) | public String getServiceUrl() {
    method setServiceUrl (line 34) | public void setServiceUrl(String serviceUrl) {
    method getTopic (line 38) | public String getTopic() {
    method setTopic (line 42) | public void setTopic(String topic) {
    method getSubscriptionName (line 46) | public String getSubscriptionName() {
    method setSubscriptionName (line 50) | public void setSubscriptionName(String subscriptionName) {
    method getConcurrency (line 54) | public Integer getConcurrency() {
    method setConcurrency (line 58) | public void setConcurrency(Integer concurrency) {
    method getClientProps (line 62) | public Map<String, Object> getClientProps() {
    method setClientProps (line 66) | public void setClientProps(Map<String, Object> clientProps) {
    method getConsumerProps (line 70) | public Map<String, Object> getConsumerProps() {
    method setConsumerProps (line 74) | public void setConsumerProps(Map<String, Object> consumerProps) {
    method toBuilder (line 78) | public PulsarCollector.Builder toBuilder() {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/rabbitmq/ZipkinRabbitMQCollectorConfiguration.java
  class ZipkinRabbitMQCollectorConfiguration (line 23) | @ConditionalOnClass(RabbitMQCollector.class)
    method rabbitMq (line 28) | @Bean(initMethod = "start")
    class RabbitMQAddressesOrUriSet (line 49) | static final class RabbitMQAddressesOrUriSet implements Condition {
      method matches (line 50) | @Override
      method isEmpty (line 57) | private static boolean isEmpty(String s) {
      method notFalse (line 61) | private static boolean notFalse(String s){

FILE: zipkin-server/src/main/java/zipkin2/server/internal/rabbitmq/ZipkinRabbitMQCollectorProperties.java
  class ZipkinRabbitMQCollectorProperties (line 17) | @ConfigurationProperties("zipkin.collector.rabbitmq")
    method getAddresses (line 43) | public List<String> getAddresses() {
    method setAddresses (line 47) | public void setAddresses(List<String> addresses) {
    method getConcurrency (line 51) | public int getConcurrency() {
    method setConcurrency (line 55) | public void setConcurrency(int concurrency) {
    method getConnectionTimeout (line 59) | public Integer getConnectionTimeout() {
    method setConnectionTimeout (line 63) | public void setConnectionTimeout(Integer connectionTimeout) {
    method getPassword (line 67) | public String getPassword() {
    method setPassword (line 71) | public void setPassword(String password) {
    method getQueue (line 75) | public String getQueue() {
    method setQueue (line 79) | public void setQueue(String queue) {
    method getUsername (line 83) | public String getUsername() {
    method setUsername (line 87) | public void setUsername(String username) {
    method getVirtualHost (line 91) | public String getVirtualHost() {
    method setVirtualHost (line 95) | public void setVirtualHost(String virtualHost) {
    method getUseSsl (line 99) | public Boolean getUseSsl() {
    method setUseSsl (line 103) | public void setUseSsl(Boolean useSsl) {
    method getUri (line 107) | public URI getUri() {
    method setUri (line 111) | public void setUri(URI uri) {
    method toBuilder (line 116) | public RabbitMQCollector.Builder toBuilder()

FILE: zipkin-server/src/main/java/zipkin2/server/internal/scribe/ZipkinScribeCollectorConfiguration.java
  class ZipkinScribeCollectorConfiguration (line 21) | @ConditionalOnClass(ScribeCollector.class)
    method scribe (line 25) | @Bean(initMethod = "start")

FILE: zipkin-server/src/main/java/zipkin2/server/internal/throttle/LimiterMetrics.java
  class LimiterMetrics (line 12) | final class LimiterMetrics {
    method LimiterMetrics (line 15) | LimiterMetrics(MeterRegistry registry) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/throttle/MicrometerThrottleMetrics.java
  class MicrometerThrottleMetrics (line 14) | final class MicrometerThrottleMetrics {
    method MicrometerThrottleMetrics (line 17) | MicrometerThrottleMetrics(MeterRegistry registryInstance) {
    method bind (line 21) | void bind(ThreadPoolExecutor pool) {
    method bind (line 30) | void bind(AbstractLimiter limiter) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/throttle/ThrottledCall.java
  class ThrottledCall (line 34) | final class ThrottledCall extends Call.Base<Void> {
    method onSuccess (line 44) | @Override public void onSuccess(Void value) {
    method onError (line 47) | @Override public void onError(Throwable t) {
    method ThrottledCall (line 59) | ThrottledCall(Call<Void> delegate, Executor executor, Limiter<Void> li...
    method doExecute (line 73) | @Override protected Void doExecute() throws IOException {
    method doEnqueue (line 90) | @Override protected void doEnqueue(Callback<Void> callback) {
    method clone (line 109) | @Override public Call<Void> clone() {
    method toString (line 113) | @Override public String toString() {
    class EnqueueAndAwait (line 118) | final class EnqueueAndAwait implements Runnable, Callback<Void> {
      method EnqueueAndAwait (line 122) | EnqueueAndAwait(Callback<Void> callback, Listener limiterListener) {
      method run (line 137) | @Override public void run() {
      method onSuccess (line 151) | @Override public void onSuccess(Void value) {
      method onError (line 163) | @Override public void onError(Throwable t) {
      method toString (line 181) | @Override public String toString() {
    method await (line 187) | static boolean await(CountDownLatch latch) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/throttle/ThrottledStorageComponent.java
  class ThrottledStorageComponent (line 52) | public final class ThrottledStorageComponent extends ForwardingStorageCo...
    method ThrottledStorageComponent (line 67) | public ThrottledStorageComponent(StorageComponent delegate, MeterRegis...
    method delegate (line 116) | @Override protected StorageComponent delegate() {
    method spanConsumer (line 120) | @Override public SpanConsumer spanConsumer() {
    method close (line 124) | @Override public void close() throws IOException {
    method toString (line 129) | @Override public String toString() {
    class ThrottledSpanConsumer (line 133) | static final class ThrottledSpanConsumer implements SpanConsumer {
      method ThrottledSpanConsumer (line 141) | ThrottledSpanConsumer(ThrottledStorageComponent throttledStorage) {
      method accept (line 152) | @Override public Call<Void> accept(List<Span> spans) {
      method toString (line 159) | @Override public String toString() {
    method createQueue (line 164) | static BlockingQueue<Runnable> createQueue(int maxSize) {
    class ThreadPoolExecutorResizer (line 175) | static final class ThreadPoolExecutorResizer implements Consumer<Integ...
      method ThreadPoolExecutorResizer (line 178) | ThreadPoolExecutorResizer(ThreadPoolExecutor executor) {
      method accept (line 191) | @Override public synchronized void accept(Integer newValue) {
    class Builder (line 206) | static final class Builder extends AbstractLimiter.Builder<Builder> {
      method build (line 207) | NonLimitingLimiter build() {
      method self (line 211) | @Override protected Builder self() {
    class NonLimitingLimiter (line 222) | static final class NonLimitingLimiter extends AbstractLimiter<Void> {
      method NonLimitingLimiter (line 223) | NonLimitingLimiter(AbstractLimiter.Builder<?> builder) {
      method acquire (line 227) | @Override public Optional<Listener> acquire(Void context) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/throttle/ZipkinStorageThrottleProperties.java
  class ZipkinStorageThrottleProperties (line 9) | @ConfigurationProperties("zipkin.storage.throttle")
    method isEnabled (line 26) | public boolean isEnabled() {
    method setEnabled (line 30) | public void setEnabled(boolean enabled) {
    method getMinConcurrency (line 34) | public int getMinConcurrency() {
    method setMinConcurrency (line 38) | public void setMinConcurrency(int minConcurrency) {
    method getMaxConcurrency (line 42) | public int getMaxConcurrency() {
    method setMaxConcurrency (line 46) | public void setMaxConcurrency(int maxConcurrency) {
    method getMaxQueueSize (line 50) | public int getMaxQueueSize() {
    method setMaxQueueSize (line 54) | public void setMaxQueueSize(int maxQueueSize) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ui/CompressionProperties.java
  class CompressionProperties (line 10) | @ConfigurationProperties("server")
    method getCompression (line 12) | public Compression getCompression() {
    method setCompression (line 16) | public void setCompression(Compression compression) {

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ui/ZipkinUiConfiguration.java
  class ZipkinUiConfiguration (line 59) | @EnableConfigurationProperties({ZipkinUiProperties.class, CompressionPro...
    method indexService (line 65) | @Bean HttpService indexService() throws Exception {
    method uiServerConfigurator (line 71) | @Bean ArmeriaServerConfigurator uiServerConfigurator(
    method writeConfig (line 124) | static String writeConfig(ZipkinUiProperties ui) throws IOException {
    method maybeIndexService (line 147) | static HttpService maybeIndexService(String basePath, Resource resourc...
    method maybeResource (line 158) | static String maybeResource(String basePath, Resource resource) throws...

FILE: zipkin-server/src/main/java/zipkin2/server/internal/ui/ZipkinUiProperties.java
  class ZipkinUiProperties (line 11) | @ConfigurationProperties("zipkin.ui")
    method getDefaultLookback (line 28) | public int getDefaultLookback() {
    method setDefaultLookback (line 32) | public void setDefaultLookback(int defaultLookback) {
    method getEnvironment (line 36) | public String getEnvironment() {
    method setEnvironment (line 40) | public void setEnvironment(String environment) {
    method getQueryLimit (line 44) | public int getQueryLimit() {
    method setQueryLimit (line 48) | public void setQueryLimit(int queryLimit) {
    method getInstrumented (line 52) | public String getInstrumented() {
    method setInstrumented (line 56) | public void setInstrumented(String instrumented) {
    method getLogsUrl (line 60) | public String getLogsUrl() {
    method getArchivePostUrl (line 64) | public String getArchivePostUrl() {
    method getArchiveUrl (line 69) | public String getArchiveUrl() {
    method setLogsUrl (line 73) | public void setLogsUrl(String logsUrl) {
    method getSupportUrl (line 79) | public String getSupportUrl() {
    method setSupportUrl (line 83) | public void setSupportUrl(String supportUrl) {
    method setArchivePostUrl (line 90) | public void setArchivePostUrl(String archivePostUrl) {
    method setArchiveUrl (line 96) | public void setArchiveUrl(String archiveUrl) {
    method isSearchEnabled (line 102) | public boolean isSearchEnabled() {
    method setSearchEnabled (line 106) | public void setSearchEnabled(boolean searchEnabled) {
    method getDependency (line 110) | public Dependency getDependency() {
    method setDependency (line 114) | public void setDependency(Dependency dependency) {
    method getBasepath (line 118) | public String getBasepath() {
    method setBasepath (line 122) | public void setBasepath(String basepath) {
    class Dependency (line 126) | public static class Dependency {
      method isEnabled (line 131) | public boolean isEnabled() {
      method setEnabled (line 135) | public void setEnabled(boolean enabled) {
      method getLowErrorRate (line 139) | public float getLowErrorRate() {
      method setLowErrorRate (line 143) | public void setLowErrorRate(float lowErrorRate) {
      method getHighErrorRate (line 147) | public float getHighErrorRate() {
      method setHighErrorRate (line 151) | public void setHighErrorRate(float highErrorRate) {

FILE: zipkin-server/src/test/java/zipkin2/collector/activemq/ZipkinActiveMQCollectorPropertiesOverrideTest.java
  class ZipkinActiveMQCollectorPropertiesOverrideTest (line 18) | public class ZipkinActiveMQCollectorPropertiesOverrideTest {
    method close (line 22) | @AfterEach void close() {
    method data (line 30) | public static Iterable<Object[]> data() {
    method parameters (line 43) | static <T> Object[] parameters(
    method propertyTransferredToCollectorBuilder (line 48) | @MethodSource("data")
    method initZipkinActiveMQCollectorPropertiesOverrideTest (line 76) | void initZipkinActiveMQCollectorPropertiesOverrideTest(String property...

FILE: zipkin-server/src/test/java/zipkin2/collector/kafka/ZipkinKafkaCollectorPropertiesOverrideTest.java
  class ZipkinKafkaCollectorPropertiesOverrideTest (line 18) | public class ZipkinKafkaCollectorPropertiesOverrideTest {
    method close (line 22) | @AfterEach void close() {
    method data (line 30) | public static Iterable<Object[]> data() {
    method parameters (line 46) | static <T> Object[] parameters(
    method propertyTransferredToCollectorBuilder (line 51) | @MethodSource("data")
    method initZipkinKafkaCollectorPropertiesOverrideTest (line 65) | void initZipkinKafkaCollectorPropertiesOverrideTest(String property, O...

FILE: zipkin-server/src/test/java/zipkin2/collector/pulsar/ZipkinPulsarCollectorPropertiesOverrideTest.java
  class ZipkinPulsarCollectorPropertiesOverrideTest (line 19) | public class ZipkinPulsarCollectorPropertiesOverrideTest {
    method close (line 23) | @AfterEach void close() {
    method data (line 31) | public static Iterable<Object[]> data() {
    method parameters (line 44) | static <T> Object[] parameters(
    method propertyTransferredToCollectorBuilder (line 49) | @MethodSource("data")
    method initZipkinPulsarCollectorPropertiesOverrideTest (line 63) | void initZipkinPulsarCollectorPropertiesOverrideTest(String property, ...

FILE: zipkin-server/src/test/java/zipkin2/collector/rabbitmq/ZipkinRabbitMQCollectorPropertiesOverrideTest.java
  class ZipkinRabbitMQCollectorPropertiesOverrideTest (line 19) | public class ZipkinRabbitMQCollectorPropertiesOverrideTest {
    method close (line 23) | @AfterEach void close() {
    method data (line 31) | public static Iterable<Object[]> data() {
    method parameters (line 53) | static <T> Object[] parameters(
    method propertyTransferredToCollectorBuilder (line 58) | @MethodSource("data")
    method initZipkinRabbitMQCollectorPropertiesOverrideTest (line 72) | void initZipkinRabbitMQCollectorPropertiesOverrideTest(String property...

FILE: zipkin-server/src/test/java/zipkin2/collector/scribe/ZipkinScribeCollectorConfigurationTest.java
  class ZipkinScribeCollectorConfigurationTest (line 19) | public class ZipkinScribeCollectorConfigurationTest {
    method close (line 22) | @AfterEach void close() {
    method doesntProvidesCollectorComponent_byDefault (line 26) | @Test void doesntProvidesCollectorComponent_byDefault() {
    method providesCollectorComponent_whenEnabled (line 37) | @Test void providesCollectorComponent_whenEnabled() {
    method canOverrideProperty_port (line 44) | @Test void canOverrideProperty_port() {
    method refreshContext (line 55) | public void refreshContext() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ITActuatorMappings.java
  class ITActuatorMappings (line 23) | @SpringBootTest(
    method actuatorIsOK (line 37) | @Test void actuatorIsOK() throws Exception {
    method actuatorInfoEndpointHasDifferentContentType (line 46) | @Test void actuatorInfoEndpointHasDifferentContentType() throws IOExce...
    method actuatorHealthEndpointHasDifferentContentType (line 65) | @Test void actuatorHealthEndpointHasDifferentContentType() throws IOEx...
    method get (line 84) | Response get(String path) throws IOException {
    method scrape (line 90) | String scrape() throws IOException {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ITZipkinGrpcCollector.java
  class ITZipkinGrpcCollector (line 34) | @SpringBootTest(
    method init (line 46) | @BeforeEach void init() {
    method sanityCheckCodecCompatible (line 54) | @BeforeEach void sanityCheckCodecCompatible() throws IOException {
    method report_trace (line 61) | @Test void report_trace() throws IOException {
    method report_emptyIsOk (line 70) | @Test void report_emptyIsOk() throws IOException {
    method callReport (line 74) | void callReport(ListOfSpans spans) throws IOException {
    method awaitSpans (line 103) | void awaitSpans() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ITZipkinServer.java
  class ITZipkinServer (line 35) | @SpringBootTest(
    method init (line 51) | @BeforeEach void init() {
    method getTrace (line 55) | @Test void getTrace() throws Exception {
    method getTrace_notFound (line 65) | @Test void getTrace_notFound() throws Exception {
    method getTrace_malformed (line 73) | @Test void getTrace_malformed() throws Exception {
    method getTraces (line 83) | @Test void getTraces() throws Exception {
    method getTraces_emptyNotOk (line 93) | @Test void getTraces_emptyNotOk() throws Exception {
    method getTraces_singleNotOk (line 103) | @Test void getTraces_singleNotOk() throws Exception {
    method getTraces_malformed (line 113) | @Test void getTraces_malformed() throws Exception {
    method tracesQueryRequiresNoParameters (line 123) | @Test void tracesQueryRequiresNoParameters() throws Exception {
    method v2WiresUp (line 132) | @Test void v2WiresUp() throws Exception {
    method doesntSetCacheControlOnNameEndpointsWhenLessThan4Services (line 137) | @Test void doesntSetCacheControlOnNameEndpointsWhenLessThan4Services()...
    method spanNameQueryWorksWithNonAsciiServiceName (line 150) | @Test void spanNameQueryWorksWithNonAsciiServiceName() throws Exception {
    method remoteServiceNameQueryWorksWithNonAsciiServiceName (line 155) | @Test void remoteServiceNameQueryWorksWithNonAsciiServiceName() throws...
    method remoteServiceNameReturnsCorrectJsonForEscapedWhitespaceInName (line 160) | @Test void remoteServiceNameReturnsCorrectJsonForEscapedWhitespaceInNa...
    method setsCacheControlOnNameEndpointsWhenMoreThan3Services (line 171) | @Test void setsCacheControlOnNameEndpointsWhenMoreThan3Services() thro...
    method shouldAllowAnyOriginByDefault (line 196) | @Test void shouldAllowAnyOriginByDefault() throws Exception {
    method forwardsApiForUi (line 208) | @Test void forwardsApiForUi() throws Exception {
    method redirectedHeaderUsesOriginalHostAndPort (line 214) | @Test void redirectedHeaderUsesOriginalHostAndPort() throws Exception {
    method infoEndpointIsAvailable (line 230) | @Test void infoEndpointIsAvailable() throws IOException {
    method getTrace_spaceAfterTraceId (line 239) | @Test void getTrace_spaceAfterTraceId() throws Exception {
    method traceMethodDisallowed (line 249) | @Test void traceMethodDisallowed() {
    method get (line 265) | private Response get(String path) throws IOException {
    method url (line 271) | public static String url(Server server, String path) {
    method stringFromClasspath (line 275) | public static String stringFromClasspath(Class<?> thisClass, String pa...

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ITZipkinServerAutocomplete.java
  class ITZipkinServerAutocomplete (line 30) | @SpringBootTest(
    method setsCacheControlOnAutocompleteKeysEndpoint (line 44) | @Test void setsCacheControlOnAutocompleteKeysEndpoint() throws Excepti...
    method setsCacheControlOnAutocompleteEndpointWhenMoreThan3Values (line 49) | @Test void setsCacheControlOnAutocompleteEndpointWhenMoreThan3Values()...
    method get (line 68) | private Response get(String path) throws IOException {
    method post (line 74) | private Response post(String path, byte[] body) throws IOException {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ITZipkinServerCORS.java
  class ITZipkinServerCORS (line 27) | @SpringBootTest(
    method shouldAllowConfiguredOrigin_preflight (line 44) | @Test void shouldAllowConfiguredOrigin_preflight() throws Exception {
    method shouldPermitPreflight (line 49) | static void shouldPermitPreflight(Response response) {
    method shouldAllowConfiguredOrigin (line 61) | @Test void shouldAllowConfiguredOrigin() throws Exception {
    method shouldAllowConfiguredOrigin (line 66) | static void shouldAllowConfiguredOrigin(Response response) {
    method shouldDisallowOrigin (line 74) | @Test void shouldDisallowOrigin() throws Exception {
    method shouldDisallowOrigin (line 79) | static void shouldDisallowOrigin(Response response) {
    method optionsForOrigin (line 86) | private Response optionsForOrigin(String method, String path, String o...
    method getTracesFromOrigin (line 96) | private Response getTracesFromOrigin(String origin) throws IOException {
    method postSpansFromOrigin (line 103) | private Response postSpansFromOrigin(String origin) throws IOException {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ITZipkinServerHttpCollectorDisabled.java
  class ITZipkinServerHttpCollectorDisabled (line 25) | @SpringBootTest(
    method httpCollectorEndpointReturns404 (line 39) | @Test void httpCollectorEndpointReturns404() throws Exception {
    method getOnSpansEndpointReturnsOK (line 49) | @Test void getOnSpansEndpointReturnsOK() throws Exception {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ITZipkinServerQueryDisabled.java
  class ITZipkinServerQueryDisabled (line 24) | @SpringBootTest(
    method queryRelatedEndpoints404 (line 38) | @Test void queryRelatedEndpoints404() throws Exception {
    method get (line 46) | private Response get(String path) throws IOException {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ITZipkinServerSsl.java
  class ITZipkinServerSsl (line 28) | @SpringBootTest(
    method configureClientFactory (line 54) | @BeforeEach void configureClientFactory() {
    method callHealthEndpoint_HTTP (line 58) | @Test void callHealthEndpoint_HTTP() {
    method callHealthEndpoint_HTTPS (line 62) | @Test void callHealthEndpoint_HTTPS() {
    method callHealthEndpoint (line 66) | void callHealthEndpoint(SessionProtocol http) {
    method baseUrl (line 75) | static String baseUrl(Server server, SessionProtocol protocol) {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ITZipkinServerTimeout.java
  class ITZipkinServerTimeout (line 32) | @SpringBootTest(
    method init (line 51) | @BeforeEach void init() {
    method getTrace (line 57) | @Test void getTrace() throws Exception {
    method get (line 66) | Response get(String path) throws IOException {
    method url (line 72) | static String url(Server server, String path) {
    class SlowSpanStore (line 76) | static class SlowSpanStore implements SpanStore {
      method getTraces (line 79) | @Override public Call<List<List<Span>>> getTraces(QueryRequest reque...
      method getTrace (line 84) | @Override public Call<List<Span>> getTrace(String traceId) {
      method getServiceNames (line 89) | @Override public Call<List<String>> getServiceNames() {
      method getSpanNames (line 94) | @Override public Call<List<String>> getSpanNames(String serviceName) {
      method getDependencies (line 99) | @Override public Call<List<DependencyLink>> getDependencies(long end...
      method sleep (line 104) | static void sleep() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/InMemoryConfiguration.java
  class InMemoryConfiguration (line 14) | @Configuration
    method sampler (line 16) | @Bean public CollectorSampler sampler() {
    method metrics (line 20) | @Bean public CollectorMetrics metrics() {
    method storage (line 24) | @Bean public StorageComponent storage() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/NoOpMeterRegistryConfiguration.java
  class NoOpMeterRegistryConfiguration (line 12) | @Configuration
    method noOpMeterRegistry (line 14) | @Bean public MeterRegistry noOpMeterRegistry() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ZipkinActuatorImporterTest.java
  class ZipkinActuatorImporterTest (line 18) | class ZipkinActuatorImporterTest {
    method close (line 23) | @AfterEach void close() {
    method doesntCrashWhenNoIncludes (line 27) | @Test void doesntCrashWhenNoIncludes() {
    method configuresInclude (line 33) | @Test void configuresInclude() {
    method doesntCrashOnBadActuatorImpl (line 44) | @Test void doesntCrashOnBadActuatorImpl() {
    method skipsWhenDisabled (line 56) | @Test void skipsWhenDisabled() {
    method doesntCrashWhenBadInclude (line 70) | @Test void doesntCrashWhenBadInclude() {
    method configuresIncludes (line 80) | @Test void configuresIncludes() {
    class ActuatorImpl (line 93) | @Configuration
    class Include1 (line 97) | @Configuration
    class Include2 (line 101) | @Configuration

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ZipkinHttpConfigurationTest.java
  class ZipkinHttpConfigurationTest (line 28) | class ZipkinHttpConfigurationTest {
    method close (line 31) | @AfterEach void close() {
    method httpCollector_enabledByDefault (line 35) | @Test void httpCollector_enabledByDefault() {
    method httpCollector_canDisable (line 43) | @Test void httpCollector_canDisable() {
    method query_enabledByDefault (line 54) | @Test void query_enabledByDefault() {
    method query_canDisable (line 62) | @Test void query_canDisable() {
    method selfTracing_canEnable (line 72) | @Test void selfTracing_canEnable() {
    method search_canDisable (line 81) | @Test void search_canDisable() {
    class Config (line 92) | @Configuration
      method registry (line 94) | @Bean MeterRegistry registry() {
      method conversionService (line 98) | @Bean ConversionService conversionService() {
    method registerBaseConfig (line 103) | static void registerBaseConfig(AnnotationConfigApplicationContext cont...

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ZipkinModuleImporterTest.java
  class ZipkinModuleImporterTest (line 13) | class ZipkinModuleImporterTest {
    method close (line 17) | @AfterEach void close() {
    method doesntCrashWhenNoModules (line 21) | @Test void doesntCrashWhenNoModules() {
    method configuresModule (line 27) | @Test void configuresModule() {
    method doesntCrashWhenBadModule (line 38) | @Test void doesntCrashWhenBadModule() {
    method configuresModules (line 48) | @Test void configuresModules() {
    class Module1 (line 61) | @Configuration
    class Module2 (line 65) | @Configuration

FILE: zipkin-server/src/test/java/zipkin2/server/internal/activemq/Access.java
  class Access (line 14) | public final class Access {
    method registerActiveMQProperties (line 17) | public static void registerActiveMQProperties(AnnotationConfigApplicat...
    class EnableActiveMQCollectorProperties (line 22) | @Configuration
    method collectorBuilder (line 26) | public static ActiveMQCollector.Builder collectorBuilder(

FILE: zipkin-server/src/test/java/zipkin2/server/internal/activemq/ZipkinActiveMQCollectorConfigurationTest.java
  class ZipkinActiveMQCollectorConfigurationTest (line 21) | class ZipkinActiveMQCollectorConfigurationTest {
    method close (line 25) | @AfterEach void close() {
    method doesNotProvideCollectorComponent_whenAddressAndUriNotSet (line 29) | @Test void doesNotProvideCollectorComponent_whenAddressAndUriNotSet() {
    method providesCollectorComponent_whenUrlSet (line 40) | @Test void providesCollectorComponent_whenUrlSet() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/activemq/ZipkinActiveMQCollectorPropertiesTest.java
  class ZipkinActiveMQCollectorPropertiesTest (line 19) | class ZipkinActiveMQCollectorPropertiesTest {
    method ignoresEmptyURL (line 23) | @Test void ignoresEmptyURL() {
    method providesCollectorComponent_whenUrlSet (line 30) | @Test void providesCollectorComponent_whenUrlSet() {
    method doesNotProvidesCollectorComponent_whenUrlSetAndDisabled (line 43) | @Test void doesNotProvidesCollectorComponent_whenUrlSetAndDisabled() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/banner/ZipkinBannerTest.java
  class ZipkinBannerTest (line 16) | class ZipkinBannerTest {
    method tearDown (line 17) | @AfterEach void tearDown() {
    method shouldReplaceWhenAnsiEnabled (line 21) | @Test void shouldReplaceWhenAnsiEnabled() {
    method shouldReplaceWhenAnsiDisabled (line 33) | @Test void shouldReplaceWhenAnsiDisabled() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/brave/ITZipkinSelfTracing.java
  class ITZipkinSelfTracing (line 38) | @SpringBootTest(
    method clear (line 55) | @BeforeEach void clear() {
    method inMemoryStorage (line 59) | InMemoryStorage inMemoryStorage() {
    method getIsTraced_v2 (line 63) | @Test void getIsTraced_v2() throws Exception {
    method postIsTraced_v1 (line 74) | @Test
    method postIsTraced_v2 (line 87) | @Test
    method toStringContainsOnlySummaryInformation (line 106) | @Test void toStringContainsOnlySummaryInformation() {
    method awaitSpans (line 111) | List<List<Span>> awaitSpans(int count) {
    method assertQueryReturnsResults (line 122) | void assertQueryReturnsResults(QueryRequest.Builder builder, List<List...
    method postSpan (line 134) | void postSpan(String version) throws IOException {
    method getServices (line 150) | Response getServices(String version) throws IOException {
    method assertSuccessful (line 159) | static void assertSuccessful(Response response) throws IOException {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/cassandra3/Access.java
  class Access (line 11) | public final class Access {
    method registerCassandra3 (line 13) | public static void registerCassandra3(AnnotationConfigApplicationConte...

FILE: zipkin-server/src/test/java/zipkin2/server/internal/elasticsearch/Access.java
  class Access (line 14) | public final class Access {
    method registerElasticsearch (line 16) | public static void registerElasticsearch(AnnotationConfigApplicationCo...
    method configureSsl (line 23) | public static ClientFactoryBuilder configureSsl(ClientFactoryBuilder b...

FILE: zipkin-server/src/test/java/zipkin2/server/internal/elasticsearch/ITElasticsearchAuth.java
  class ITElasticsearchAuth (line 25) | class ITElasticsearchAuth {
    method configureServer (line 28) | @Override protected void configureServer(ServerBuilder sb) throws Exce...
    method init (line 49) | @BeforeEach void init() {
    method close (line 67) | @AfterEach void close() {
    method healthcheck_usesAuthAndTls (line 71) | @Test void healthcheck_usesAuthAndTls() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/elasticsearch/ITElasticsearchClientInitialization.java
  class ITElasticsearchClientInitialization (line 16) | class ITElasticsearchClientInitialization {
    method defersIOUntilFirstUse (line 24) | @Test @Timeout(1900L) void defersIOUntilFirstUse() {
    method doesntHangWhenAllDown (line 38) | @Test @Timeout(3000L) void doesntHangWhenAllDown() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/elasticsearch/ITElasticsearchDynamicCredentials.java
  class ITElasticsearchDynamicCredentials (line 26) | class ITElasticsearchDynamicCredentials {
    method configureServer (line 28) | @Override protected void configureServer(ServerBuilder sb) throws Exce...
    method init (line 50) | @BeforeEach void init() {
    method close (line 69) | @AfterEach void close() {
    method healthcheck_usesDynamicCredentialsAndTls (line 73) | @Test void healthcheck_usesDynamicCredentialsAndTls() {
    method pathOfResource (line 81) | static String pathOfResource(String resource) {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/elasticsearch/ITElasticsearchHealthCheck.java
  class ITElasticsearchHealthCheck (line 37) | class ITElasticsearchHealthCheck {
    method configure (line 46) | @Override protected void configure(ServerBuilder sb) {
    method sendResponseAfterAggregate (line 54) | private static HttpResponse sendResponseAfterAggregate(HttpRequest req,
    method configure (line 71) | @Override protected void configure(ServerBuilder sb) {
    method setUp (line 81) | @BeforeEach void setUp() {
    method initWithHosts (line 90) | private void initWithHosts(String hosts) {
    method allHealthy (line 106) | @Test void allHealthy() {
    method oneHealthy (line 114) | @Test void oneHealthy() {
    method wrongScheme (line 122) | @Test void wrongScheme() {
    method noneHealthy (line 136) | @Test void noneHealthy() {
    method healthyThenNotHealthyThenHealthy (line 149) | @Test void healthyThenNotHealthyThenHealthy() {
    method notHealthyThenHealthyThenNotHealthy (line 166) | @Test void notHealthyThenHealthyThenNotHealthy() {
    method healthCheckDisabled (line 184) | @Test void healthCheckDisabled() {
    method assertOk (line 210) | static void assertOk(CheckResult result) {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/elasticsearch/ITElasticsearchNoVerify.java
  class ITElasticsearchNoVerify (line 24) | class ITElasticsearchNoVerify {
    method init (line 31) | @BeforeEach void init() {
    method close (line 44) | @AfterEach void close() {
    method healthcheck_no_tls_verify (line 48) | @Test void healthcheck_no_tls_verify() {
    method service_no_tls_verify (line 55) | @Test void service_no_tls_verify() throws Exception {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/elasticsearch/ITElasticsearchSelfTracing.java
  class ITElasticsearchSelfTracing (line 21) | class ITElasticsearchSelfTracing {
    method init (line 28) | @BeforeEach void init() {
    method close (line 43) | @AfterEach void close() {
    method healthcheck_usesB3Single (line 51) | @Test void healthcheck_usesB3Single() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/elasticsearch/InitialEndpointSupplierTest.java
  class InitialEndpointSupplierTest (line 15) | class InitialEndpointSupplierTest {
    method defaultIsLocalhost9200RegardlessOfSessionProtocol (line 17) | @Test void defaultIsLocalhost9200RegardlessOfSessionProtocol() {
    method usesNaturalHttpPortsWhenUrls (line 23) | @Test void usesNaturalHttpPortsWhenUrls() {
    method defaultsPlainHostsToPort9200 (line 30) | @Test void defaultsPlainHostsToPort9200() {
    method coersesPort9300To9200 (line 38) | @Test void coersesPort9300To9200() {
    method parsesListOfLocalhosts (line 43) | @Test void parsesListOfLocalhosts() {
    method parsesListOfLocalhosts_skipsBlankEntry (line 50) | @Test void parsesListOfLocalhosts_skipsBlankEntry() {
    method parsesEmptyListOfHosts_toDefault (line 57) | @Test void parsesEmptyListOfHosts_toDefault() {
    method parsesListOfLocalhosts_failsWhenAllInvalid (line 62) | @Test void parsesListOfLocalhosts_failsWhenAllInvalid() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/elasticsearch/TestResponses.java
  class TestResponses (line 12) | final class TestResponses {
    method TestResponses (line 72) | private TestResponses() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/elasticsearch/ZipkinElasticsearchStorageConfigurationTest.java
  class ZipkinElasticsearchStorageConfigurationTest (line 31) | class ZipkinElasticsearchStorageConfigurationTest {
    method close (line 34) | @AfterEach void close() {
    method doesntProvideStorageComponent_whenStorageTypeNotElasticsearch (line 38) | @Test void doesntProvideStorageComponent_whenStorageTypeNotElasticsear...
    method providesStorageComponent_whenStorageTypeElasticsearchAndHostsAreUrls (line 48) | @Test void providesStorageComponent_whenStorageTypeElasticsearchAndHos...
    method canOverridesProperty_hostsWithList (line 59) | @Test void canOverridesProperty_hostsWithList() {
    method decentToString_whenUnresolvedOrUnhealthy (line 71) | @Test void decentToString_whenUnresolvedOrUnhealthy() {
    method configuresPipeline (line 83) | @Test void configuresPipeline() {
    method httpPrefixOptional (line 95) | @Test void httpPrefixOptional() {
    method https (line 107) | @Test void https() {
    class CustomizerConfiguration (line 121) | @Configuration
      method one (line 124) | @Bean @Qualifier("zipkinElasticsearch") public Consumer<ClientOption...
      method two (line 128) | @Bean @Qualifier("zipkinElasticsearch") public Consumer<ClientOption...
    method usesInterceptorsQualifiedWith_zipkinElasticsearchHttp (line 138) | @Test void usesInterceptorsQualifiedWith_zipkinElasticsearchHttp() {
    method timeout_defaultsTo10Seconds (line 149) | @Test void timeout_defaultsTo10Seconds() {
    method timeout_override (line 160) | @Test void timeout_override() {
    method strictTraceId_defaultsToTrue (line 176) | @Test void strictTraceId_defaultsToTrue() {
    method strictTraceId_canSetToFalse (line 186) | @Test void strictTraceId_canSetToFalse() {
    method dailyIndexFormat (line 198) | @Test void dailyIndexFormat() {
    method dailyIndexFormat_overridingPrefix (line 210) | @Test void dailyIndexFormat_overridingPrefix() {
    method dailyIndexFormat_overridingDateSeparator (line 223) | @Test void dailyIndexFormat_overridingDateSeparator() {
    method dailyIndexFormat_overridingDateSeparator_empty (line 236) | @Test void dailyIndexFormat_overridingDateSeparator_empty() {
    method dailyIndexFormat_overridingDateSeparator_invalidToBeMultiChar (line 249) | @Test void dailyIndexFormat_overridingDateSeparator_invalidToBeMultiCh...
    method namesLookbackAssignedFromQueryLookback (line 262) | @Test void namesLookbackAssignedFromQueryLookback() {
    method doesntProvideBasicAuthInterceptor_whenBasicAuthUserNameandPasswordNotConfigured (line 274) | @Test void doesntProvideBasicAuthInterceptor_whenBasicAuthUserNameandP...
    method providesBasicAuthInterceptor_whenBasicAuthUserNameAndPasswordConfigured (line 289) | @Test void providesBasicAuthInterceptor_whenBasicAuthUserNameAndPasswo...
    method providesBasicAuthInterceptor_whenDynamicCredentialsConfigured (line 307) | @Test void providesBasicAuthInterceptor_whenDynamicCredentialsConfigur...
    method providesBasicAuthInterceptor_whenInvalidDynamicCredentialsConfigured (line 330) | @Test void providesBasicAuthInterceptor_whenInvalidDynamicCredentialsC...
    method providesBasicAuthInterceptor_whenDynamicCredentialsConfiguredButFileAbsent (line 344) | @Test void providesBasicAuthInterceptor_whenDynamicCredentialsConfigur...
    method searchEnabled_false (line 357) | @Test void searchEnabled_false() {
    method autocompleteKeys_list (line 369) | @Test void autocompleteKeys_list() {
    method autocompleteTtl (line 381) | @Test void autocompleteTtl() {
    method autocompleteCardinality (line 393) | @Test void autocompleteCardinality() {
    method templatePriority_valid (line 405) | @Test void templatePriority_valid() {
    method templatePriority_null (line 417) | @Test void templatePriority_null() {
    method templatePriority_Invalid (line 429) | @Test void templatePriority_Invalid() {
    method es (line 442) | ElasticsearchStorage es() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/eureka/BaseITZipkinEureka.java
  class BaseITZipkinEureka (line 43) | @SpringBootTest(
    method BaseITZipkinEureka (line 70) | BaseITZipkinEureka(HttpUrl serviceUrl) {
    method registersInEureka (line 74) | @Test @Order(1) void registersInEureka() throws IOException {
    method deregistersOnClose (line 110) | @Test @Order(2) void deregistersOnClose() {
    method getEurekaZipkinAppAsString (line 120) | private String getEurekaZipkinAppAsString() throws IOException {
    method getEurekaZipkinApp (line 127) | private Response getEurekaZipkinApp() throws IOException {
    class EurekaContainer (line 137) | static final class EurekaContainer extends GenericContainer<EurekaCont...
      method EurekaContainer (line 141) | EurekaContainer(Map<String, String> env) {
      method serviceUrl (line 150) | HttpUrl serviceUrl() {
    method readString (line 158) | static String readString(String json, String jsonPath) {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/eureka/ITZipkinEureka.java
  class ITZipkinEureka (line 13) | class ITZipkinEureka extends BaseITZipkinEureka {
    method serviceUrl (line 16) | static HttpUrl serviceUrl() {
    method propertyOverride (line 21) | @DynamicPropertySource static void propertyOverride(DynamicPropertyReg...
    method ITZipkinEureka (line 25) | ITZipkinEureka() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/eureka/ITZipkinEurekaAuthenticated.java
  class ITZipkinEurekaAuthenticated (line 13) | class ITZipkinEurekaAuthenticated extends BaseITZipkinEureka {
    method serviceUrl (line 18) | static HttpUrl serviceUrl() {
    method propertyOverride (line 23) | @DynamicPropertySource static void propertyOverride(DynamicPropertyReg...
    method ITZipkinEurekaAuthenticated (line 27) | ITZipkinEurekaAuthenticated() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/eureka/ZipkinEurekaDiscoveryConfigurationTest.java
  class ZipkinEurekaDiscoveryConfigurationTest (line 19) | class ZipkinEurekaDiscoveryConfigurationTest {
    method close (line 23) | @AfterEach void close() {
    method doesNotProvideDiscoveryComponent_whenServiceUrlUnset (line 27) | @Test void doesNotProvideDiscoveryComponent_whenServiceUrlUnset() {
    method doesNotProvidesEurekaUpdatingListener_whenServiceUrlEmptyString (line 38) | @Test void doesNotProvidesEurekaUpdatingListener_whenServiceUrlEmptySt...
    method providesDiscoveryComponent_whenServiceUrlSet (line 50) | @Test void providesDiscoveryComponent_whenServiceUrlSet() {
    method providesDiscoveryComponent_whenServiceUrlAuthenticates (line 62) | @Test void providesDiscoveryComponent_whenServiceUrlAuthenticates() {
    method doesNotProvidesEurekaUpdatingListener_whenServiceUrlSetAndDisabled (line 75) | @Test void doesNotProvidesEurekaUpdatingListener_whenServiceUrlSetAndD...
    method canOverrideProperty_appName (line 89) | @Test void canOverrideProperty_appName() {
    method canOverrideProperty_instanceId (line 96) | @Test void canOverrideProperty_instanceId() {
    method canOverrideProperty_hostname (line 103) | @Test void canOverrideProperty_hostname() {
    method createContextWithOverridenProperty (line 110) | private static AnnotationConfigApplicationContext createContextWithOve...

FILE: zipkin-server/src/test/java/zipkin2/server/internal/eureka/ZipkinEurekaDiscoveryPropertiesTest.java
  class ZipkinEurekaDiscoveryPropertiesTest (line 13) | class ZipkinEurekaDiscoveryPropertiesTest {
    method stringPropertiesConvertEmptyStringsToNull (line 14) | @Test void stringPropertiesConvertEmptyStringsToNull() {
    method setServiceUrl_stripsQueryAndFragment (line 28) | @Test void setServiceUrl_stripsQueryAndFragment() {
    method setServiceUrl_extractsBasicToken (line 37) | @Test void setServiceUrl_extractsBasicToken() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/health/ComponentHealthTest.java
  class ComponentHealthTest (line 15) | class ComponentHealthTest {
    method addsMessageToDetails (line 16) | @Test void addsMessageToDetails() {
    method doesntAddNullMessageToDetails (line 26) | @Test void doesntAddNullMessageToDetails() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/health/ITZipkinHealth.java
  class ITZipkinHealth (line 24) | @SpringBootTest(
    method init (line 39) | @BeforeEach void init() {
    method healthIsOK (line 43) | @Test void healthIsOK() throws Exception {
    method scrape (line 70) | String scrape() throws InterruptedException {
    method readsHealth (line 75) | @Test void readsHealth() throws Exception {
    method getAsString (line 83) | private String getAsString(String path) throws IOException {
    method get (line 91) | private Response get(String path) throws IOException {
    method readString (line 95) | static String readString(String json, String jsonPath) {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/health/ITZipkinHealthDown.java
  class ITZipkinHealthDown (line 20) | @SpringBootTest(
    method downHasCorrectCode (line 35) | @Test void downHasCorrectCode() throws Exception {
    method get (line 40) | private Response get(String path) throws IOException {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/health/ZipkinHealthControllerTest.java
  class ZipkinHealthControllerTest (line 14) | class ZipkinHealthControllerTest {
    method writeJsonError_writesNestedError (line 15) | @Test void writeJsonError_writesNestedError() throws Exception {
    method writeJson_mappedByName (line 29) | @Test void writeJson_mappedByName() throws Exception {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/kafka/Access.java
  class Access (line 14) | public final class Access {
    method registerKafkaProperties (line 17) | public static void registerKafkaProperties(AnnotationConfigApplication...
    class EnableKafkaCollectorProperties (line 22) | @Configuration
    method collectorBuilder (line 26) | public static KafkaCollector.Builder collectorBuilder(

FILE: zipkin-server/src/test/java/zipkin2/server/internal/kafka/ZipkinKafkaCollectorConfigurationTest.java
  class ZipkinKafkaCollectorConfigurationTest (line 19) | class ZipkinKafkaCollectorConfigurationTest {
    method close (line 23) | @AfterEach void close() {
    method doesNotProvideCollectorComponent_whenBootstrapServersUnset (line 27) | @Test void doesNotProvideCollectorComponent_whenBootstrapServersUnset() {
    method providesCollectorComponent_whenBootstrapServersEmptyString (line 38) | @Test void providesCollectorComponent_whenBootstrapServersEmptyString() {
    method providesCollectorComponent_whenBootstrapServersSet (line 50) | @Test void providesCollectorComponent_whenBootstrapServersSet() {
    method doesNotProvidesCollectorComponent_whenBootstrapServersSetAndDisabled (line 62) | @Test void doesNotProvidesCollectorComponent_whenBootstrapServersSetAn...

FILE: zipkin-server/src/test/java/zipkin2/server/internal/kafka/ZipkinKafkaCollectorPropertiesTest.java
  class ZipkinKafkaCollectorPropertiesTest (line 11) | class ZipkinKafkaCollectorPropertiesTest {
    method stringPropertiesConvertEmptyStringsToNull (line 12) | @Test void stringPropertiesConvertEmptyStringsToNull() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/mysql/Access.java
  class Access (line 11) | public final class Access {
    method registerMySQL (line 13) | public static void registerMySQL(AnnotationConfigApplicationContext co...

FILE: zipkin-server/src/test/java/zipkin2/server/internal/prometheus/ITZipkinMetrics.java
  class ITZipkinMetrics (line 37) | @SpringBootTest(
    method init (line 52) | @BeforeEach void init() {
    method metricsIsOK (line 56) | @Test void metricsIsOK() throws Exception {
    method prometheusIsOK (line 65) | @Test void prometheusIsOK() throws Exception {
    method apiTemplate_prometheus (line 76) | @Test void apiTemplate_prometheus() throws Exception {
    method forwardedRoute_prometheus (line 94) | @Test void forwardedRoute_prometheus() throws Exception {
    method jvmMetrics_prometheus (line 103) | @Test void jvmMetrics_prometheus() throws Exception {
    method scrape (line 120) | String scrape() throws Exception {
    method writesSpans_readMetricsFormat (line 125) | @Test void writesSpans_readMetricsFormat() throws Exception {
    method getAsString (line 154) | private String getAsString(String path) throws IOException {
    method get (line 162) | private Response get(String path) throws IOException {
    method post (line 166) | private Response post(String path, byte[] body) throws IOException {
    method readJson (line 173) | static Map<String, Integer> readJson(String json) throws Exception {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/prometheus/ITZipkinMetricsDirty.java
  class ITZipkinMetricsDirty (line 41) | @SpringBootTest(
    method init (line 60) | @BeforeEach void init() {
    method writeSpans_updatesMetrics (line 65) | @Test void writeSpans_updatesMetrics() throws Exception {
    method writeSpans_malformedUpdatesMetrics (line 89) | @Test void writeSpans_malformedUpdatesMetrics() throws Exception {
    method getTrace_malformedDoesntUpdateCollectorMetrics (line 106) | @Test void getTrace_malformedDoesntUpdateCollectorMetrics() throws Exc...
    method writeSpans_updatesPrometheusMetrics (line 126) | @Test void writeSpans_updatesPrometheusMetrics() throws Exception {
    method getAsString (line 152) | String getAsString(String path) throws IOException {
    method get (line 160) | Response get(String path) throws IOException {
    method post (line 164) | Response post(String path, byte[] body) throws IOException {
    method scrape (line 171) | String scrape() throws Exception {
    method readDouble (line 176) | static double readDouble(String json, String jsonPath) {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/prometheus/ZipkinPrometheusMetricsConfigurationTest.java
  class ZipkinPrometheusMetricsConfigurationTest (line 16) | public class ZipkinPrometheusMetricsConfigurationTest {
    method refresh (line 19) | public void refresh() {
    method close (line 27) | @AfterEach void close() {
    method providesHttpRequestDurationCustomizer (line 31) | @Test void providesHttpRequestDurationCustomizer() {
    method defaultMetricName (line 37) | @Test void defaultMetricName() {
    method overrideMetricName (line 44) | @Test void overrideMetricName() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/pulsar/Access.java
  class Access (line 14) | public final class Access {
    method registerPulsarProperties (line 17) | public static void registerPulsarProperties(AnnotationConfigApplicatio...
    class EnablePulsarCollectorProperties (line 22) | @Configuration
    method collectorBuilder (line 27) | public static PulsarCollector.Builder collectorBuilder(

FILE: zipkin-server/src/test/java/zipkin2/server/internal/pulsar/ZipkinPulsarCollectorConfigurationTest.java
  class ZipkinPulsarCollectorConfigurationTest (line 21) | class ZipkinPulsarCollectorConfigurationTest {
    method close (line 25) | @AfterEach void close() {
    method doesNotProvideCollectorComponent_whenBootstrapServersUnset (line 29) | @Test void doesNotProvideCollectorComponent_whenBootstrapServersUnset() {
    method providesCollectorComponent_whenServiceUrlEmptyString (line 40) | @Test void providesCollectorComponent_whenServiceUrlEmptyString() {
    method providesCollectorComponent_whenServiceUrlServersSet (line 52) | @Test void providesCollectorComponent_whenServiceUrlServersSet() {
    method doesNotProvidesCollectorComponent_whenServiceUrlSetAndDisabled (line 69) | @Test void doesNotProvidesCollectorComponent_whenServiceUrlSetAndDisab...

FILE: zipkin-server/src/test/java/zipkin2/server/internal/pulsar/ZipkinPulsarCollectorPropertiesTest.java
  class ZipkinPulsarCollectorPropertiesTest (line 13) | class ZipkinPulsarCollectorPropertiesTest {
    method stringPropertiesConvertEmptyStringsToNull (line 14) | @Test void stringPropertiesConvertEmptyStringsToNull() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/rabbitmq/Access.java
  class Access (line 14) | public final class Access {
    method registerRabbitMQProperties (line 17) | public static void registerRabbitMQProperties(AnnotationConfigApplicat...
    class EnableRabbitMQCollectorProperties (line 22) | @Configuration
    method collectorBuilder (line 26) | public static RabbitMQCollector.Builder collectorBuilder(

FILE: zipkin-server/src/test/java/zipkin2/server/internal/rabbitmq/ZipkinRabbitMQCollectorConfigurationTest.java
  class ZipkinRabbitMQCollectorConfigurationTest (line 21) | class ZipkinRabbitMQCollectorConfigurationTest {
    method close (line 25) | @AfterEach void close() {
    method doesNotProvideCollectorComponent_whenAddressAndUriNotSet (line 29) | @Test void doesNotProvideCollectorComponent_whenAddressAndUriNotSet() {
    method doesNotProvideCollectorComponent_whenAddressesAndUriIsEmptyString (line 40) | @Test void doesNotProvideCollectorComponent_whenAddressesAndUriIsEmpty...
    method providesCollectorComponent_whenAddressesSet (line 56) | @Test void providesCollectorComponent_whenAddressesSet() {
    method doesNotProvidesCollectorComponent_whenAddressesSetAndDisabled (line 73) | @Test void doesNotProvidesCollectorComponent_whenAddressesSetAndDisabl...

FILE: zipkin-server/src/test/java/zipkin2/server/internal/rabbitmq/ZipkinRabbitMQCollectorPropertiesTest.java
  class ZipkinRabbitMQCollectorPropertiesTest (line 14) | class ZipkinRabbitMQCollectorPropertiesTest {
    method uriProperlyParsedAndIgnoresOtherProperties_whenUriSet (line 17) | @Test void uriProperlyParsedAndIgnoresOtherProperties_whenUriSet() thr...
    method ignoresEmptyURI (line 37) | @Test void ignoresEmptyURI() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/throttle/FakeCall.java
  class FakeCall (line 11) | class FakeCall extends Call<Void> {
    method setOverCapacity (line 14) | void setOverCapacity(boolean isOverCapacity) {
    method execute (line 18) | @Override public Void execute() {
    method enqueue (line 23) | @Override public void enqueue(Callback<Void> callback) {
    method cancel (line 31) | @Override public void cancel() {
    method isCanceled (line 34) | @Override public boolean isCanceled() {
    method clone (line 38) | @Override public Call<Void> clone() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/throttle/ThrottledCallTest.java
  class ThrottledCallTest (line 43) | class ThrottledCallTest {
    method shutdownExecutor (line 52) | @AfterEach void shutdownExecutor() {
    method niceToString (line 56) | @Test void niceToString() {
    method execute_isThrottled (line 64) | @Test void execute_isThrottled() throws Exception {
    method execute_throttlesBack_whenStorageRejects (line 119) | @Test void execute_throttlesBack_whenStorageRejects() throws Exception {
    method execute_ignoresLimit_whenPoolFull (line 135) | @Test void execute_ignoresLimit_whenPoolFull() throws Exception {
    method enqueue_isThrottled (line 149) | @Test void enqueue_isThrottled() throws Exception {
    method enqueue_throttlesBack_whenStorageRejects (line 176) | @Test void enqueue_throttlesBack_whenStorageRejects() throws Exception {
    method enqueue_ignoresLimit_whenPoolFull (line 204) | @Test void enqueue_ignoresLimit_whenPoolFull() {
    method throttle (line 216) | ThrottledCall throttle(Call<Void> delegate) {
    class LockedCall (line 220) | static final class LockedCall extends Call.Base<Void> {
      method LockedCall (line 223) | LockedCall(Semaphore startLock, Semaphore waitLock) {
      method doExecute (line 228) | @Override public Void doExecute() {
      method doEnqueue (line 239) | @Override public void doEnqueue(Callback<Void> callback) {
      method clone (line 248) | @Override public LockedCall clone() {
    method mockExhaustedPool (line 253) | ExecutorService mockExhaustedPool() {
    method mockLimiter (line 260) | Limiter<Void> mockLimiter(Listener listener) {
    class FakeCall (line 268) | static final class FakeCall extends Call.Base<Void> {
      method doExecute (line 271) | @Override public Void doExecute() {
      method doEnqueue (line 275) | @Override public void doEnqueue(Callback<Void> callback) {
      method clone (line 283) | @Override public FakeCall clone() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/throttle/ThrottledStorageComponentTest.java
  class ThrottledStorageComponentTest (line 22) | class ThrottledStorageComponentTest {
    method spanConsumer_isProxied (line 27) | @Test void spanConsumer_isProxied() {
    method createComponent_withZeroSizedQueue (line 35) | @Test void createComponent_withZeroSizedQueue() {
    method createComponent_withNegativeQueue (line 41) | @Test void createComponent_withNegativeQueue() {
    method toStringContainsOnlySummaryInformation (line 54) | @Test void toStringContainsOnlySummaryInformation() {
    method delegatesCheck (line 59) | @Test void delegatesCheck() {

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ui/ITZipkinUiConfiguration.java
  class ITZipkinUiConfiguration (line 28) | @SpringBootTest(
    method configJson (line 42) | @Test void configJson() throws Exception {
    method setsMaxAgeOnUiResources (line 63) | @Test void setsMaxAgeOnUiResources() throws Exception {
    method redirectsIndex (line 72) | @Test void redirectsIndex() throws Exception {
    method conditionalRequests (line 87) | @Test void conditionalRequests() {
    method supportsCompression (line 102) | @Test void supportsCompression() {
    method replacesBaseTag (line 113) | @Test void replacesBaseTag() throws Exception {
    method servesOtherContentFromClasspath (line 130) | @Test void servesOtherContentFromClasspath() throws Exception {
    method get (line 135) | private Response get(String path) throws IOException {
    method conditionalGet (line 139) | private Response conditionalGet(String path, String etag) throws IOExc...
    method getContentEncodingFromRequestThatAcceptsGzip (line 146) | private String getContentEncodingFromRequestThatAcceptsGzip(String pat...

FILE: zipkin-server/src/test/java/zipkin2/server/internal/ui/ZipkinUiConfigurationTest.java
  class ZipkinUiConfigurationTest (line 31) | class ZipkinUiConfigurationTest {
    method close (line 35) | @AfterEach void close() {
    method indexContentType (line 41) | @Test void indexContentType() {
    method indexHtml (line 48) | @Test void indexHtml() {
    method canOverridesProperty_defaultLookback (line 56) | @Test void canOverridesProperty_defaultLookback() {
    method canOverrideProperty_logsUrl (line 63) | @Test void canOverrideProperty_logsUrl() {
    method canOverrideProperty_archivePostUrl (line 70) | @Test void canOverrideProperty_archivePostUrl() {
    method canOverrideProperty_archiveUrl (line 77) | @Test void canOverrideProperty_archiveUrl() {
    method canOverrideProperty_supportUrl (line 84) | @Test void canOverrideProperty_supportUrl() {
    method logsUrlIsNullIfOverridenByEmpty (line 91) | @Test void logsUrlIsNullIfOverridenByEmpty() {
    method logsUrlIsNullByDefault (line 97) | @Test void logsUrlIsNullByDefault() {
    method canOverridesProperty_disable (line 103) | @Test void canOverridesProperty_disable() {
    method canOverridesProperty_searchEnabled (line 111) | @Test void canOverridesProperty_searchEnabled() {
    method canOverridesProperty_dependenciesEnabled (line 117) | @Test void canOverridesProperty_dependenciesEnabled() {
    method canOverrideProperty_dependencyLowErrorRate (line 123) | @Test void canOverrideProperty_dependencyLowErrorRate() {
    method canOverrideProperty_dependencyHighErrorRate (line 130) | @Test void canOverrideProperty_dependencyHighErrorRate() {
    method defaultBaseUrl_doesNotChangeResource (line 137) | @Test void defaultBaseUrl_doesNotChangeResource() {
    method canOverrideProperty_basePath (line 144) | @Test void canOverrideProperty_basePath() {
    method lensCookieOverridesIndex (line 162) | @Test void lensCookieOverridesIndex() {
    method canOverrideProperty_root (line 169) | @Test void canOverrideProperty_root() {
    method serveIndex (line 187) | AggregatedHttpResponse serveIndex(Cookie... cookies) {
    method createContext (line 203) | private static AnnotationConfigApplicationContext createContext() {
    method createContextWithOverridenProperty (line 210) | private static AnnotationConfigApplicationContext createContextWithOve...

FILE: zipkin-server/src/test/java/zipkin2/storage/cassandra/ZipkinCassandraStorageAutoConfigurationTest.java
  class ZipkinCassandraStorageAutoConfigurationTest (line 17) | class ZipkinCassandraStorageAutoConfigurationTest {
    method close (line 21) | @AfterEach void close() {
    method doesntProvidesStorageComponent_whenStorageTypeNotCassandra (line 25) | @Test void doesntProvidesStorageComponent_whenStorageTypeNotCassandra() {
    method providesStorageComponent_whenStorageTypeCassandra (line 34) | @Test void providesStorageComponent_whenStorageTypeCassandra() {
    method canOverridesProperty_contactPoints (line 42) | @Test void canOverridesProperty_contactPoints() {
    method strictTraceId_defaultsToTrue (line 53) | @Test void strictTraceId_defaultsToTrue() {
    method strictTraceId_canSetToFalse (line 61) | @Test void strictTraceId_canSetToFalse() {
    method searchEnabled_canSetToFalse (line 72) | @Test void searchEnabled_canSetToFalse() {
    method autocompleteKeys_list (line 83) | @Test void autocompleteKeys_list() {
    method autocompleteTtl (line 95) | @Test void autocompleteTtl() {
    method autocompleteCardinality (line 107) | @Test void autocompleteCardinality() {
    method useSsl (line 119) | @Test void useSsl() {
    method sslHostnameValidation_canSetToFalse (line 131) | @Test void sslHostnameValidation_canSetToFalse() {

FILE: zipkin-server/src/test/java/zipkin2/storage/mysql/v1/ZipkinMySQLStorageConfigurationTest.java
  class ZipkinMySQLStorageConfigurationTest (line 18) | class ZipkinMySQLStorageConfigurationTest {
    method close (line 22) | @AfterEach void close() {
    method doesntProvidesStorageComponent_whenStorageTypeNotMySQL (line 28) | @Test void doesntProvidesStorageComponent_whenStorageTypeNotMySQL() {
    method providesStorageComponent_whenStorageTypeMySQL (line 38) | @Test void providesStorageComponent_whenStorageTypeMySQL() {
    method canOverridesProperty_username (line 47) | @Test void canOverridesProperty_username() {
    method strictTraceId_defaultsToTrue (line 59) | @Test void strictTraceId_defaultsToTrue() {
    method strictTraceId_canSetToFalse (line 67) | @Test void strictTraceId_canSetToFalse() {
    method searchEnabled_canSetToFalse (line 79) | @Test void searchEnabled_canSetToFalse() {
    method autocompleteKeys_list (line 91) | @Test void autocompleteKeys_list() {
    method usesJdbcUrl_whenPresent (line 104) | @Test void usesJdbcUrl_whenPresent() {
    method usesRegularConfig_whenBlank (line 120) | @Test void usesRegularConfig_whenBlank() {

FILE: zipkin-storage/cassandra/src/main/java/zipkin2/storage/cassandra/AnnotationCodec.java
  class AnnotationCodec (line 21) | final class AnnotationCodec extends MappingCodec<UdtValue, Annotation> {
    method AnnotationCodec (line 22) | AnnotationCodec(TypeCodec<UdtValue> innerCodec) {
    method getCqlType (line 26) | @Ove
Condensed preview — 814 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,061K chars).
[
  {
    "path": ".dockerignore",
    "chars": 2456,
    "preview": "# https://docs.docker.com/engine/reference/builder/#dockerignore-file\n**\n\n# Scripts that run within Docker\n!build-bin/ma"
  },
  {
    "path": ".editorconfig",
    "chars": 147,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_style = space\nindent_size = 2\ninsert_final_newline = true\ntrim_"
  },
  {
    "path": ".gitattributes",
    "chars": 411,
    "preview": "*.java text=auto eol=lf\n*.bnd text=auto eol=lf\n\n*.sh text=auto eol=lf\n.*_profile text=auto eol=lf\n\n*.md text=auto eol=lf"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 830,
    "preview": "# Contributing to Zipkin\n\nIf you would like to contribute code, fork this GitHub repository and\nsend a pull request (on "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug.md",
    "chars": 1119,
    "preview": "---\nname: Bug\nabout: If you’ve found a bug, spend the time to write a failing test. Bugs with tests get fixed and stay f"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 315,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Question\n    url: https://gitter.im/openzipkin/zipkin\n    about: Pl"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature.md",
    "chars": 764,
    "preview": "---\nname: Feature Request\nabout: Please first, look at existing issues to see if the feature has been requested before.\n"
  },
  {
    "path": ".github/workflows/create_release.yml",
    "chars": 1628,
    "preview": "---\nname: create_release\n\n# We create a release version on a trigger tag, regardless of if the commit is\n# documentation"
  },
  {
    "path": ".github/workflows/deploy.yml",
    "chars": 3686,
    "preview": "# yamllint --format github .github/workflows/deploy.yml\n---\nname: deploy\n\n# We deploy on master and release versions, re"
  },
  {
    "path": ".github/workflows/docker_push.yml",
    "chars": 1646,
    "preview": "---\nname: docker_push\n\n# We re-push docker on a trigger tag, regardless of if the commit is\n# documentation-only.\non:  #"
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 898,
    "preview": "---\nname: lint\n\non:  # yamllint disable-line rule:truthy\n  push:  # non-tagged pushes to master\n    branches:\n      - ma"
  },
  {
    "path": ".github/workflows/security.yml",
    "chars": 1971,
    "preview": "---\nname: security\n\n# We don't scan documentation-only commits.\non:  # yamllint disable-line rule:truthy\n  push:  # non-"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 4319,
    "preview": "---\nname: test\n\n# We don't test documentation-only commits.\non:  # yamllint disable-line rule:truthy\n  push:  # non-tagg"
  },
  {
    "path": ".github/workflows/test_readme.yml",
    "chars": 8031,
    "preview": "---\nname: test_readme\n\n# These test build commands mentioned in various README.md files.\n#\n# We don't test documentation"
  },
  {
    "path": ".gitignore",
    "chars": 606,
    "preview": "*~\n#*\n*#\n.#*\ndependency-reduced-pom.xml\n.factorypath\n.classpath\n.project\n.settings/\n.springBeans\ntarget/\n_site/\n.idea\n*."
  },
  {
    "path": ".mvn/wrapper/maven-wrapper.properties",
    "chars": 1060,
    "preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements.  See the NOTICE f"
  },
  {
    "path": ".settings.xml",
    "chars": 807,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright The OpenZipkin Authors\n    SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "LICENSE",
    "chars": 11809,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 10644,
    "preview": "# zipkin\n\n[![Gitter chat](http://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im"
  },
  {
    "path": "RELEASE.md",
    "chars": 3741,
    "preview": "# OpenZipkin Release Process\n\nThis repo uses semantic versions. Please keep this in mind when choosing version numbers.\n"
  },
  {
    "path": "SECURITY.md",
    "chars": 697,
    "preview": "# OpenZipkin Security Process\n\nThis document outlines the process for handling security concerns in OpenZipkin projects."
  },
  {
    "path": "benchmarks/README.md",
    "chars": 416,
    "preview": "# zipkin-benchmarks\n\nThis module includes [JMH](http://openjdk.java.net/projects/code-tools/jmh/)\nbenchmarks for zipkin."
  },
  {
    "path": "benchmarks/pom.xml",
    "chars": 9451,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright The OpenZipkin Authors\n    SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "benchmarks/src/test/assembly/test-jar.xml",
    "chars": 1184,
    "preview": "<!--\n\n    Copyright The OpenZipkin Authors\n    SPDX-License-Identifier: Apache-2.0\n\n-->\n<assembly xmlns=\"http://maven.ap"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/EndpointBenchmarks.java",
    "chars": 2342,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2;\n\nimport java.net.Inet"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/SpanBenchmarks.java",
    "chars": 4733,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2;\n\nimport com.esoterics"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/codec/CodecBenchmarks.java",
    "chars": 5912,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport java.ut"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/codec/JacksonSpanDecoder.java",
    "chars": 6806,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport com.fas"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/codec/JacksonSpanDecoderTest.java",
    "chars": 1430,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport io.nett"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/codec/JsonCodecBenchmarks.java",
    "chars": 3089,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport io.nett"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/codec/MoshiSpanDecoder.java",
    "chars": 7264,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport com.squ"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/codec/MoshiSpanDecoderTest.java",
    "chars": 868,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport io.nett"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/codec/ProtoCodecBenchmarks.java",
    "chars": 3052,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport io.nett"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/codec/ProtobufSpanDecoder.java",
    "chars": 7579,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport com.goo"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/codec/WireSpanDecoder.java",
    "chars": 7556,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport com.goo"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/collector/MetricsBenchmarks.java",
    "chars": 2920,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.collector;\n\nimport io."
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/elasticsearch/internal/BulkRequestBenchmarks.java",
    "chars": 3048,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.elasticsearch.internal"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/internal/DelayLimiterBenchmarks.java",
    "chars": 1776,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/internal/Proto3CodecInteropTest.java",
    "chars": 8480,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport com."
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/internal/ReadBufferBenchmarks.java",
    "chars": 3402,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/internal/WriteBufferBenchmarks.java",
    "chars": 2750,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/server/ServerIntegratedBenchmark.java",
    "chars": 13915,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.server;\n\nimport com.fa"
  },
  {
    "path": "benchmarks/src/test/java/zipkin2/server/internal/throttle/ThrottledCallBenchmarks.java",
    "chars": 3982,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.server.internal.thrott"
  },
  {
    "path": "benchmarks/src/test/resources/create-datasource-and-dashboard.sh",
    "chars": 1118,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -xeuo pipefail\n\nif ! curl --"
  },
  {
    "path": "benchmarks/src/test/resources/prometheus.yml",
    "chars": 434,
    "preview": "global:\n  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.\n  evaluatio"
  },
  {
    "path": "benchmarks/src/test/resources/simplelogger.properties",
    "chars": 401,
    "preview": "# See https://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html for the full list of config options\n\norg.slf4j.simpleLo"
  },
  {
    "path": "benchmarks/src/test/resources/zipkin2-chinese.json",
    "chars": 511,
    "preview": "{\n  \"traceId\": \"4d1e00c0db9010db86154a4ba6e91385\",\n  \"parentId\": \"86154a4ba6e91385\",\n  \"id\": \"4d1e00c0db9010db\",\n  \"kind"
  },
  {
    "path": "benchmarks/src/test/resources/zipkin2-client.json",
    "chars": 640,
    "preview": "{\n  \"traceId\": \"4d1e00c0db9010db86154a4ba6e91385\",\n  \"parentId\": \"86154a4ba6e91385\",\n  \"id\": \"4d1e00c0db9010db\",\n  \"kind"
  },
  {
    "path": "build-bin/README.md",
    "chars": 8705,
    "preview": "# Test and Deploy scripts\n\nThis is a Maven+Docker project, which uses standard conventions for test and deploy with some"
  },
  {
    "path": "build-bin/configure_deploy",
    "chars": 469,
    "preview": "#!/bin/sh -ue\n\n# This script sets up anything needed for `./deploy`. Do not assume `configure_test` was called.\n#\n# See "
  },
  {
    "path": "build-bin/configure_lint",
    "chars": 289,
    "preview": "#!/bin/sh -ue\n\n# Attempt to install markdown-link-check if absent\n# Pinned until https://github.com/tcort/markdown-link-"
  },
  {
    "path": "build-bin/configure_test",
    "chars": 371,
    "preview": "#!/bin/sh -ue\n\n# This script sets up anything needed for `./test`. This should not login to anything, as that\n# should b"
  },
  {
    "path": "build-bin/deploy",
    "chars": 619,
    "preview": "#!/bin/sh -ue\n\n# This script deploys a master or release version.\n#\n# See [README.md] for an explanation of this and how"
  },
  {
    "path": "build-bin/docker/configure_docker",
    "chars": 1080,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Defends against build outages "
  },
  {
    "path": "build-bin/docker/configure_docker_push",
    "chars": 1930,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Ensures Docker is logged in an"
  },
  {
    "path": "build-bin/docker/docker-healthcheck",
    "chars": 2123,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# HEALTHCHECK for use in `docker"
  },
  {
    "path": "build-bin/docker/docker_arch",
    "chars": 939,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script gets a normalized "
  },
  {
    "path": "build-bin/docker/docker_args",
    "chars": 2958,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This builds common docker argu"
  },
  {
    "path": "build-bin/docker/docker_block_on_health",
    "chars": 535,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Blocks until a named docker co"
  },
  {
    "path": "build-bin/docker/docker_build",
    "chars": 592,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -ue\n\ndocker_tag=${1?full doc"
  },
  {
    "path": "build-bin/docker/docker_push",
    "chars": 3425,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script pushes images to G"
  },
  {
    "path": "build-bin/docker/docker_test_image",
    "chars": 2115,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Tests a an image by awaiting i"
  },
  {
    "path": "build-bin/docker-compose-zipkin-eureka.yml",
    "chars": 603,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# uses 2.4 so we can use condition: servic"
  },
  {
    "path": "build-bin/docker-compose-zipkin-ui.yml",
    "chars": 730,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# uses 2.4 so we can use condition: servic"
  },
  {
    "path": "build-bin/docker-compose-zipkin-uiproxy.yml",
    "chars": 715,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# uses 2.4 so we can use condition: servic"
  },
  {
    "path": "build-bin/docker-compose-zipkin.yml",
    "chars": 762,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# uses 2.4 so we can use condition: servic"
  },
  {
    "path": "build-bin/docker_push",
    "chars": 843,
    "preview": "#!/bin/sh -ue\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n\n# Pushes docker as part of "
  },
  {
    "path": "build-bin/git/login_git",
    "chars": 439,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -ue\n\n# Allocate commits to C"
  },
  {
    "path": "build-bin/git/version_from_trigger_tag",
    "chars": 1018,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script echos a `MAJOR.MIN"
  },
  {
    "path": "build-bin/gpg/configure_gpg",
    "chars": 395,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script prepares GPG, need"
  },
  {
    "path": "build-bin/javadoc_to_gh_pages",
    "chars": 1855,
    "preview": "#!/bin/sh -ue\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script creates JavaDo"
  },
  {
    "path": "build-bin/lint",
    "chars": 154,
    "preview": "#!/bin/sh -ue\n\nyamllint --format github .github/workflows/*.yml\nfind . -name \\*.md |grep -v node|xargs markdown-link-che"
  },
  {
    "path": "build-bin/maven/maven_build",
    "chars": 379,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -ue\n\nexport MAVEN_OPTS=\"$($("
  },
  {
    "path": "build-bin/maven/maven_build_or_unjar",
    "chars": 1408,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -ue\n\n# Like `maven_unjar`, e"
  },
  {
    "path": "build-bin/maven/maven_deploy",
    "chars": 374,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -ue\n\nexport MAVEN_OPTS=\"$($("
  },
  {
    "path": "build-bin/maven/maven_go_offline",
    "chars": 457,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This is a go-offline that prop"
  },
  {
    "path": "build-bin/maven/maven_opts",
    "chars": 672,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script checks each variab"
  },
  {
    "path": "build-bin/maven/maven_release",
    "chars": 1455,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -ue\n\n# This script creates a"
  },
  {
    "path": "build-bin/maven/maven_unjar",
    "chars": 2784,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script gets one jar from "
  },
  {
    "path": "build-bin/maven_go_offline",
    "chars": 335,
    "preview": "#!/bin/sh -ue\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n\nbuild-bin/maven/maven_go_of"
  },
  {
    "path": "build-bin/maybe_install_npm",
    "chars": 1112,
    "preview": "#!/bin/sh -ue\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script hydrates the M"
  },
  {
    "path": "build-bin/mlc_config.json",
    "chars": 771,
    "preview": "{\n  \"ignorePatterns\": [\n    {\n      \"pattern\": \"https://chromewebstore.google.com/detail/*\"\n    },\n    {\n      \"pattern\""
  },
  {
    "path": "build-bin/test",
    "chars": 241,
    "preview": "#!/bin/sh -ue\n\n# This script runs the tests of the project.\n#\n# See [README.md] for an explanation of this and how CI sh"
  },
  {
    "path": "docker/Dockerfile",
    "chars": 3942,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# java_version is used for install and run"
  },
  {
    "path": "docker/RATIONALE.md",
    "chars": 2657,
    "preview": "# zipkin-docker rationale\n\n## Why do we add HEALTHCHECK?\nWhile most of our images are not production, we still add HEALT"
  },
  {
    "path": "docker/README.md",
    "chars": 5675,
    "preview": "## zipkin Docker images\nThis directory contains assets used to build and release Zipkin's Docker images.\n\n## Production "
  },
  {
    "path": "docker/examples/.dockerignore",
    "chars": 155,
    "preview": "# https://docs.docker.com/engine/reference/builder/#dockerignore-file\n**/.*\n\n!./prometheus/create-datasource-and-dashboa"
  },
  {
    "path": "docker/examples/README.md",
    "chars": 8595,
    "preview": "# Zipkin Docker Examples\n\nThis project is configured to run docker containers using\n[docker-compose](https://docs.docker"
  },
  {
    "path": "docker/examples/docker-compose-activemq.yml",
    "chars": 900,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/docker-compose-cassandra.yml",
    "chars": 1912,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/docker-compose-dependencies.yml",
    "chars": 702,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nversion: '2.4'\n\nservices:\n  # Adds a cron "
  },
  {
    "path": "docker/examples/docker-compose-elasticsearch.yml",
    "chars": 1258,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/docker-compose-eureka.yml",
    "chars": 1949,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/docker-compose-example.yml",
    "chars": 808,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Format version 2.1 was introduced with D"
  },
  {
    "path": "docker/examples/docker-compose-kafka.yml",
    "chars": 1090,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/docker-compose-mysql.yml",
    "chars": 1506,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/docker-compose-prometheus.yml",
    "chars": 1738,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/docker-compose-pulsar.yml",
    "chars": 946,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/docker-compose-rabbitmq.yml",
    "chars": 886,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/docker-compose-ui.yml",
    "chars": 655,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/docker-compose-uiproxy.yml",
    "chars": 873,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/docker-compose.yml",
    "chars": 1184,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This file uses the version 2 docker comp"
  },
  {
    "path": "docker/examples/prometheus/create-datasource-and-dashboard.sh",
    "chars": 1118,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -xeuo pipefail\n\nif ! curl --"
  },
  {
    "path": "docker/examples/prometheus/prometheus.yml",
    "chars": 512,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nglobal:\n  scrape_interval:     15s # Set t"
  },
  {
    "path": "docker/start-zipkin",
    "chars": 1272,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# ENTRYPOINT script that starts "
  },
  {
    "path": "docker/test-images/zipkin-activemq/Dockerfile",
    "chars": 2506,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# java_version is used for install and run"
  },
  {
    "path": "docker/test-images/zipkin-activemq/README.md",
    "chars": 480,
    "preview": "## zipkin-activemq Docker image\n\nThe `zipkin-activemq` testing image runs ActiveMQ Classic for [ActiveMQ collector](../."
  },
  {
    "path": "docker/test-images/zipkin-activemq/start-activemq",
    "chars": 453,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# ENTRYPOINT script that starts "
  },
  {
    "path": "docker/test-images/zipkin-cassandra/Dockerfile",
    "chars": 2555,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# java_version is used for install and run"
  },
  {
    "path": "docker/test-images/zipkin-cassandra/README.md",
    "chars": 635,
    "preview": "## zipkin-cassandra Docker image\n\nThe `zipkin-cassandra` testing image runs Cassandra 4.x initialized with Zipkin's sche"
  },
  {
    "path": "docker/test-images/zipkin-cassandra/install.sh",
    "chars": 10120,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# install script used only in bu"
  },
  {
    "path": "docker/test-images/zipkin-cassandra/start-cassandra",
    "chars": 3435,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# ENTRYPOINT script that starts "
  },
  {
    "path": "docker/test-images/zipkin-elasticsearch7/Dockerfile",
    "chars": 3041,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# java_version is used for install and run"
  },
  {
    "path": "docker/test-images/zipkin-elasticsearch7/README.md",
    "chars": 1419,
    "preview": "## zipkin-elasticsearch7 Docker image\n\nThe `zipkin-elasticsearch7` testing image runs Elasticsearch 7.x for [Elasticsear"
  },
  {
    "path": "docker/test-images/zipkin-elasticsearch7/config/elasticsearch.yml",
    "chars": 880,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\ncluster.name: \"docker-cluster\"\nnetwork.hos"
  },
  {
    "path": "docker/test-images/zipkin-elasticsearch7/config/log4j2.properties",
    "chars": 540,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nstatus = error\n\nappender.console.type = Co"
  },
  {
    "path": "docker/test-images/zipkin-elasticsearch7/start-elasticsearch",
    "chars": 1264,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# ENTRYPOINT script that starts "
  },
  {
    "path": "docker/test-images/zipkin-elasticsearch8/Dockerfile",
    "chars": 3025,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# java_version is used for install and run"
  },
  {
    "path": "docker/test-images/zipkin-elasticsearch8/README.md",
    "chars": 1422,
    "preview": "## zipkin-elasticsearch8 Docker image\n\nThe `zipkin-elasticsearch8` testing image runs Elasticsearch 8.x for [Elasticsear"
  },
  {
    "path": "docker/test-images/zipkin-elasticsearch8/start-elasticsearch",
    "chars": 1018,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# ENTRYPOINT script that starts "
  },
  {
    "path": "docker/test-images/zipkin-eureka/Dockerfile",
    "chars": 2770,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# java_version is used for install and run"
  },
  {
    "path": "docker/test-images/zipkin-eureka/README.md",
    "chars": 795,
    "preview": "## zipkin-eureka Docker image\n\nThe `zipkin-eureka` testing image runs Eureka Server for service discovery\nintegration of"
  },
  {
    "path": "docker/test-images/zipkin-eureka/pom.xml",
    "chars": 3044,
    "preview": "<!--\n\n    Copyright The OpenZipkin Authors\n    SPDX-License-Identifier: Apache-2.0\n\n-->\n<project xmlns=\"http://maven.apa"
  },
  {
    "path": "docker/test-images/zipkin-eureka/src/main/java/zipkin/test/EurekaProperties.java",
    "chars": 724,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin.test;\n\nimport org.sprin"
  },
  {
    "path": "docker/test-images/zipkin-eureka/src/main/java/zipkin/test/EurekaSecurity.java",
    "chars": 2385,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin.test;\n\nimport jakarta.s"
  },
  {
    "path": "docker/test-images/zipkin-eureka/src/main/java/zipkin/test/EurekaServer.java",
    "chars": 1037,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin.test;\n\nimport org.sprin"
  },
  {
    "path": "docker/test-images/zipkin-eureka/src/main/resources/application.yaml",
    "chars": 1116,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Add configuration to disable as much ser"
  },
  {
    "path": "docker/test-images/zipkin-eureka/start-eureka",
    "chars": 209,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# ENTRYPOINT script that starts "
  },
  {
    "path": "docker/test-images/zipkin-kafka/Dockerfile",
    "chars": 2657,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# java_version is used for install and run"
  },
  {
    "path": "docker/test-images/zipkin-kafka/README.md",
    "chars": 1182,
    "preview": "## zipkin-kafka Docker image\n\nThe `zipkin-kafka` testing image runs both Kafka+ZooKeeper for the [Kafka collector](../.."
  },
  {
    "path": "docker/test-images/zipkin-kafka/install.sh",
    "chars": 3646,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# install script used only in bu"
  },
  {
    "path": "docker/test-images/zipkin-kafka/start-kafka-zookeeper",
    "chars": 1539,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# ENTRYPOINT script that starts "
  },
  {
    "path": "docker/test-images/zipkin-mysql/Dockerfile",
    "chars": 1834,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Use latest version here: https://github."
  },
  {
    "path": "docker/test-images/zipkin-mysql/README.md",
    "chars": 526,
    "preview": "## zipkin-mysql Docker image\n\nThe `zipkin-mysql` testing image runs MySQL 10.x initialized with Zipkin's schema for\n[MyS"
  },
  {
    "path": "docker/test-images/zipkin-mysql/install.sh",
    "chars": 1879,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\n\necho \"*** Installing M"
  },
  {
    "path": "docker/test-images/zipkin-mysql/start-mysql",
    "chars": 494,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# ENTRYPOINT script that starts "
  },
  {
    "path": "docker/test-images/zipkin-opensearch2/Dockerfile",
    "chars": 2988,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# java_version is used for install and run"
  },
  {
    "path": "docker/test-images/zipkin-opensearch2/README.md",
    "chars": 1113,
    "preview": "## zipkin-opensearch2 Docker image\n\nThe `zipkin-opensearch2` testing image runs OpenSearch 2.x for [Elasticsearch storag"
  },
  {
    "path": "docker/test-images/zipkin-opensearch2/config/log4j2.properties",
    "chars": 363,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nstatus = error\n\nappender.console.type = Co"
  },
  {
    "path": "docker/test-images/zipkin-opensearch2/config/opensearch.yml",
    "chars": 708,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\ncluster.name: \"docker-cluster\"\nnetwork.hos"
  },
  {
    "path": "docker/test-images/zipkin-opensearch2/start-opensearch",
    "chars": 1613,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# ENTRYPOINT script that starts "
  },
  {
    "path": "docker/test-images/zipkin-pulsar/Dockerfile",
    "chars": 1397,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Use latest from https://hub.docker.com/r"
  },
  {
    "path": "docker/test-images/zipkin-pulsar/README.md",
    "chars": 436,
    "preview": "## zipkin-pulsar Docker image\n\nThe `zipkin-pulsar` testing image runs Pulsar for Pulsar collector integration.\n\nTo build"
  },
  {
    "path": "docker/test-images/zipkin-rabbitmq/Dockerfile",
    "chars": 1562,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Use latest from https://hub.docker.com/_"
  },
  {
    "path": "docker/test-images/zipkin-rabbitmq/README.md",
    "chars": 547,
    "preview": "## zipkin-rabbitmq Docker image\n\nThe `zipkin-rabbitmq` testing image runs `rabbitmq-server` for the\n[RabbitMQ collector]"
  },
  {
    "path": "docker/test-images/zipkin-rabbitmq/config/defs.json",
    "chars": 870,
    "preview": "{\n  \"permissions\": [\n    {\n      \"configure\": \".*\",\n      \"read\": \".*\",\n      \"user\": \"guest\",\n      \"vhost\": \"/\",\n     "
  },
  {
    "path": "docker/test-images/zipkin-rabbitmq/config/rabbitmq.conf",
    "chars": 176,
    "preview": "# Does not require management plugin to be enabled.\nloopback_users.guest = false\ndefinitions.import_backend = local_file"
  },
  {
    "path": "docker/test-images/zipkin-ui/Dockerfile",
    "chars": 3372,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Use latest version here: https://github."
  },
  {
    "path": "docker/test-images/zipkin-ui/README.md",
    "chars": 552,
    "preview": "## zipkin-ui Docker image\n\nThe `zipkin-ui` testing image contains the static parts of the Zipkin UI served directly with"
  },
  {
    "path": "docker/test-images/zipkin-ui/nginx.conf",
    "chars": 2641,
    "preview": "user  nginx nginx;\nworker_processes  2;\n\nerror_log  /dev/stdout warn;\npid        /var/run/nginx.pid;\n\ndaemon off;\n\nevent"
  },
  {
    "path": "docker/test-images/zipkin-ui/start-nginx",
    "chars": 264,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nsed \"s~proxy_pass http://localho"
  },
  {
    "path": "docker/test-images/zipkin-uiproxy/Dockerfile",
    "chars": 2297,
    "preview": "#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Use latest version here: https://github."
  },
  {
    "path": "docker/test-images/zipkin-uiproxy/README.md",
    "chars": 620,
    "preview": "## zipkin-uiproxy Docker image\n\nThe `zipkin-uiproxy` testing image proxies the Zipkin UI with NGINX.\n\nBesides norms defi"
  },
  {
    "path": "docker/test-images/zipkin-uiproxy/nginx.conf",
    "chars": 1687,
    "preview": "user  nginx nginx;\nworker_processes  2;\n\nerror_log  /dev/stdout warn;\npid        /var/run/nginx.pid;\n\ndaemon off;\n\nevent"
  },
  {
    "path": "docker/test-images/zipkin-uiproxy/start-nginx",
    "chars": 327,
    "preview": "#!/bin/sh\n#\n# Copyright The OpenZipkin Authors\n# SPDX-License-Identifier: Apache-2.0\n#\n\nsed -e \"s~proxy_pass http://loca"
  },
  {
    "path": "mvnw",
    "chars": 11172,
    "preview": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Softwa"
  },
  {
    "path": "mvnw.cmd",
    "chars": 7903,
    "preview": "@REM ----------------------------------------------------------------------------\r\n@REM Licensed to the Apache Software "
  },
  {
    "path": "pom.xml",
    "chars": 33893,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright The OpenZipkin Authors\n    SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "src/etc/header.txt",
    "chars": 69,
    "preview": "Copyright The OpenZipkin Authors\nSPDX-License-Identifier: Apache-2.0\n"
  },
  {
    "path": "zipkin/RATIONALE.md",
    "chars": 4745,
    "preview": "Zipkin Core Library Rationale\n==============\n\nMuch of this rationale is the same as [Brave](https://github.com/openzipki"
  },
  {
    "path": "zipkin/bnd.bnd",
    "chars": 279,
    "preview": "# we block import of shaded packages as maven bundle plugin analyzes the unshaded jar\nImport-Package: \\\n\t!com.google.gso"
  },
  {
    "path": "zipkin/pom.xml",
    "chars": 4052,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    Copyright The OpenZipkin Authors\n    SPDX-License-Identifier: Apache-2."
  },
  {
    "path": "zipkin/src/main/java/zipkin2/Annotation.java",
    "chars": 3116,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2;\n\nimport java.io.Objec"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/Call.java",
    "chars": 12880,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2;\n\nimport java.io.IOExc"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/Callback.java",
    "chars": 790,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2;\n\nimport zipkin2.inter"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/CheckResult.java",
    "chars": 1151,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2;\n\nimport zipkin2.inter"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/Component.java",
    "chars": 1332,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2;\n\nimport java.io.Close"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/DependencyLink.java",
    "chars": 4531,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2;\n\nimport java.io.Objec"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/Endpoint.java",
    "chars": 19738,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2;\n\nimport java.io.Objec"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/Span.java",
    "chars": 27482,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2;\n\nimport java.io.Objec"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/SpanBytesDecoderDetector.java",
    "chars": 4926,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2;\n\nimport java.nio.Byte"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/codec/BytesDecoder.java",
    "chars": 1840,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport java.ut"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/codec/BytesEncoder.java",
    "chars": 525,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport java.ut"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/codec/DependencyLinkBytesDecoder.java",
    "chars": 2210,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport java.io"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/codec/DependencyLinkBytesEncoder.java",
    "chars": 2114,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport java.ut"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/codec/Encoding.java",
    "chars": 2627,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport java.ut"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/codec/SpanBytesDecoder.java",
    "chars": 6632,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport java.ni"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/codec/SpanBytesEncoder.java",
    "chars": 3348,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.codec;\n\nimport java.ut"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/AggregateCall.java",
    "chars": 4933,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/ClosedComponentException.java",
    "chars": 487,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\npublic fina"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/DateUtil.java",
    "chars": 1151,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/DelayLimiter.java",
    "chars": 4184,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/Dependencies.java",
    "chars": 6077,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/DependencyLinker.java",
    "chars": 7965,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/FilterTraces.java",
    "chars": 1031,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/HexCodec.java",
    "chars": 1590,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\n// code ori"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/JsonCodec.java",
    "chars": 6875,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/JsonEscaper.java",
    "chars": 3038,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\npublic fina"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/Nullable.java",
    "chars": 499,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\n/**\n * Libr"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/Proto3Codec.java",
    "chars": 2013,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/Proto3Fields.java",
    "chars": 7859,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport zipk"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/Proto3SpanWriter.java",
    "chars": 2177,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/Proto3ZipkinFields.java",
    "chars": 14117,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/ReadBuffer.java",
    "chars": 10369,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/RecyclableBuffers.java",
    "chars": 989,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\npublic fina"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/SpanNode.java",
    "chars": 12142,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/ThriftCodec.java",
    "chars": 6236,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/ThriftEndpointCodec.java",
    "chars": 2898,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport zipk"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/ThriftField.java",
    "chars": 1172,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nfinal class"
  },
  {
    "path": "zipkin/src/main/java/zipkin2/internal/Trace.java",
    "chars": 6463,
    "preview": "/*\n * Copyright The OpenZipkin Authors\n * SPDX-License-Identifier: Apache-2.0\n */\npackage zipkin2.internal;\n\nimport java"
  }
]

// ... and 614 more files (download for full content)

About this extraction

This page contains the full source code of the openzipkin/zipkin GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 814 files (3.6 MB), approximately 992.6k tokens, and a symbol index with 5515 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.

Copied to clipboard!