├── examples └── cluster │ ├── .env │ ├── configs │ ├── nginx │ │ ├── jaeger-config.yaml │ │ └── nginx.conf │ ├── jaeger │ │ └── config.yaml │ ├── clickhouse-s1-r1 │ │ ├── macros.xml │ │ ├── zookeeper.xml │ │ ├── config.xml │ │ └── remote_servers.xml │ ├── clickhouse-s1-r2 │ │ ├── macros.xml │ │ ├── zookeeper.xml │ │ ├── config.xml │ │ └── remote_servers.xml │ ├── clickhouse-s2-r1 │ │ ├── macros.xml │ │ ├── zookeeper.xml │ │ ├── config.xml │ │ └── remote_servers.xml │ └── clickhouse-s2-r2 │ │ ├── macros.xml │ │ ├── zookeeper.xml │ │ ├── config.xml │ │ └── remote_servers.xml │ └── docker-compose.yaml ├── agent └── Dockerfile ├── ingester └── Dockerfile ├── collector └── Dockerfile ├── query └── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── Dockerfile └── .github └── workflows └── build.yml /examples/cluster/.env: -------------------------------------------------------------------------------- 1 | ZOOKEEPER_TAG=3.6 2 | CLICKHOUSE_TAG=22.6.3.35-alpine 3 | JAEGER_TAG=latest 4 | NGINX_TAG=1.23-alpine 5 | -------------------------------------------------------------------------------- /examples/cluster/configs/nginx/jaeger-config.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | service_name: nginx 3 | reporter: 4 | logSpans: true 5 | localAgentHostPort: 172.16.254.40:6831 6 | sampler: 7 | type: const 8 | param: 1 9 | -------------------------------------------------------------------------------- /examples/cluster/configs/jaeger/config.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | address: tcp://172.16.254.100:9009 3 | replication: true 4 | # Flush on every write for test purposes 5 | batch_write_size: 1 6 | batch_flush_interval: 1s 7 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s1-r1/macros.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | cluster 5 | 1 6 | 1 7 | 8 | 9 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s1-r2/macros.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | cluster 5 | 1 6 | 2 7 | 8 | 9 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s2-r1/macros.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | cluster 5 | 2 6 | 1 7 | 8 | 9 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s2-r2/macros.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | cluster 5 | 2 6 | 2 7 | 8 | 9 | -------------------------------------------------------------------------------- /agent/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG DOCKER_TAG levonet/jaeger:latest 2 | FROM ${DOCKER_TAG} AS all-in-one 3 | 4 | FROM debian:stretch-slim 5 | 6 | COPY --from=all-in-one /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt 7 | COPY --from=all-in-one /opt/bin/jaeger-agent /opt/bin/jaeger-agent 8 | 9 | # EXPOSE 5775/udp 10 | EXPOSE 5778 11 | EXPOSE 6831/udp 12 | EXPOSE 6832/udp 13 | EXPOSE 14271 14 | 15 | ENTRYPOINT ["/opt/bin/jaeger-agent"] 16 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s1-r1/zookeeper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 172.16.254.10 6 | 2181 7 | 8 | 9 | 172.16.254.11 10 | 2181 11 | 12 | 13 | 172.16.254.12 14 | 2181 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s1-r2/zookeeper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 172.16.254.10 6 | 2181 7 | 8 | 9 | 172.16.254.11 10 | 2181 11 | 12 | 13 | 172.16.254.12 14 | 2181 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s2-r1/zookeeper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 172.16.254.10 6 | 2181 7 | 8 | 9 | 172.16.254.11 10 | 2181 11 | 12 | 13 | 172.16.254.12 14 | 2181 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s2-r2/zookeeper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 172.16.254.10 6 | 2181 7 | 8 | 9 | 172.16.254.11 10 | 2181 11 | 12 | 13 | 172.16.254.12 14 | 2181 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s1-r1/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 172.16.254.20 4 | 5 | information 6 | 1 7 | 8 |
]]>
9 |
10 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s1-r2/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 172.16.254.21 4 | 5 | information 6 | 1 7 | 8 |
]]>
9 |
10 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s2-r1/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 172.16.254.22 4 | 5 | information 6 | 1 7 | 8 |
]]>
9 |
10 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s2-r2/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 172.16.254.23 4 | 5 | information 6 | 1 7 | 8 |
]]>
9 |
10 | -------------------------------------------------------------------------------- /ingester/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG DOCKER_TAG levonet/jaeger:latest 2 | FROM ${DOCKER_TAG} AS all-in-one 3 | 4 | FROM debian:stretch-slim 5 | 6 | COPY --from=all-in-one /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt 7 | COPY --from=all-in-one /opt/bin/jaeger-ingester /opt/bin/jaeger-ingester 8 | COPY --from=all-in-one /opt/jaeger/plugin/jaeger-clickhouse /opt/jaeger/plugin/jaeger-clickhouse 9 | COPY --from=all-in-one /opt/jaeger/config.yaml /opt/jaeger/config.yaml 10 | COPY --from=all-in-one /opt/jaeger/sqlscripts /opt/jaeger/sqlscripts 11 | 12 | ENV SPAN_STORAGE_TYPE grpc-plugin 13 | WORKDIR /opt/jaeger 14 | 15 | EXPOSE 14270 16 | EXPOSE 14271 17 | 18 | ENTRYPOINT ["/opt/bin/jaeger-ingester"] 19 | CMD ["--grpc-storage-plugin.binary", "plugin/jaeger-clickhouse", "--grpc-storage-plugin.configuration-file", "config.yaml"] 20 | -------------------------------------------------------------------------------- /collector/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG DOCKER_TAG levonet/jaeger:latest 2 | FROM ${DOCKER_TAG} AS all-in-one 3 | 4 | FROM debian:stretch-slim 5 | 6 | COPY --from=all-in-one /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt 7 | COPY --from=all-in-one /opt/bin/jaeger-collector /opt/bin/jaeger-collector 8 | COPY --from=all-in-one /opt/jaeger/plugin/jaeger-clickhouse /opt/jaeger/plugin/jaeger-clickhouse 9 | COPY --from=all-in-one /opt/jaeger/config.yaml /opt/jaeger/config.yaml 10 | COPY --from=all-in-one /opt/jaeger/sqlscripts /opt/jaeger/sqlscripts 11 | 12 | ENV SPAN_STORAGE_TYPE grpc-plugin 13 | WORKDIR /opt/jaeger 14 | 15 | EXPOSE 14250 16 | EXPOSE 14268 17 | EXPOSE 14269 18 | 19 | ENTRYPOINT ["/opt/bin/jaeger-collector"] 20 | CMD ["--grpc-storage-plugin.binary", "plugin/jaeger-clickhouse", "--grpc-storage-plugin.configuration-file", "config.yaml"] 21 | -------------------------------------------------------------------------------- /query/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG DOCKER_TAG levonet/jaeger:latest 2 | FROM ${DOCKER_TAG} AS all-in-one 3 | 4 | FROM debian:stretch-slim 5 | 6 | COPY --from=all-in-one /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt 7 | COPY --from=all-in-one /opt/bin/jaeger-query /opt/bin/jaeger-query 8 | COPY --from=all-in-one /opt/jaeger/ui /opt/jaeger/ui 9 | COPY --from=all-in-one /opt/jaeger/jaeger-ui.json /opt/jaeger/jaeger-ui.json 10 | COPY --from=all-in-one /opt/jaeger/plugin/jaeger-clickhouse /opt/jaeger/plugin/jaeger-clickhouse 11 | COPY --from=all-in-one /opt/jaeger/config.yaml /opt/jaeger/config.yaml 12 | COPY --from=all-in-one /opt/jaeger/sqlscripts /opt/jaeger/sqlscripts 13 | 14 | ENV SPAN_STORAGE_TYPE grpc-plugin 15 | WORKDIR /opt/jaeger 16 | 17 | EXPOSE 16686 18 | EXPOSE 16687 19 | 20 | ENTRYPOINT ["/opt/bin/jaeger-query"] 21 | CMD ["--query.static-files", "ui", "--query.ui-config", "jaeger-ui.json", "--grpc-storage-plugin.binary", "plugin/jaeger-clickhouse", "--grpc-storage-plugin.configuration-file", "config.yaml"] 22 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s1-r1/remote_servers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | true 7 | 8 | 172.16.254.20 9 | 9000 10 | 11 | 12 | 172.16.254.21 13 | 9000 14 | 15 | 16 | 17 | true 18 | 19 | 172.16.254.22 20 | 9000 21 | 22 | 23 | 172.16.254.23 24 | 9000 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s1-r2/remote_servers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | true 7 | 8 | 172.16.254.20 9 | 9000 10 | 11 | 12 | 172.16.254.21 13 | 9000 14 | 15 | 16 | 17 | true 18 | 19 | 172.16.254.22 20 | 9000 21 | 22 | 23 | 172.16.254.23 24 | 9000 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s2-r1/remote_servers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | true 7 | 8 | 172.16.254.20 9 | 9000 10 | 11 | 12 | 172.16.254.21 13 | 9000 14 | 15 | 16 | 17 | true 18 | 19 | 172.16.254.22 20 | 9000 21 | 22 | 23 | 172.16.254.23 24 | 9000 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /examples/cluster/configs/clickhouse-s2-r2/remote_servers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | true 7 | 8 | 172.16.254.20 9 | 9000 10 | 11 | 12 | 172.16.254.21 13 | 9000 14 | 15 | 16 | 17 | true 18 | 19 | 172.16.254.22 20 | 9000 21 | 22 | 23 | 172.16.254.23 24 | 9000 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Pavlo Bashynskyi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /examples/cluster/configs/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | 4 | error_log /var/log/nginx/error.log warn; 5 | pid /var/run/nginx.pid; 6 | 7 | load_module modules/ngx_http_opentracing_module.so; 8 | 9 | events {} 10 | 11 | # Clickhouse TCP balancer 12 | stream { 13 | upstream clickhouse_backend { 14 | server 172.16.254.20:9000; 15 | server 172.16.254.21:9000; 16 | server 172.16.254.22:9000; 17 | server 172.16.254.23:9000; 18 | } 19 | 20 | server { 21 | listen 9009; 22 | 23 | proxy_pass clickhouse_backend; 24 | } 25 | } 26 | 27 | # Jaeger-query balancer 28 | http { 29 | include /etc/nginx/mime.types; 30 | default_type application/octet-stream; 31 | 32 | opentracing_load_tracer /usr/local/lib/libjaegertracing_plugin.so /etc/nginx/jaeger-config.yaml; 33 | 34 | upstream jaeger_query_backend { 35 | server 172.16.254.50:16686; 36 | server 172.16.254.51:16686; 37 | } 38 | 39 | server { 40 | listen 8080; 41 | 42 | opentracing on; 43 | opentracing_tag bytes_sent $bytes_sent; 44 | opentracing_tag request_time $request_time; 45 | opentracing_tag upstream_addr $upstream_addr; 46 | opentracing_tag upstream_bytes_received $upstream_bytes_received; 47 | opentracing_tag upstream_cache_status $upstream_cache_status; 48 | opentracing_tag upstream_connect_time $upstream_connect_time; 49 | opentracing_tag upstream_header_time $upstream_header_time; 50 | opentracing_tag upstream_response_time $upstream_response_time; 51 | 52 | location / { 53 | opentracing_operation_name $uri; 54 | opentracing_propagate_context; 55 | 56 | proxy_pass http://jaeger_query_backend; 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | JAEGER_VERSION?=main 2 | JAEGER_CLICKHOUSE_VERSION?=main 3 | IMAGE_VERSION?=latest 4 | IMAGE_ALL_IN_ONE_TAG=levonet/jaeger:$(IMAGE_VERSION) 5 | 6 | .PHONY: all 7 | all: build push 8 | 9 | .PHONY: build 10 | build: build-jaeger build-jaeger-agent build-jaeger-collector build-jaeger-ingester build-jaeger-query 11 | 12 | .PHONY: build-jaeger 13 | build-jaeger: 14 | docker build \ 15 | --progress plain \ 16 | --build-arg JAEGER_VERSION=$(JAEGER_VERSION) \ 17 | --build-arg JAEGER_CLICKHOUSE_VERSION=$(JAEGER_CLICKHOUSE_VERSION) \ 18 | -t $(IMAGE_ALL_IN_ONE_TAG) \ 19 | . 20 | 21 | .PHONY: build-jaeger-agent 22 | build-jaeger-agent: 23 | docker build \ 24 | --progress plain \ 25 | --build-arg DOCKER_TAG=$(IMAGE_ALL_IN_ONE_TAG) \ 26 | -t levonet/jaeger-agent:$(IMAGE_VERSION) \ 27 | agent 28 | 29 | .PHONY: build-jaeger-collector 30 | build-jaeger-collector: 31 | docker build \ 32 | --progress plain \ 33 | --build-arg DOCKER_TAG=$(IMAGE_ALL_IN_ONE_TAG) \ 34 | -t levonet/jaeger-collector:$(IMAGE_VERSION) \ 35 | collector 36 | 37 | .PHONY: build-jaeger-ingester 38 | build-jaeger-ingester: 39 | docker build \ 40 | --progress plain \ 41 | --build-arg DOCKER_TAG=$(IMAGE_ALL_IN_ONE_TAG) \ 42 | -t levonet/jaeger-ingester:$(IMAGE_VERSION) \ 43 | ingester 44 | 45 | .PHONY: build-jaeger-query 46 | build-jaeger-query: 47 | docker build \ 48 | --progress plain \ 49 | --build-arg DOCKER_TAG=$(IMAGE_ALL_IN_ONE_TAG) \ 50 | -t levonet/jaeger-query:$(IMAGE_VERSION) \ 51 | query 52 | 53 | .PHONY: push 54 | push: push-jaeger push-jaeger-agent push-jaeger-collector push-jaeger-ingester push-jaeger-query 55 | 56 | .PHONY: push-jaeger 57 | push-jaeger: 58 | docker push $(IMAGE_ALL_IN_ONE_TAG) 59 | 60 | .PHONY: push-jaeger-agent 61 | push-jaeger-agent: 62 | docker push levonet/jaeger-agent:$(IMAGE_VERSION) 63 | 64 | .PHONY: push-jaeger-collector 65 | push-jaeger-collector: 66 | docker push levonet/jaeger-collector:$(IMAGE_VERSION) 67 | 68 | .PHONY: push-jaeger-ingester 69 | push-jaeger-ingester: 70 | docker push levonet/jaeger-ingester:$(IMAGE_VERSION) 71 | 72 | .PHONY: push-jaeger-query 73 | push-jaeger-query: 74 | docker push levonet/jaeger-query:$(IMAGE_VERSION) 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Jaeger Docker images 2 | 3 | These Jaeger Docker images contain a [clickhouse plugin](https://github.com/jaegertracing/jaeger-clickhouse). 4 | 5 | - [levonet/jaeger](https://hub.docker.com/r/levonet/jaeger) (all-in-one) — Designed for quick local testing. It launches the Jaeger UI, collector, query, and agent. 6 | - [levonet/jaeger-agent](https://hub.docker.com/r/levonet/jaeger-agent) — Receives spans from Jaeger clients and forwards to collector. Designed to run as a sidecar or a host agent. 7 | - [levonet/jaeger-collector](https://hub.docker.com/r/levonet/jaeger-collector) — Receives spans from agents or directly from clients and saves them in persistent storage. 8 | - [levonet/jaeger-ingester](https://hub.docker.com/r/levonet/jaeger-ingester) — An alternative to collector; reads spans from Kafka topic and saves them to storage. 9 | - [levonet/jaeger-query](https://hub.docker.com/r/levonet/jaeger-query) — Serves Jaeger UI and an API that retrieves traces from storage. 10 | 11 | # Build and publish 12 | 13 | The `make` command builds and publishes the latest state of the [jaegertracing/jaeger](https://github.com/jaegertracing/jaeger) repository with the [clickhouse plugin](https://github.com/jaegertracing/jaeger-clickhouse). 14 | You can run specific build and publish steps with the appropriate `make build` and` make push` commands. 15 | 16 | In order to build and publish a specific version, you need to define the version in environment variables. 17 | 18 | ```sh 19 | JAEGER_VERSION=v1.36.0 JAEGER_CLICKHOUSE_VERSION=0.11.0 IMAGE_VERSION=latest make build 20 | IMAGE_VERSION=latest make push 21 | ``` 22 | 23 | # Example 24 | 25 | Run the Clickhouse claster (2 shards x 2 replicas) with the Jaeger cluster: 26 | 27 | ```sh 28 | cd examples/cluster 29 | docker-compose up 30 | ``` 31 | 32 | Open the link [0.0.0.0:8080](http://0.0.0.0:8080) in your browser and test it. 33 | 34 | # Image Variants 35 | 36 | The `levonet/jaeger*` images come in many flavors, each designed for a specific use case. 37 | 38 | ## `levonet/jaeger*:` 39 | 40 | This is the defacto image. If you are unsure about what your needs are, you probably want to use this one. 41 | It is designed to be used both as a throw away container (mount your source code and start the container to start your app), as well as the base to build other images off of. 42 | 43 | Some of these tags may have names like buster in them. These are the suite code names for releases of [Debian](https://wiki.debian.org/DebianReleases) and indicate which release the image is based on. If your image needs to install any additional packages beyond what comes with the image, you'll likely want to specify one of these explicitly to minimize breakage when there are new releases of Debian. 44 | 45 | ## License 46 | 47 | View [license information](https://github.com/jaegertracing/jaeger/blob/main/LICENSE) for the software contained in this image or [license information](https://github.com/levonet/docker-jaeger/blob/master/LICENSE) for the Jaeger Dockerfile. 48 | 49 | As with all Docker images, these likely also contain other software which may be under other licenses (such as Bash, etc from the base distribution, along with any direct or indirect dependencies of the primary software being contained). 50 | 51 | As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within. 52 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.17-stretch AS build 2 | 3 | ARG JAEGER_VERSION main 4 | ARG JAEGER_CLICKHOUSE_VERSION main 5 | ENV GOBUILD "go build -ldflags '-linkmode=external' -trimpath" 6 | 7 | RUN set -eux \ 8 | && apt-get update \ 9 | && apt-get install -y --no-install-recommends \ 10 | binutils \ 11 | ca-certificates \ 12 | curl \ 13 | git \ 14 | make 15 | 16 | RUN set -eux \ 17 | && git clone --depth=1 --single-branch -b ${JAEGER_VERSION} \ 18 | https://github.com/jaegertracing/jaeger.git \ 19 | /go/src/github.com/jaegertracing/jaeger \ 20 | && cd /go/src/github.com/jaegertracing/jaeger \ 21 | # 22 | && git submodule update --init --recursive \ 23 | && curl -L https://raw.githubusercontent.com/tj/n/master/bin/n -o n \ 24 | && bash n lts \ 25 | && curl -o- -L https://yarnpkg.com/install.sh | bash \ 26 | && export PATH="$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH" \ 27 | && export GOOS="$(go env GOOS)" \ 28 | && go install github.com/mjibson/esc@v0.2.0 \ 29 | && make build-ui \ 30 | # 31 | && make -e build-platform-binaries \ 32 | && strip \ 33 | cmd/all-in-one/all-in-one-linux-amd64 \ 34 | cmd/agent/agent-linux-amd64 \ 35 | cmd/anonymizer/anonymizer-linux-amd64 \ 36 | cmd/collector/collector-linux-amd64 \ 37 | cmd/ingester/ingester-linux-amd64 \ 38 | cmd/query/query-linux-amd64 \ 39 | cmd/tracegen/tracegen-linux-amd64 40 | 41 | RUN set -eux \ 42 | && git clone --depth=1 --single-branch -b ${JAEGER_CLICKHOUSE_VERSION} \ 43 | https://github.com/jaegertracing/jaeger-clickhouse.git \ 44 | /go/src/github.com/jaegertracing/jaeger-clickhouse \ 45 | && cd /go/src/github.com/jaegertracing/jaeger-clickhouse \ 46 | && make -e build \ 47 | && strip \ 48 | jaeger-clickhouse-linux-amd64 49 | 50 | FROM debian:stretch-slim 51 | 52 | COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt 53 | COPY --from=build /go/src/github.com/jaegertracing/jaeger/cmd/agent/agent-linux-amd64 /opt/bin/jaeger-agent 54 | COPY --from=build /go/src/github.com/jaegertracing/jaeger/cmd/all-in-one/all-in-one-linux-amd64 /opt/bin/jaeger 55 | COPY --from=build /go/src/github.com/jaegertracing/jaeger/cmd/anonymizer/anonymizer-linux-amd64 /opt/bin/anonymizer 56 | COPY --from=build /go/src/github.com/jaegertracing/jaeger/cmd/collector/collector-linux-amd64 /opt/bin/jaeger-collector 57 | COPY --from=build /go/src/github.com/jaegertracing/jaeger/cmd/ingester/ingester-linux-amd64 /opt/bin/jaeger-ingester 58 | COPY --from=build /go/src/github.com/jaegertracing/jaeger/cmd/query/query-linux-amd64 /opt/bin/jaeger-query 59 | COPY --from=build /go/src/github.com/jaegertracing/jaeger/cmd/tracegen/tracegen-linux-amd64 /opt/bin/tracegen 60 | COPY --from=build /go/src/github.com/jaegertracing/jaeger/jaeger-ui/packages/jaeger-ui/build /opt/jaeger/ui 61 | COPY --from=build /go/src/github.com/jaegertracing/jaeger-clickhouse/jaeger-ui.json /opt/jaeger/jaeger-ui.json 62 | COPY --from=build /go/src/github.com/jaegertracing/jaeger-clickhouse/jaeger-clickhouse-linux-amd64 /opt/jaeger/plugin/jaeger-clickhouse 63 | COPY --from=build /go/src/github.com/jaegertracing/jaeger-clickhouse/config.yaml /opt/jaeger/config.yaml 64 | COPY --from=build /go/src/github.com/jaegertracing/jaeger-clickhouse/sqlscripts /opt/jaeger/sqlscripts 65 | 66 | ENV SPAN_STORAGE_TYPE grpc-plugin 67 | WORKDIR /opt/jaeger 68 | 69 | EXPOSE 6831/udp 70 | EXPOSE 6832/udp 71 | EXPOSE 5778 72 | EXPOSE 14268 73 | EXPOSE 14250 74 | EXPOSE 16686 75 | 76 | VOLUME ["/tmp"] 77 | 78 | CMD ["/opt/bin/jaeger", "--query.static-files", "ui", "--query.ui-config", "jaeger-ui.json", "--grpc-storage-plugin.binary", "plugin/jaeger-clickhouse", "--grpc-storage-plugin.configuration-file", "config.yaml"] 79 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | tags: 8 | - v* 9 | pull_request: 10 | 11 | jobs: 12 | image: 13 | runs-on: ubuntu-latest 14 | env: 15 | DOCKERHUB_USERNAME: levonet 16 | METADATA_TAGS: | 17 | type=ref,event=branch 18 | type=ref,event=pr 19 | type=semver,pattern={{version}} 20 | type=match,pattern=v(\d+.\d+.\d+),group=1 21 | METADATA_FLAVOR: | 22 | latest=${{ github.ref_type == 'tag' }} 23 | suffix=-stretch,onlatest=false 24 | steps: 25 | 26 | - name: Checkout 27 | uses: actions/checkout@v2 28 | 29 | - name: Prepare tags 30 | if: ${{ github.ref_type == 'tag' }} 31 | id: tags 32 | uses: actions/github-script@v4 33 | with: 34 | script: | 35 | const tags = context.ref.split('/').slice(2).join('/').split('-') 36 | core.setOutput('jaeger', tags[0]) 37 | core.setOutput('jaeger-clickhouse', tags[1]) 38 | 39 | - name: Docker meta jaeger 40 | id: meta-jaeger 41 | uses: docker/metadata-action@v3 42 | with: 43 | images: levonet/jaeger 44 | tags: ${{ env.METADATA_TAGS }} 45 | flavor: ${{ env.METADATA_FLAVOR }} 46 | 47 | - name: Docker meta jaeger-agent 48 | id: meta-jaeger-agent 49 | uses: docker/metadata-action@v3 50 | with: 51 | images: levonet/jaeger-agent 52 | tags: ${{ env.METADATA_TAGS }} 53 | flavor: ${{ env.METADATA_FLAVOR }} 54 | 55 | - name: Docker meta jaeger-collector 56 | id: meta-jaeger-collector 57 | uses: docker/metadata-action@v3 58 | with: 59 | images: levonet/jaeger-collector 60 | tags: ${{ env.METADATA_TAGS }} 61 | flavor: ${{ env.METADATA_FLAVOR }} 62 | 63 | - name: Docker meta jaeger-ingester 64 | id: meta-jaeger-ingester 65 | uses: docker/metadata-action@v3 66 | with: 67 | images: levonet/jaeger-ingester 68 | tags: ${{ env.METADATA_TAGS }} 69 | flavor: ${{ env.METADATA_FLAVOR }} 70 | 71 | - name: Docker meta jaeger-query 72 | id: meta-jaeger-query 73 | uses: docker/metadata-action@v3 74 | with: 75 | images: levonet/jaeger-query 76 | tags: ${{ env.METADATA_TAGS }} 77 | flavor: ${{ env.METADATA_FLAVOR }} 78 | 79 | - name: Login to DockerHub 80 | uses: docker/login-action@v1 81 | with: 82 | username: ${{ env.DOCKERHUB_USERNAME }} 83 | password: ${{ secrets.DOCKERHUB_TOKEN }} 84 | 85 | - name: Build and export jaeger to Docker 86 | uses: docker/build-push-action@v2 87 | with: 88 | context: . 89 | build-args: | 90 | JAEGER_VERSION=${{ steps.tags.outputs.jaeger || 'main' }} 91 | JAEGER_CLICKHOUSE_VERSION=${{ steps.tags.outputs.jaeger-clickhouse || 'main' }} 92 | push: true 93 | tags: ${{ steps.meta-jaeger.outputs.tags }} 94 | labels: ${{ steps.meta-jaeger.outputs.labels }} 95 | 96 | - name: Build and export jaeger-agent to Docker 97 | uses: docker/build-push-action@v2 98 | with: 99 | context: agent 100 | build-args: | 101 | DOCKER_TAG=${{ fromJSON(steps.meta-jaeger.outputs.json).tags[0] }} 102 | push: true 103 | tags: ${{ steps.meta-jaeger-agent.outputs.tags }} 104 | labels: ${{ steps.meta-jaeger-agent.outputs.labels }} 105 | 106 | - name: Build and export jaeger-collector to Docker 107 | uses: docker/build-push-action@v2 108 | with: 109 | context: collector 110 | build-args: | 111 | DOCKER_TAG=${{ fromJSON(steps.meta-jaeger.outputs.json).tags[0] }} 112 | push: true 113 | tags: ${{ steps.meta-jaeger-collector.outputs.tags }} 114 | labels: ${{ steps.meta-jaeger-collector.outputs.labels }} 115 | 116 | - name: Build and export jaeger-ingester to Docker 117 | uses: docker/build-push-action@v2 118 | with: 119 | context: ingester 120 | build-args: | 121 | DOCKER_TAG=${{ fromJSON(steps.meta-jaeger.outputs.json).tags[0] }} 122 | push: true 123 | tags: ${{ steps.meta-jaeger-ingester.outputs.tags }} 124 | labels: ${{ steps.meta-jaeger-ingester.outputs.labels }} 125 | 126 | - name: Build and export jaeger-query to Docker 127 | uses: docker/build-push-action@v2 128 | with: 129 | context: query 130 | build-args: | 131 | DOCKER_TAG=${{ fromJSON(steps.meta-jaeger.outputs.json).tags[0] }} 132 | push: true 133 | tags: ${{ steps.meta-jaeger-query.outputs.tags }} 134 | labels: ${{ steps.meta-jaeger-query.outputs.labels }} 135 | 136 | - name: Docker Hub Description for jaeger 137 | if: ${{ github.ref_name == github.event.repository.default_branch }} 138 | uses: peter-evans/dockerhub-description@v2 139 | with: 140 | username: ${{ env.DOCKERHUB_USERNAME }} 141 | password: ${{ secrets.DOCKERHUB_PASSWORD }} 142 | repository: levonet/jaeger 143 | 144 | - name: Docker Hub Description for jaeger-agent 145 | if: ${{ github.ref_name == github.event.repository.default_branch }} 146 | uses: peter-evans/dockerhub-description@v2 147 | with: 148 | username: ${{ env.DOCKERHUB_USERNAME }} 149 | password: ${{ secrets.DOCKERHUB_PASSWORD }} 150 | repository: levonet/jaeger-agent 151 | 152 | - name: Docker Hub Description for jaeger-collector 153 | if: ${{ github.ref_name == github.event.repository.default_branch }} 154 | uses: peter-evans/dockerhub-description@v2 155 | with: 156 | username: ${{ env.DOCKERHUB_USERNAME }} 157 | password: ${{ secrets.DOCKERHUB_PASSWORD }} 158 | repository: levonet/jaeger-collector 159 | 160 | - name: Docker Hub Description for jaeger-ingester 161 | if: ${{ github.ref_name == github.event.repository.default_branch }} 162 | uses: peter-evans/dockerhub-description@v2 163 | with: 164 | username: ${{ env.DOCKERHUB_USERNAME }} 165 | password: ${{ secrets.DOCKERHUB_PASSWORD }} 166 | repository: levonet/jaeger-ingester 167 | 168 | - name: Docker Hub Description for jaeger-query 169 | if: ${{ github.ref_name == github.event.repository.default_branch }} 170 | uses: peter-evans/dockerhub-description@v2 171 | with: 172 | username: ${{ env.DOCKERHUB_USERNAME }} 173 | password: ${{ secrets.DOCKERHUB_PASSWORD }} 174 | repository: levonet/jaeger-query 175 | -------------------------------------------------------------------------------- /examples/cluster/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | 3 | services: 4 | zookeeper-1: 5 | image: zookeeper:${ZOOKEEPER_TAG} 6 | ports: 7 | - "2181:2181" 8 | environment: 9 | ZOO_MY_ID: "1" 10 | ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=172.16.254.11:2888:3888;2181 server.3=172.16.254.12:2888:3888;2181 11 | volumes: 12 | - data-zookeeper-1:/data 13 | - datalog-zookeeper-1:/datalog 14 | networks: 15 | jaeger-cluster: 16 | ipv4_address: 172.16.254.10 17 | 18 | zookeeper-2: 19 | image: zookeeper:${ZOOKEEPER_TAG} 20 | ports: 21 | - "2182:2181" 22 | environment: 23 | ZOO_MY_ID: "2" 24 | ZOO_SERVERS: server.1=172.16.254.10:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=172.16.254.12:2888:3888;2181 25 | volumes: 26 | - data-zookeeper-2:/data 27 | - datalog-zookeeper-2:/datalog 28 | networks: 29 | jaeger-cluster: 30 | ipv4_address: 172.16.254.11 31 | 32 | zookeeper-3: 33 | image: zookeeper:${ZOOKEEPER_TAG} 34 | ports: 35 | - "2183:2181" 36 | environment: 37 | ZOO_MY_ID: "3" 38 | ZOO_SERVERS: server.1=172.16.254.10:2888:3888;2181 server.2=172.16.254.11:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181 39 | volumes: 40 | - data-zookeeper-3:/data 41 | - datalog-zookeeper-3:/datalog 42 | networks: 43 | jaeger-cluster: 44 | ipv4_address: 172.16.254.12 45 | 46 | clickhouse-s1-r1: 47 | image: clickhouse/clickhouse-server:${CLICKHOUSE_TAG} 48 | ports: 49 | - "8123:8123" 50 | - "9000:9000" 51 | volumes: 52 | - ./configs/clickhouse-s1-r1:/etc/clickhouse-server/conf.d 53 | - data-clickhouse-s1-r1:/var/lib/clickhouse 54 | restart: on-failure 55 | networks: 56 | jaeger-cluster: 57 | ipv4_address: 172.16.254.20 58 | depends_on: &clickhouse_depends_on 59 | - zookeeper-1 60 | - zookeeper-2 61 | - zookeeper-3 62 | 63 | clickhouse-s1-r2: 64 | image: clickhouse/clickhouse-server:${CLICKHOUSE_TAG} 65 | ports: 66 | - "8124:8123" 67 | - "9001:9000" 68 | volumes: 69 | - ./configs/clickhouse-s1-r2:/etc/clickhouse-server/conf.d 70 | - data-clickhouse-s1-r2:/var/lib/clickhouse 71 | restart: on-failure 72 | networks: 73 | jaeger-cluster: 74 | ipv4_address: 172.16.254.21 75 | depends_on: *clickhouse_depends_on 76 | 77 | clickhouse-s2-r1: 78 | image: clickhouse/clickhouse-server:${CLICKHOUSE_TAG} 79 | ports: 80 | - "8125:8123" 81 | - "9002:9000" 82 | volumes: 83 | - ./configs/clickhouse-s2-r1:/etc/clickhouse-server/conf.d 84 | - data-clickhouse-s2-r1:/var/lib/clickhouse 85 | restart: on-failure 86 | networks: 87 | jaeger-cluster: 88 | ipv4_address: 172.16.254.22 89 | depends_on: *clickhouse_depends_on 90 | 91 | clickhouse-s2-r2: 92 | image: clickhouse/clickhouse-server:${CLICKHOUSE_TAG} 93 | ports: 94 | - "8126:8123" 95 | - "9003:9000" 96 | volumes: 97 | - ./configs/clickhouse-s2-r2:/etc/clickhouse-server/conf.d 98 | - data-clickhouse-s2-r2:/var/lib/clickhouse 99 | restart: on-failure 100 | networks: 101 | jaeger-cluster: 102 | ipv4_address: 172.16.254.23 103 | depends_on: *clickhouse_depends_on 104 | 105 | nginx: 106 | image: levonet/nginx:${NGINX_TAG} 107 | expose: 108 | - "8080" 109 | - "9009" 110 | ports: 111 | - "8080:8080" 112 | - "9009:9009" 113 | volumes: 114 | - ./configs/nginx/nginx.conf:/etc/nginx/nginx.conf 115 | - ./configs/nginx/jaeger-config.yaml:/etc/nginx/jaeger-config.yaml 116 | restart: on-failure 117 | networks: 118 | jaeger-cluster: 119 | ipv4_address: 172.16.254.100 120 | depends_on: &jaeger_depends_on 121 | - clickhouse-s1-r1 122 | - clickhouse-s1-r2 123 | - clickhouse-s2-r1 124 | - clickhouse-s2-r2 125 | 126 | jaeger-collector-1: 127 | image: levonet/jaeger-collector:${JAEGER_TAG} 128 | ports: 129 | - "14250:14250" # accept model.proto 130 | - "14268:14268" # accept jaeger.thrift directly from clients 131 | - "14269:14269" # admin (health check, /metrics, etc.) 132 | volumes: 133 | - ./configs/jaeger/config.yaml:/opt/jaeger/config.yaml 134 | restart: on-failure 135 | networks: 136 | jaeger-cluster: 137 | ipv4_address: 172.16.254.30 138 | depends_on: *jaeger_depends_on 139 | 140 | jaeger-collector-2: 141 | image: levonet/jaeger-collector:${JAEGER_TAG} 142 | ports: 143 | - "24250:14250" # accept model.proto 144 | - "24268:14268" # accept jaeger.thrift directly from clients 145 | - "24269:14269" # admin (health check, /metrics, etc.) 146 | volumes: 147 | - ./configs/jaeger/config.yaml:/opt/jaeger/config.yaml 148 | restart: on-failure 149 | networks: 150 | jaeger-cluster: 151 | ipv4_address: 172.16.254.31 152 | depends_on: *jaeger_depends_on 153 | 154 | jaeger-agent: 155 | image: levonet/jaeger-agent:${JAEGER_TAG} 156 | command: --reporter.grpc.host-port=172.16.254.30:14250,172.16.254.31:14250 157 | ports: 158 | - "6831:6831/udp" # accept jaeger.thrift over compact thrift protocol 159 | - "6832:6832/udp" # accept jaeger.thrift over binary thrift protocol 160 | - "5778:5778" # serve configs 161 | - "14271:14271" # admin (health check, /metrics, etc.) 162 | restart: on-failure 163 | networks: 164 | jaeger-cluster: 165 | ipv4_address: 172.16.254.40 166 | depends_on: 167 | - jaeger-collector-1 168 | - jaeger-collector-2 169 | 170 | jaeger-query-1: 171 | image: levonet/jaeger-query:${JAEGER_TAG} 172 | environment: 173 | JAEGER_AGENT_HOST: 172.16.254.40 174 | JAEGER_AGENT_PORT: "6831" 175 | ports: 176 | - "16686:16686" # serve frontend 177 | - "16687:16687" # admin (health check, /metrics, etc.) 178 | volumes: 179 | - ./configs/jaeger/config.yaml:/opt/jaeger/config.yaml 180 | restart: on-failure 181 | networks: 182 | jaeger-cluster: 183 | ipv4_address: 172.16.254.50 184 | depends_on: *jaeger_depends_on 185 | 186 | jaeger-query-2: 187 | image: levonet/jaeger-query:${JAEGER_TAG} 188 | environment: 189 | JAEGER_AGENT_HOST: 172.16.254.40 190 | JAEGER_AGENT_PORT: "6831" 191 | ports: 192 | - "26686:16686" # serve frontend 193 | - "26687:16687" # admin (health check, /metrics, etc.) 194 | volumes: 195 | - ./configs/jaeger/config.yaml:/opt/jaeger/config.yaml 196 | restart: on-failure 197 | networks: 198 | jaeger-cluster: 199 | ipv4_address: 172.16.254.51 200 | depends_on: *jaeger_depends_on 201 | 202 | networks: 203 | jaeger-cluster: 204 | ipam: 205 | driver: default 206 | config: 207 | - subnet: "172.16.254.0/24" 208 | 209 | volumes: 210 | data-zookeeper-1: 211 | datalog-zookeeper-1: 212 | data-zookeeper-2: 213 | datalog-zookeeper-2: 214 | data-zookeeper-3: 215 | datalog-zookeeper-3: 216 | data-clickhouse-s1-r1: 217 | data-clickhouse-s1-r2: 218 | data-clickhouse-s2-r1: 219 | data-clickhouse-s2-r2: 220 | --------------------------------------------------------------------------------