From fe8b090911ad26222bbb023151cccdb6103f7bfe Mon Sep 17 00:00:00 2001 From: Amine Benseddik Date: Wed, 27 Nov 2019 16:00:07 +0100 Subject: [PATCH] Elastic APM tracer implementation --- docs/content/observability/tracing/elastic.md | 88 +++++++++++++++++++ .../reference/static-configuration/cli-ref.md | 12 +++ .../reference/static-configuration/env-ref.md | 12 +++ .../reference/static-configuration/file.toml | 4 + .../reference/static-configuration/file.yaml | 4 + docs/mkdocs.yml | 1 + go.mod | 2 + go.sum | 26 ++++++ pkg/config/static/static_config.go | 2 + pkg/server/middleware/chainbuilder.go | 8 ++ pkg/tracing/elastic/elastic.go | 64 ++++++++++++++ 11 files changed, 223 insertions(+) create mode 100644 docs/content/observability/tracing/elastic.md create mode 100644 pkg/tracing/elastic/elastic.go diff --git a/docs/content/observability/tracing/elastic.md b/docs/content/observability/tracing/elastic.md new file mode 100644 index 000000000..97042d73f --- /dev/null +++ b/docs/content/observability/tracing/elastic.md @@ -0,0 +1,88 @@ +# Elastic + +To enable the Elastic: + +```toml tab="File (TOML)" +[tracing] + [tracing.elastic] +``` + +```yaml tab="File (YAML)" +tracing: + elastic: {} +``` + +```bash tab="CLI" +--tracing.elastic=true +``` + +#### `serverURL` + +_Optional, Default="http://localhost:8200"_ + +APM ServerURL is the URL of the Elastic APM server. + +```toml tab="File (TOML)" +[tracing] + [tracing.elastic] + serverURL = "http://apm:8200" +``` + +```yaml tab="File (YAML)" +tracing: + elastic: + serverURL: "http://apm:8200" +``` + +```bash tab="CLI" +--tracing.elastic.serverurl="http://apm:8200" +``` + +#### `secretToken` + +_Optional, Default=""_ + +APM Secret Token is the token used to connect to Elastic APM Server. + +```toml tab="File (TOML)" +[tracing] + [tracing.elastic] + secretToken = "mytoken" +``` + +```yaml tab="File (YAML)" +tracing: + elastic: + secretToken: "mytoken" +``` + +```bash tab="CLI" +--tracing.elastic.secrettoken="mytoken" +``` + +#### `serviceEnvironment` + +_Optional, Default=""_ + +APM Service Environment is the name of the environment Traefik is deployed in, e.g. `production` or `staging`. + +```toml tab="File (TOML)" +[tracing] + [tracing.elastic] + serviceEnvironment = "production" +``` + +```yaml tab="File (YAML)" +tracing: + elastic: + serviceEnvironment: "production" +``` + +```bash tab="CLI" +--tracing.elastic.serviceenvironment="production" +``` + +### Further + +Additional configuration of Elastic APM Go agent can be done using environment variables. +See [APM Go agent reference](https://www.elastic.co/guide/en/apm/agent/go/current/configuration.html). diff --git a/docs/content/reference/static-configuration/cli-ref.md b/docs/content/reference/static-configuration/cli-ref.md index 2e9dd6a0d..2d80ee2e2 100644 --- a/docs/content/reference/static-configuration/cli-ref.md +++ b/docs/content/reference/static-configuration/cli-ref.md @@ -570,6 +570,18 @@ Specifies the header name that will be used to store the sampling priority. `--tracing.datadog.traceidheadername`: Specifies the header name that will be used to store the trace ID. +`--tracing.elastic`: +Settings for Elastic. (Default: ```false```) + +`--tracing.elastic.secrettoken`: +Set the token used to connect to Elastic APM Server. + +`--tracing.elastic.serverurl`: +Set the URL of the Elastic APM server. + +`--tracing.elastic.serviceenvironment`: +Set the name of the environment Traefik is deployed in, e.g. 'production' or 'staging'. + `--tracing.haystack`: Settings for Haystack. (Default: ```false```) diff --git a/docs/content/reference/static-configuration/env-ref.md b/docs/content/reference/static-configuration/env-ref.md index a75866b08..8689d7bc4 100644 --- a/docs/content/reference/static-configuration/env-ref.md +++ b/docs/content/reference/static-configuration/env-ref.md @@ -570,6 +570,18 @@ Specifies the header name that will be used to store the sampling priority. `TRAEFIK_TRACING_DATADOG_TRACEIDHEADERNAME`: Specifies the header name that will be used to store the trace ID. +`TRAEFIK_TRACING_ELASTIC`: +Settings for Elastic. (Default: ```false```) + +`TRAEFIK_TRACING_ELASTIC_SECRETTOKEN`: +Set the token used to connect to Elastic APM Server. + +`TRAEFIK_TRACING_ELASTIC_SERVERURL`: +Set the URL of the Elastic APM server. + +`TRAEFIK_TRACING_ELASTIC_SERVICEENVIRONMENT`: +Set the name of the environment Traefik is deployed in, e.g. 'production' or 'staging'. + `TRAEFIK_TRACING_HAYSTACK`: Settings for Haystack. (Default: ```false```) diff --git a/docs/content/reference/static-configuration/file.toml b/docs/content/reference/static-configuration/file.toml index cad3042ce..edb9b757b 100644 --- a/docs/content/reference/static-configuration/file.toml +++ b/docs/content/reference/static-configuration/file.toml @@ -233,6 +233,10 @@ parentIDHeaderName = "foobar" spanIDHeaderName = "foobar" baggagePrefixHeaderName = "foobar" + [tracing.elastic] + serverURL = "foobar" + secretToken = "foobar" + serviceEnvironment = "foobar" [hostResolver] cnameFlattening = true diff --git a/docs/content/reference/static-configuration/file.yaml b/docs/content/reference/static-configuration/file.yaml index acee93fe2..137c23233 100644 --- a/docs/content/reference/static-configuration/file.yaml +++ b/docs/content/reference/static-configuration/file.yaml @@ -238,6 +238,10 @@ tracing: parentIDHeaderName: foobar spanIDHeaderName: foobar baggagePrefixHeaderName: foobar + elastic: + serverURL: foobar + secretToken: foobar + serviceEnvironment: foobar hostResolver: cnameFlattening: true resolvConfig: foobar diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 50cd3f807..9de272501 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -143,6 +143,7 @@ nav: - 'Datadog': 'observability/tracing/datadog.md' - 'Instana': 'observability/tracing/instana.md' - 'Haystack': 'observability/tracing/haystack.md' + - 'Elastic': 'observability/tracing/elastic.md' - 'User Guides': - 'Kubernetes and Let''s Encrypt': 'user-guides/crd-acme/index.md' - 'gRPC Examples': 'user-guides/grpc.md' diff --git a/go.mod b/go.mod index 247b44493..48b4f425a 100644 --- a/go.mod +++ b/go.mod @@ -87,6 +87,8 @@ require ( github.com/vdemeester/shakers v0.1.0 github.com/vulcand/oxy v1.0.0 github.com/vulcand/predicate v1.1.0 + go.elastic.co/apm v1.6.0 + go.elastic.co/apm/module/apmot v1.6.0 golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a // indirect golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 diff --git a/go.sum b/go.sum index 41e147fac..96842312b 100644 --- a/go.sum +++ b/go.sum @@ -77,6 +77,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.16.23/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.23.0 h1:ilfJN/vJtFo1XDFxB2YMBYGeOvGZl6Qow17oyD4+Z9A= github.com/aws/aws-sdk-go v1.23.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -172,6 +174,10 @@ github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/elastic/go-sysinfo v1.0.1 h1:lzGPX2sIXaETeMXitXL2XZU8K4B7k7JBhIKWxdOdUt8= +github.com/elastic/go-sysinfo v1.0.1/go.mod h1:O/D5m1VpYLwGjCYzEt63g3Z1uO3jXfwyzzjiW90t8cY= +github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= +github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -240,6 +246,8 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-github/v28 v28.0.0 h1:+UjHI4+1W/vsXR4jJBWt0ZA74XHbvt5yBAvsf1M3bgM= github.com/google/go-github/v28 v28.0.0/go.mod h1:+5GboIspo7F0NG2qsvfYh7en6F3EK37uyqv+c35AR3s= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= @@ -335,8 +343,11 @@ github.com/instana/go-sensor v1.4.17-0.20190515112224-78c14625025a h1:S3CSPEIeIu github.com/instana/go-sensor v1.4.17-0.20190515112224-78c14625025a/go.mod h1:P1ynE0u78bUBZ2GkWewRpAO1/w1oW9CKDozeueH6QSg= github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03 h1:FUwcHNlEqkqLjLBdCp5PRlCFijNjvcYANOZXzCfXwCM= github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -503,6 +514,7 @@ github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= @@ -516,6 +528,8 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/sacloud/libsacloud v1.26.1 h1:td3Kd7lvpSAxxHEVpnaZ9goHmmhi0D/RfP0Rqqf/kek= github.com/sacloud/libsacloud v1.26.1/go.mod h1:79ZwATmHLIFZIMd7sxA3LwzVy/B77uj3LDoToVTxDoQ= github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/santhosh-tekuri/jsonschema v1.2.4 h1:hNhW8e7t+H1vgY+1QeEQpveR6D4+OwKPXCfD2aieJis= +github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -580,6 +594,14 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v1.1.0 h1:ngVtJC9TY/lg0AA/1k48FYhBrhRoFlEmWzsehpNAaZg= github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +go.elastic.co/apm v1.6.0 h1:RzyNj9Qx2iXh4A8DIg/aMUdtwGFNw3R8sKO3/Hf4pqk= +go.elastic.co/apm v1.6.0/go.mod h1:/VByR6FBtuNu1YnPHz7Gri7YiIqAoFBGVp+2xkSE8tI= +go.elastic.co/apm/module/apmhttp v1.6.0 h1:Y67VwDNnUyq4akeiem8Wtpb222RbZCRfY3FBI0swoJk= +go.elastic.co/apm/module/apmhttp v1.6.0/go.mod h1:pf6GS5vDxdrSF0Qy6wESRBZCRZqATSZpr658ehD5QA4= +go.elastic.co/apm/module/apmot v1.6.0 h1:3Tjwu25SfB2Bq+UsO8JOKYOuMzUu4s8/fS8BGkliocg= +go.elastic.co/apm/module/apmot v1.6.0/go.mod h1:JIGFfrixcGjp8oD22PTTCvdNMfp+O+lOb5Hw4MtqxQ4= +go.elastic.co/fastjson v1.0.0 h1:ooXV/ABvf+tBul26jcVViPT3sBir0PvXgibYB1IQQzg= +go.elastic.co/fastjson v1.0.0/go.mod h1:PmeUOMMtLHQr9ZS9J9owrAVg0FkaZDRZJEFTTGHtchs= go.etcd.io/bbolt v1.3.1-etcd.8/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v3.3.13+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -661,8 +683,10 @@ golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190425145619-16072639606e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b h1:ag/x1USPSsqHud38I9BAC88qdNLDHHtQ4mlgQIZPPNA= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -764,6 +788,8 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= +howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= k8s.io/api v0.0.0-20190718183219-b59d8169aab5 h1:X3LHYU4fwu75lvvWypbppCKuhqg1KrvcZ1lLaAgmE/g= k8s.io/api v0.0.0-20190718183219-b59d8169aab5/go.mod h1:TBhBqb1AWbBQbW3XRusr7n7E4v2+5ZY8r8sAMnyFC5A= k8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719 h1:uV4S5IB5g4Nvi+TBVNf3e9L4wrirlwYJ6w88jUQxTUw= diff --git a/pkg/config/static/static_config.go b/pkg/config/static/static_config.go index af3eb8e7a..a10648a0d 100644 --- a/pkg/config/static/static_config.go +++ b/pkg/config/static/static_config.go @@ -19,6 +19,7 @@ import ( "github.com/containous/traefik/v2/pkg/provider/rest" "github.com/containous/traefik/v2/pkg/tls" "github.com/containous/traefik/v2/pkg/tracing/datadog" + "github.com/containous/traefik/v2/pkg/tracing/elastic" "github.com/containous/traefik/v2/pkg/tracing/haystack" "github.com/containous/traefik/v2/pkg/tracing/instana" "github.com/containous/traefik/v2/pkg/tracing/jaeger" @@ -144,6 +145,7 @@ type Tracing struct { Datadog *datadog.Config `description:"Settings for Datadog." json:"datadog,omitempty" toml:"datadog,omitempty" yaml:"datadog,omitempty" export:"true" label:"allowEmpty"` Instana *instana.Config `description:"Settings for Instana." json:"instana,omitempty" toml:"instana,omitempty" yaml:"instana,omitempty" export:"true" label:"allowEmpty"` Haystack *haystack.Config `description:"Settings for Haystack." json:"haystack,omitempty" toml:"haystack,omitempty" yaml:"haystack,omitempty" export:"true" label:"allowEmpty"` + Elastic *elastic.Config `description:"Settings for Elastic." json:"elastic,omitempty" toml:"elastic,omitempty" yaml:"elastic,omitempty" export:"true" label:"allowEmpty"` } // SetDefaults sets the default values. diff --git a/pkg/server/middleware/chainbuilder.go b/pkg/server/middleware/chainbuilder.go index f8c6b390e..fec69b37e 100644 --- a/pkg/server/middleware/chainbuilder.go +++ b/pkg/server/middleware/chainbuilder.go @@ -108,6 +108,14 @@ func setupTracing(conf *static.Tracing) *tracing.Tracing { } } + if conf.Elastic != nil { + if backend != nil { + log.WithoutContext().Error("Multiple tracing backend are not supported: cannot create Elastic backend.") + } else { + backend = conf.Elastic + } + } + if backend == nil { log.WithoutContext().Debug("Could not initialize tracing, using Jaeger by default") defaultBackend := &jaeger.Config{} diff --git a/pkg/tracing/elastic/elastic.go b/pkg/tracing/elastic/elastic.go new file mode 100644 index 000000000..e1df66b20 --- /dev/null +++ b/pkg/tracing/elastic/elastic.go @@ -0,0 +1,64 @@ +package elastic + +import ( + "io" + "net/url" + + "github.com/containous/traefik/v2/pkg/log" + "github.com/containous/traefik/v2/pkg/version" + "github.com/opentracing/opentracing-go" + "go.elastic.co/apm" + "go.elastic.co/apm/module/apmot" + "go.elastic.co/apm/transport" +) + +// Name sets the name of this tracer. +const Name = "elastic" + +// Config provides configuration settings for a elastic.co tracer. +type Config struct { + ServerURL string `description:"Set the URL of the Elastic APM server." json:"serverURL,omitempty" toml:"serverURL,omitempty" yaml:"serverURL,omitempty"` + SecretToken string `description:"Set the token used to connect to Elastic APM Server." json:"secretToken,omitempty" toml:"secretToken,omitempty" yaml:"secretToken,omitempty"` + ServiceEnvironment string `description:"Set the name of the environment Traefik is deployed in, e.g. 'production' or 'staging'." json:"serviceEnvironment,omitempty" toml:"serviceEnvironment,omitempty" yaml:"serviceEnvironment,omitempty"` +} + +// Setup sets up the tracer. +func (c *Config) Setup(serviceName string) (opentracing.Tracer, io.Closer, error) { + // Create default transport. + tr, err := transport.NewHTTPTransport() + if err != nil { + return nil, nil, err + } + + if c.ServerURL != "" { + serverURL, err := url.Parse(c.ServerURL) + if err != nil { + return nil, nil, err + } + tr.SetServerURL(serverURL) + } + + if c.SecretToken != "" { + tr.SetSecretToken(c.SecretToken) + } + + tracer, err := apm.NewTracerOptions(apm.TracerOptions{ + ServiceName: serviceName, + ServiceVersion: version.Version, + ServiceEnvironment: c.ServiceEnvironment, + Transport: tr, + }) + if err != nil { + return nil, nil, err + } + + tracer.SetLogger(log.WithoutContext()) + otTracer := apmot.New(apmot.WithTracer(tracer)) + + // Without this, child spans are getting the NOOP tracer + opentracing.SetGlobalTracer(otTracer) + + log.WithoutContext().Debug("Elastic tracer configured") + + return otTracer, nil, nil +}