From e5c53655acd1c04961531c3c02dfe36f58bdfd78 Mon Sep 17 00:00:00 2001 From: Peter Saxton Date: Sat, 28 Nov 2020 18:14:38 +0000 Subject: [PATCH 1/8] spike adding telemetry --- docker-compose.yml | 4 +++ lib/glance/application.ex | 2 ++ mix.exs | 5 ++- mix.lock | 9 ++++++ src/glance/web/router.gleam | 64 ++++++++++++++++++++++--------------- src/open_telemetry.gleam | 10 ++++++ 6 files changed, 68 insertions(+), 26 deletions(-) create mode 100644 src/open_telemetry.gleam diff --git a/docker-compose.yml b/docker-compose.yml index 3fbabc7..c3a9dda 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,3 +19,7 @@ services: network_mode: host environment: PORT: 9000 + zipkin: + image: openzipkin/zipkin + ports: + - 9411:9411 diff --git a/lib/glance/application.ex b/lib/glance/application.ex index e806e44..93bee84 100644 --- a/lib/glance/application.ex +++ b/lib/glance/application.ex @@ -6,6 +6,8 @@ defmodule Glance.Application do def start(_type, _args) do port = port() + OpenTelemetry.register_application_tracer(:glance) + children = [ %{ id: :cowboy, diff --git a/mix.exs b/mix.exs index 943133d..b520320 100644 --- a/mix.exs +++ b/mix.exs @@ -33,7 +33,10 @@ defmodule PlumMail.MixProject do github: "midas-framework/floki", tag: "4bae91f3129fbf517aae084695db5671eb115931", manager: :mix, - override: true} + override: true}, + {:opentelemetry_zipkin, "~> 0.3.0"}, + {:opentelemetry, "~> 0.5.0", override: true}, + {:opentelemetry_api, "~> 0.5.0", override: true} ] end end diff --git a/mix.lock b/mix.lock index e295e05..d06c0df 100644 --- a/mix.lock +++ b/mix.lock @@ -1,6 +1,8 @@ %{ + "counters": {:hex, :counters, "0.2.1", "aa3d97e88f92573488987193d0f48efce0f3b2cd1443bf4ee760bc7f99322f0c", [:mix, :rebar3], [], "hexpm", "a020c714992f7db89178d27e1f39909e5d77da3b80daa4d6015877ed0c94b8ab"}, "cowboy": {:hex, :cowboy, "2.8.0", "f3dc62e35797ecd9ac1b50db74611193c29815401e53bac9a5c0577bd7bc667d", [:rebar3], [{:cowlib, "~> 2.9.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "4643e4fba74ac96d4d152c75803de6fad0b3fa5df354c71afdd6cbeeb15fac8a"}, "cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"}, + "ctx": {:hex, :ctx, "0.5.0", "78e0f16712e12d707a7f34277381b8e193d7c71eaa24d37330dc02477c09eda5", [:rebar3], [], "hexpm", "52554d80f9d93b3f82dba8e1776e8ea87b0d6218ae94ba0f73d61ad1579aed08"}, "floki": {:git, "https://github.com/midas-framework/floki.git", "4bae91f3129fbf517aae084695db5671eb115931", [tag: "4bae91f3129fbf517aae084695db5671eb115931"]}, "gleam_cowboy": {:hex, :gleam_cowboy, "0.1.2", "63ed10783989868ac8a5276feaa00de90e171a0c909b0ef955dce1d99633848b", [:rebar3], [{:cowboy, "~> 2.8", [hex: :cowboy, repo: "hexpm", optional: false]}, {:gleam_http, "~> 1.3", [hex: :gleam_http, repo: "hexpm", optional: false]}, {:gleam_otp, "~> 0.0", [hex: :gleam_otp, repo: "hexpm", optional: false]}, {:gleam_stdlib, "~> 0.10", [hex: :gleam_stdlib, repo: "hexpm", optional: false]}], "hexpm", "a6c5f7fc11e9e2e88a20b16db495d7f55f9aa68d5b9a88995ebd42c745225b3f"}, "gleam_http": {:hex, :gleam_http, "1.6.0", "7d37b0287ea47a47987da5fd7cadb75db9c96c3192d7c28c2182cd793496784f", [:rebar3], [{:gleam_stdlib, "~> 0.12", [hex: :gleam_stdlib, repo: "hexpm", optional: false]}], "hexpm", "1dd7e0f0103de27b1f5f985c0b146446c9d2726ef3b3525e8765d1e02fbe3926"}, @@ -10,6 +12,13 @@ "gleam_stdlib": {:hex, :gleam_stdlib, "0.12.0", "722b00f9a08e44d9582922b4ef6e890ca60e2caebefe81192f3cc8d337f2f0cf", [:rebar3], [], "hexpm", "c3435f25629ed5f2c0d53a1bc2fdf89acdffa75f036cb27396c1ef70396f644a"}, "html_entities": {:hex, :html_entities, "0.5.1", "1c9715058b42c35a2ab65edc5b36d0ea66dd083767bef6e3edb57870ef556549", [:mix], [], "hexpm", "30efab070904eb897ff05cd52fa61c1025d7f8ef3a9ca250bc4e6513d16c32de"}, "jsone": {:hex, :jsone, "1.5.2", "87adea283c9cf24767b4deed44602989a5331156df5d60a2660e9c9114d54046", [:rebar3], [], "hexpm", "170c171ce7f6dd70c858065154a3305b8564833c6dcca17e10b676ca31ea976f"}, + "jsx": {:hex, :jsx, "2.9.0", "d2f6e5f069c00266cad52fb15d87c428579ea4d7d73a33669e12679e203329dd", [:mix, :rebar3], [], "hexpm", "8ee1db1cabafdd578a2776a6aaae87c2a8ce54b47b59e9ec7dab5d7eb71cd8dc"}, "mix_gleam": {:hex, :mix_gleam, "0.1.0", "a0cee5d30de865124a32ca6cd53b64c3e2ac57f12adf6e47b88fb673f47c716e", [:mix], [], "hexpm", "9ff518e6aab444c7f2e74038f9383020ef89810cf1f4402911f33b202ffd72e7"}, + "opencensus": {:hex, :opencensus, "0.9.3", "a7bb2771b40593f8513fc14eb70d822e88bea1b2fb552e19a1e2e6f98371427a", [:rebar3], [{:counters, "~> 0.2.1", [hex: :counters, repo: "hexpm", optional: false]}, {:ctx, "~> 0.5", [hex: :ctx, repo: "hexpm", optional: false]}, {:wts, "~> 0.3", [hex: :wts, repo: "hexpm", optional: false]}], "hexpm", "9495b4fa817f10a7cdf8b69cca929470aeda0633a04ea18cff6a0a9ea03a03e9"}, + "opencensus_zipkin": {:hex, :opencensus_zipkin, "0.3.0", "a966fb97c2d56a37371f49f387c0210f906081889e3084434bdec42f4781aeac", [:rebar3], [{:jsx, "~>2.9.0", [hex: :jsx, repo: "hexpm", optional: false]}, {:opencensus, "~>0.9.2", [hex: :opencensus, repo: "hexpm", optional: false]}], "hexpm", "e5e7de60ca4d601b39ae4b63251c4610e9aea9ab46d66ce67f2bbf28bb30cc4e"}, + "opentelemetry": {:hex, :opentelemetry, "0.5.0", "6a7072a6f54b8be07a42dd2aaca1ee0389038681405d0a27c4c5e5325b6c1a82", [:rebar3], [{:opentelemetry_api, "~>0.5.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "a45261c421240199184d55447108f1d9f49c6b2b0e0e2056aaaa1a1fe77d2eda"}, + "opentelemetry_api": {:hex, :opentelemetry_api, "0.5.0", "29ecaa7bb86df4dbd44b14fd71fd4faadff5c08d178545b66b3861bd350be28a", [:mix, :rebar3], [], "hexpm", "fa3c23198e84d6d1cdb8a4408374c8d73c9d2ee7a9e587a6d539def15851ffad"}, + "opentelemetry_zipkin": {:hex, :opentelemetry_zipkin, "0.3.0", "b0db7cc2daec7693d57f50d8ab0c72a5376c2c351d85cab7d877a97fb13709c7", [:rebar3], [{:opentelemetry, "~>0.4.0", [hex: :opentelemetry, repo: "hexpm", optional: false]}, {:opentelemetry_api, "~>0.3.1", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "c937a7e136e49820ca4107426fc8dc7d7f3a90f0fe3d7e357ae0ec07290fd287"}, "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, + "wts": {:hex, :wts, "0.4.0", "62d9dc400ad29f0d233f0665b9c75c8f8eb0a8af75eec921056ba4a73b0605a2", [:rebar3], [], "hexpm", "711bb675de2ce2b3ebab80a613ac93b994f74df44af4cff7970dc9eebe724869"}, } diff --git a/src/glance/web/router.gleam b/src/glance/web/router.gleam index edb651f..3af834a 100644 --- a/src/glance/web/router.gleam +++ b/src/glance/web/router.gleam @@ -1,3 +1,4 @@ +import gleam/atom import gleam/bit_builder.{BitBuilder} import gleam/bit_string.{BitString} import gleam/io @@ -8,6 +9,7 @@ import gleam/http.{Request, Response} import gleam/httpc import gleam/json import floki +import open_telemetry import glance/strategy/strategy import glance/snapshot @@ -24,31 +26,43 @@ pub fn set_resp_json(response, data) { } pub fn handle(request: Request(BitString), config: Nil) -> Response(BitBuilder) { - case request.method { - http.Options -> - http.response(200) - |> http.set_resp_body(bit_builder.from_bit_string(<<>>)) - _ -> - case request.query { - Some(target) -> { - assert Ok(uri.Uri(path: path, host: Some(host), ..)) = - uri.parse(target) - let req = - http.default_req() - |> http.set_method(http.Get) - |> http.set_host(host) - |> http.set_path(path) - assert Ok(Response(status: 200, body: html, ..)) = httpc.send(req) - assert Ok(document) = floki.parse_document(html) - let snapshot = strategy.apply(host, document) + let tracer = open_telemetry.get_tracer(atom.create_from_string("glance")) + io.debug(tracer) + open_telemetry.with_span( + tracer, + atom.create_from_string("http.request"), + fn(x) { + io.debug(x) + case request.method { + http.Options -> http.response(200) - |> set_resp_json(json.object([ - tuple("snapshot", snapshot.to_json(snapshot)), - ])) - } + |> http.set_resp_body(bit_builder.from_bit_string(<<>>)) + _ -> + case request.query { + Some(target) -> { + assert Ok(uri.Uri(path: path, host: Some(host), ..)) = + uri.parse(target) + let req = + http.default_req() + |> http.set_method(http.Get) + |> http.set_host(host) + |> http.set_path(path) + assert Ok(Response(status: 200, body: html, ..)) = httpc.send(req) + assert Ok(document) = floki.parse_document(html) + let snapshot = strategy.apply(host, document) + http.response(200) + |> set_resp_json(json.object([ + tuple("snapshot", snapshot.to_json(snapshot)), + ])) + } + } } - } - |> http.prepend_resp_header("access-control-allow-origin", "*") - |> http.prepend_resp_header("access-control-allow-credentials", "true") - |> http.prepend_resp_header("access-control-allow-headers", "content-type") + |> http.prepend_resp_header("access-control-allow-origin", "*") + |> http.prepend_resp_header("access-control-allow-credentials", "true") + |> http.prepend_resp_header( + "access-control-allow-headers", + "content-type", + ) + }, + ) } diff --git a/src/open_telemetry.gleam b/src/open_telemetry.gleam new file mode 100644 index 0000000..33f040b --- /dev/null +++ b/src/open_telemetry.gleam @@ -0,0 +1,10 @@ +import gleam/atom.{Atom} + +pub external type Tracer +pub external type SpanContext + +pub external fn get_tracer(name: Atom) -> Tracer = + "opentelemetry" "get_tracer" + +pub external fn with_span(tracer: Tracer, name: Atom, func: fn(SpanContext) -> t) -> t = + "otel_tracer" "with_span" From 39564054b7edf8362e6abea544c7e2d2d8021441 Mon Sep 17 00:00:00 2001 From: Peter Saxton Date: Sat, 28 Nov 2020 19:55:31 +0000 Subject: [PATCH 2/8] use mix config.exs to set up stdout exporter --- config/config.exs | 4 ++++ lib/glance/application.ex | 3 ++- mix.exs | 6 +++--- src/glance/web/router.gleam | 2 -- 4 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 config/config.exs diff --git a/config/config.exs b/config/config.exs new file mode 100644 index 0000000..899b7a4 --- /dev/null +++ b/config/config.exs @@ -0,0 +1,4 @@ +use Mix.Config + +# Translated from https://github.com/open-telemetry/opentelemetry-erlang/blob/d33a383f41a4d6c4dee4883ce5eb54e2230a7c74/config/sys.config#L1 +config :opentelemetry, :processors, otel_batch_processor: %{exporter: {:otel_exporter_stdout, []}} diff --git a/lib/glance/application.ex b/lib/glance/application.ex index 93bee84..c07dbf4 100644 --- a/lib/glance/application.ex +++ b/lib/glance/application.ex @@ -6,7 +6,8 @@ defmodule Glance.Application do def start(_type, _args) do port = port() - OpenTelemetry.register_application_tracer(:glance) + true = OpenTelemetry.register_application_tracer(:glance) + Application.get_env(:opentelemetry, :processors) children = [ %{ diff --git a/mix.exs b/mix.exs index b520320..d69ce8e 100644 --- a/mix.exs +++ b/mix.exs @@ -34,9 +34,9 @@ defmodule PlumMail.MixProject do tag: "4bae91f3129fbf517aae084695db5671eb115931", manager: :mix, override: true}, - {:opentelemetry_zipkin, "~> 0.3.0"}, - {:opentelemetry, "~> 0.5.0", override: true}, - {:opentelemetry_api, "~> 0.5.0", override: true} + # {:opentelemetry_zipkin, "~> 0.3.0"}, + {:opentelemetry, "~> 0.5.0"}, + {:opentelemetry_api, "~> 0.5.0"} ] end end diff --git a/src/glance/web/router.gleam b/src/glance/web/router.gleam index 3af834a..9e3c429 100644 --- a/src/glance/web/router.gleam +++ b/src/glance/web/router.gleam @@ -27,12 +27,10 @@ pub fn set_resp_json(response, data) { pub fn handle(request: Request(BitString), config: Nil) -> Response(BitBuilder) { let tracer = open_telemetry.get_tracer(atom.create_from_string("glance")) - io.debug(tracer) open_telemetry.with_span( tracer, atom.create_from_string("http.request"), fn(x) { - io.debug(x) case request.method { http.Options -> http.response(200) From 5f21ed319d864f8dbb57c7094bc18cf39f2d66f8 Mon Sep 17 00:00:00 2001 From: Peter Saxton Date: Sat, 28 Nov 2020 20:04:18 +0000 Subject: [PATCH 3/8] add attribute to span recorded --- src/glance/web/router.gleam | 3 ++- src/open_telemetry.gleam | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/glance/web/router.gleam b/src/glance/web/router.gleam index 9e3c429..9674bd1 100644 --- a/src/glance/web/router.gleam +++ b/src/glance/web/router.gleam @@ -30,7 +30,8 @@ pub fn handle(request: Request(BitString), config: Nil) -> Response(BitBuilder) open_telemetry.with_span( tracer, atom.create_from_string("http.request"), - fn(x) { + fn(span_context) { + open_telemetry.set_attribute(span_context, "foo", "value 1") case request.method { http.Options -> http.response(200) diff --git a/src/open_telemetry.gleam b/src/open_telemetry.gleam index 33f040b..a204ba5 100644 --- a/src/open_telemetry.gleam +++ b/src/open_telemetry.gleam @@ -8,3 +8,5 @@ pub external fn get_tracer(name: Atom) -> Tracer = pub external fn with_span(tracer: Tracer, name: Atom, func: fn(SpanContext) -> t) -> t = "otel_tracer" "with_span" + +pub external fn set_attribute(span: SpanContext, key: String, value: String) -> Nil = "otel_span" "set_attribute" From 73854c638e797a6ee2b761abcb83228b10ae697b Mon Sep 17 00:00:00 2001 From: Peter Saxton Date: Sat, 28 Nov 2020 20:52:23 +0000 Subject: [PATCH 4/8] use jaeger and the otel exporter --- config/config.exs | 6 +++++- docker-compose.yml | 13 +++++++++++++ mix.exs | 1 + mix.lock | 6 ++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/config/config.exs b/config/config.exs index 899b7a4..0038132 100644 --- a/config/config.exs +++ b/config/config.exs @@ -1,4 +1,8 @@ use Mix.Config # Translated from https://github.com/open-telemetry/opentelemetry-erlang/blob/d33a383f41a4d6c4dee4883ce5eb54e2230a7c74/config/sys.config#L1 -config :opentelemetry, :processors, otel_batch_processor: %{exporter: {:otel_exporter_stdout, []}} +# config :opentelemetry, :processors, otel_batch_processor: %{exporter: {:otel_exporter_stdout, []}} +config :opentelemetry, :processors, + otel_batch_processor: %{ + exporter: {:opentelemetry_exporter, %{endpoints: [{:http, "localhost", 14250}]}} + } diff --git a/docker-compose.yml b/docker-compose.yml index c3a9dda..ac60981 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,3 +23,16 @@ services: image: openzipkin/zipkin ports: - 9411:9411 + jaeger: + image: jaegertracing/all-in-one:1.21 + environment: + COLLECTOR_ZIPKIN_HTTP_PORT: 9411 + ports: + - 5775:5775/udp + - 6831:6831/udp + - 6832:6832/udp + - 5778:5778 + - 16686:16686 + - 14268:14268 + - 14250:14250 + - 9411:9411 diff --git a/mix.exs b/mix.exs index d69ce8e..dc3118f 100644 --- a/mix.exs +++ b/mix.exs @@ -35,6 +35,7 @@ defmodule PlumMail.MixProject do manager: :mix, override: true}, # {:opentelemetry_zipkin, "~> 0.3.0"}, + {:opentelemetry_exporter, "~> 0.5.0"}, {:opentelemetry, "~> 0.5.0"}, {:opentelemetry_api, "~> 0.5.0"} ] diff --git a/mix.lock b/mix.lock index d06c0df..60e7301 100644 --- a/mix.lock +++ b/mix.lock @@ -1,4 +1,6 @@ %{ + "acceptor_pool": {:hex, :acceptor_pool, "1.0.0", "43c20d2acae35f0c2bcd64f9d2bde267e459f0f3fd23dab26485bf518c281b21", [:rebar3], [], "hexpm", "0cbcd83fdc8b9ad2eee2067ef8b91a14858a5883cb7cd800e6fcd5803e158788"}, + "chatterbox": {:hex, :ts_chatterbox, "0.9.1", "843557ee729b04b3c1bdac33fb162daefdbf4f7ae0af0bdc055fb16e91e057e3", [:rebar3], [{:hpack, "~>0.2.3", [hex: :hpack_erl, repo: "hexpm", optional: false]}], "hexpm", "d5427c3701cce85a7b7f9977a4a44b98e527494f6cb598717585a332ef4107b4"}, "counters": {:hex, :counters, "0.2.1", "aa3d97e88f92573488987193d0f48efce0f3b2cd1443bf4ee760bc7f99322f0c", [:mix, :rebar3], [], "hexpm", "a020c714992f7db89178d27e1f39909e5d77da3b80daa4d6015877ed0c94b8ab"}, "cowboy": {:hex, :cowboy, "2.8.0", "f3dc62e35797ecd9ac1b50db74611193c29815401e53bac9a5c0577bd7bc667d", [:rebar3], [{:cowlib, "~> 2.9.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "4643e4fba74ac96d4d152c75803de6fad0b3fa5df354c71afdd6cbeeb15fac8a"}, "cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"}, @@ -10,6 +12,9 @@ "gleam_json": {:hex, :gleam_json, "0.1.0", "8740eb85e079f38a15f2627d53c306491d90c43c423aae56a4abc371319cc346", [:rebar3], [{:gleam_stdlib, "0.10.1", [hex: :gleam_stdlib, repo: "hexpm", optional: false]}, {:jsone, "1.5.2", [hex: :jsone, repo: "hexpm", optional: false]}], "hexpm", "8c6f144bc4f2ddcb0347a84c4dee134bd771a8a7c95c135a31d373d5ea95652b"}, "gleam_otp": {:hex, :gleam_otp, "0.1.3", "1501f9f838b254b854b7d0894113790a444096eccabc2f7010f56c643aeb7d96", [:rebar3], [{:gleam_stdlib, "~> 0.11", [hex: :gleam_stdlib, repo: "hexpm", optional: false]}], "hexpm", "4c914e4c73e311d546e4bc17812a3a6acdf49c68750ce2ccdf98f93da742ccb6"}, "gleam_stdlib": {:hex, :gleam_stdlib, "0.12.0", "722b00f9a08e44d9582922b4ef6e890ca60e2caebefe81192f3cc8d337f2f0cf", [:rebar3], [], "hexpm", "c3435f25629ed5f2c0d53a1bc2fdf89acdffa75f036cb27396c1ef70396f644a"}, + "gproc": {:hex, :gproc, "0.8.0", "cea02c578589c61e5341fce149ea36ccef236cc2ecac8691fba408e7ea77ec2f", [:rebar3], [], "hexpm", "580adafa56463b75263ef5a5df4c86af321f68694e7786cb057fd805d1e2a7de"}, + "grpcbox": {:hex, :grpcbox, "0.11.0", "ea9f9160120a4884838d397dde64b36edb122adf335238f639debc12087da67f", [:rebar3], [{:acceptor_pool, "~>1.0.0", [hex: :acceptor_pool, repo: "hexpm", optional: false]}, {:chatterbox, "~>0.9.1", [hex: :ts_chatterbox, repo: "hexpm", optional: false]}, {:ctx, "~>0.5.0", [hex: :ctx, repo: "hexpm", optional: false]}, {:gproc, "~>0.8.0", [hex: :gproc, repo: "hexpm", optional: false]}], "hexpm", "26ffc946d6471309eae2e29b6126e8be3729018dc581fb0e471368d15badf472"}, + "hpack": {:hex, :hpack_erl, "0.2.3", "17670f83ff984ae6cd74b1c456edde906d27ff013740ee4d9efaa4f1bf999633", [:rebar3], [], "hexpm", "06f580167c4b8b8a6429040df36cc93bba6d571faeaec1b28816523379cbb23a"}, "html_entities": {:hex, :html_entities, "0.5.1", "1c9715058b42c35a2ab65edc5b36d0ea66dd083767bef6e3edb57870ef556549", [:mix], [], "hexpm", "30efab070904eb897ff05cd52fa61c1025d7f8ef3a9ca250bc4e6513d16c32de"}, "jsone": {:hex, :jsone, "1.5.2", "87adea283c9cf24767b4deed44602989a5331156df5d60a2660e9c9114d54046", [:rebar3], [], "hexpm", "170c171ce7f6dd70c858065154a3305b8564833c6dcca17e10b676ca31ea976f"}, "jsx": {:hex, :jsx, "2.9.0", "d2f6e5f069c00266cad52fb15d87c428579ea4d7d73a33669e12679e203329dd", [:mix, :rebar3], [], "hexpm", "8ee1db1cabafdd578a2776a6aaae87c2a8ce54b47b59e9ec7dab5d7eb71cd8dc"}, @@ -18,6 +23,7 @@ "opencensus_zipkin": {:hex, :opencensus_zipkin, "0.3.0", "a966fb97c2d56a37371f49f387c0210f906081889e3084434bdec42f4781aeac", [:rebar3], [{:jsx, "~>2.9.0", [hex: :jsx, repo: "hexpm", optional: false]}, {:opencensus, "~>0.9.2", [hex: :opencensus, repo: "hexpm", optional: false]}], "hexpm", "e5e7de60ca4d601b39ae4b63251c4610e9aea9ab46d66ce67f2bbf28bb30cc4e"}, "opentelemetry": {:hex, :opentelemetry, "0.5.0", "6a7072a6f54b8be07a42dd2aaca1ee0389038681405d0a27c4c5e5325b6c1a82", [:rebar3], [{:opentelemetry_api, "~>0.5.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "a45261c421240199184d55447108f1d9f49c6b2b0e0e2056aaaa1a1fe77d2eda"}, "opentelemetry_api": {:hex, :opentelemetry_api, "0.5.0", "29ecaa7bb86df4dbd44b14fd71fd4faadff5c08d178545b66b3861bd350be28a", [:mix, :rebar3], [], "hexpm", "fa3c23198e84d6d1cdb8a4408374c8d73c9d2ee7a9e587a6d539def15851ffad"}, + "opentelemetry_exporter": {:hex, :opentelemetry_exporter, "0.5.0", "71c32f865123aeb7f72e15a1a8dddbbf868f07a5d65795d8f5d909b36fddc7be", [:rebar3], [{:grpcbox, "~>0.11.0", [hex: :grpcbox, repo: "hexpm", optional: false]}, {:opentelemetry, "~>0.5.0", [hex: :opentelemetry, repo: "hexpm", optional: false]}, {:opentelemetry_api, "~>0.5.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "61de1db1c8b6a72298042e8fa83604a66f030b1331eb8c501403583db740bc59"}, "opentelemetry_zipkin": {:hex, :opentelemetry_zipkin, "0.3.0", "b0db7cc2daec7693d57f50d8ab0c72a5376c2c351d85cab7d877a97fb13709c7", [:rebar3], [{:opentelemetry, "~>0.4.0", [hex: :opentelemetry, repo: "hexpm", optional: false]}, {:opentelemetry_api, "~>0.3.1", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "c937a7e136e49820ca4107426fc8dc7d7f3a90f0fe3d7e357ae0ec07290fd287"}, "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, "wts": {:hex, :wts, "0.4.0", "62d9dc400ad29f0d233f0665b9c75c8f8eb0a8af75eec921056ba4a73b0605a2", [:rebar3], [], "hexpm", "711bb675de2ce2b3ebab80a613ac93b994f74df44af4cff7970dc9eebe724869"}, From 553e039ec408efb7c97acbb19d7358569a44cb79 Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 28 Nov 2020 23:52:36 +0000 Subject: [PATCH 5/8] get working with zipkin --- config/config.exs | 5 ++++- mix.exs | 2 +- mix.lock | 2 +- src/glance/strategy/google_photos.gleam | 7 ++++--- src/glance/web/router.gleam | 4 ++-- src/open_telemetry.gleam | 14 ++++++++++++-- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/config/config.exs b/config/config.exs index 0038132..5c4dc52 100644 --- a/config/config.exs +++ b/config/config.exs @@ -4,5 +4,8 @@ use Mix.Config # config :opentelemetry, :processors, otel_batch_processor: %{exporter: {:otel_exporter_stdout, []}} config :opentelemetry, :processors, otel_batch_processor: %{ - exporter: {:opentelemetry_exporter, %{endpoints: [{:http, "localhost", 14250}]}} + # exporter: {:opentelemetry_exporter, %{endpoints: [{:http, "localhost", 14250}]}} + exporter: + {:opentelemetry_zipkin, + %{address: "http://localhost:9411/api/v2/spans", local_endpoint: %{service_name: "foo"}}} } diff --git a/mix.exs b/mix.exs index dc3118f..0f89e28 100644 --- a/mix.exs +++ b/mix.exs @@ -34,7 +34,7 @@ defmodule PlumMail.MixProject do tag: "4bae91f3129fbf517aae084695db5671eb115931", manager: :mix, override: true}, - # {:opentelemetry_zipkin, "~> 0.3.0"}, + {:opentelemetry_zipkin, "~> 0.4.0"}, {:opentelemetry_exporter, "~> 0.5.0"}, {:opentelemetry, "~> 0.5.0"}, {:opentelemetry_api, "~> 0.5.0"} diff --git a/mix.lock b/mix.lock index 60e7301..d5ab913 100644 --- a/mix.lock +++ b/mix.lock @@ -24,7 +24,7 @@ "opentelemetry": {:hex, :opentelemetry, "0.5.0", "6a7072a6f54b8be07a42dd2aaca1ee0389038681405d0a27c4c5e5325b6c1a82", [:rebar3], [{:opentelemetry_api, "~>0.5.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "a45261c421240199184d55447108f1d9f49c6b2b0e0e2056aaaa1a1fe77d2eda"}, "opentelemetry_api": {:hex, :opentelemetry_api, "0.5.0", "29ecaa7bb86df4dbd44b14fd71fd4faadff5c08d178545b66b3861bd350be28a", [:mix, :rebar3], [], "hexpm", "fa3c23198e84d6d1cdb8a4408374c8d73c9d2ee7a9e587a6d539def15851ffad"}, "opentelemetry_exporter": {:hex, :opentelemetry_exporter, "0.5.0", "71c32f865123aeb7f72e15a1a8dddbbf868f07a5d65795d8f5d909b36fddc7be", [:rebar3], [{:grpcbox, "~>0.11.0", [hex: :grpcbox, repo: "hexpm", optional: false]}, {:opentelemetry, "~>0.5.0", [hex: :opentelemetry, repo: "hexpm", optional: false]}, {:opentelemetry_api, "~>0.5.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "61de1db1c8b6a72298042e8fa83604a66f030b1331eb8c501403583db740bc59"}, - "opentelemetry_zipkin": {:hex, :opentelemetry_zipkin, "0.3.0", "b0db7cc2daec7693d57f50d8ab0c72a5376c2c351d85cab7d877a97fb13709c7", [:rebar3], [{:opentelemetry, "~>0.4.0", [hex: :opentelemetry, repo: "hexpm", optional: false]}, {:opentelemetry_api, "~>0.3.1", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "c937a7e136e49820ca4107426fc8dc7d7f3a90f0fe3d7e357ae0ec07290fd287"}, + "opentelemetry_zipkin": {:hex, :opentelemetry_zipkin, "0.4.0", "868ce254d03f43d0ebeb1952e80b4b0a6cef72ae5e85d8c3bffe3a0cb48516fa", [:rebar3], [{:opentelemetry, "~>0.5.0", [hex: :opentelemetry, repo: "hexpm", optional: false]}, {:opentelemetry_api, "~>0.5.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "6384d3aca2c39f9c67c9c17c1bac445f6f693326d3c96cd1443ea43dbdd2dd21"}, "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, "wts": {:hex, :wts, "0.4.0", "62d9dc400ad29f0d233f0665b9c75c8f8eb0a8af75eec921056ba4a73b0605a2", [:rebar3], [], "hexpm", "711bb675de2ce2b3ebab80a613ac93b994f74df44af4cff7970dc9eebe724869"}, } diff --git a/src/glance/strategy/google_photos.gleam b/src/glance/strategy/google_photos.gleam index 78dda17..89b5f87 100644 --- a/src/glance/strategy/google_photos.gleam +++ b/src/glance/strategy/google_photos.gleam @@ -10,12 +10,13 @@ pub fn apply(document) { // The first image is always a profile image |> list.drop(1) - let image_sources = floki.attribute(image_tags, "src") - |> list.map(fn(src) { + let image_sources = + floki.attribute(image_tags, "src") + |> list.map(fn(src) { // The images are all cropped to a tumbnail assert [uncropped, _] = string.split(src, "=") uncropped - }) + }) assert Ok(title) = default.get_og_title(document) ImageReel(title: title, images: image_sources) } diff --git a/src/glance/web/router.gleam b/src/glance/web/router.gleam index 9674bd1..a64cf78 100644 --- a/src/glance/web/router.gleam +++ b/src/glance/web/router.gleam @@ -29,9 +29,9 @@ pub fn handle(request: Request(BitString), config: Nil) -> Response(BitBuilder) let tracer = open_telemetry.get_tracer(atom.create_from_string("glance")) open_telemetry.with_span( tracer, - atom.create_from_string("http.request"), + "http.request", fn(span_context) { - open_telemetry.set_attribute(span_context, "foo", "value 1") + open_telemetry.set_attribute(span_context, "foo", "value 1") case request.method { http.Options -> http.response(200) diff --git a/src/open_telemetry.gleam b/src/open_telemetry.gleam index a204ba5..e8d2f62 100644 --- a/src/open_telemetry.gleam +++ b/src/open_telemetry.gleam @@ -1,12 +1,22 @@ import gleam/atom.{Atom} pub external type Tracer + pub external type SpanContext pub external fn get_tracer(name: Atom) -> Tracer = "opentelemetry" "get_tracer" -pub external fn with_span(tracer: Tracer, name: Atom, func: fn(SpanContext) -> t) -> t = +pub external fn with_span( + tracer: Tracer, + name: String, + func: fn(SpanContext) -> t, +) -> t = "otel_tracer" "with_span" -pub external fn set_attribute(span: SpanContext, key: String, value: String) -> Nil = "otel_span" "set_attribute" +pub external fn set_attribute( + span: SpanContext, + key: String, + value: String, +) -> Nil = + "otel_span" "set_attribute" From fa8214966d90978ab24da5565d0c93d0b38777af Mon Sep 17 00:00:00 2001 From: Peter Date: Sat, 28 Nov 2020 23:57:57 +0000 Subject: [PATCH 6/8] clean up unnecessary dependencies --- config/config.exs | 5 +---- docker-compose.yml | 13 ------------- lib/glance/application.ex | 1 - mix.exs | 1 - mix.lock | 12 ------------ 5 files changed, 1 insertion(+), 31 deletions(-) diff --git a/config/config.exs b/config/config.exs index 5c4dc52..0d1fe12 100644 --- a/config/config.exs +++ b/config/config.exs @@ -1,11 +1,8 @@ use Mix.Config -# Translated from https://github.com/open-telemetry/opentelemetry-erlang/blob/d33a383f41a4d6c4dee4883ce5eb54e2230a7c74/config/sys.config#L1 -# config :opentelemetry, :processors, otel_batch_processor: %{exporter: {:otel_exporter_stdout, []}} config :opentelemetry, :processors, otel_batch_processor: %{ - # exporter: {:opentelemetry_exporter, %{endpoints: [{:http, "localhost", 14250}]}} exporter: {:opentelemetry_zipkin, - %{address: "http://localhost:9411/api/v2/spans", local_endpoint: %{service_name: "foo"}}} + %{address: "http://localhost:9411/api/v2/spans", local_endpoint: %{service_name: "glance"}}} } diff --git a/docker-compose.yml b/docker-compose.yml index ac60981..c3a9dda 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,16 +23,3 @@ services: image: openzipkin/zipkin ports: - 9411:9411 - jaeger: - image: jaegertracing/all-in-one:1.21 - environment: - COLLECTOR_ZIPKIN_HTTP_PORT: 9411 - ports: - - 5775:5775/udp - - 6831:6831/udp - - 6832:6832/udp - - 5778:5778 - - 16686:16686 - - 14268:14268 - - 14250:14250 - - 9411:9411 diff --git a/lib/glance/application.ex b/lib/glance/application.ex index c07dbf4..c2f27ae 100644 --- a/lib/glance/application.ex +++ b/lib/glance/application.ex @@ -7,7 +7,6 @@ defmodule Glance.Application do port = port() true = OpenTelemetry.register_application_tracer(:glance) - Application.get_env(:opentelemetry, :processors) children = [ %{ diff --git a/mix.exs b/mix.exs index 0f89e28..e81dfd9 100644 --- a/mix.exs +++ b/mix.exs @@ -35,7 +35,6 @@ defmodule PlumMail.MixProject do manager: :mix, override: true}, {:opentelemetry_zipkin, "~> 0.4.0"}, - {:opentelemetry_exporter, "~> 0.5.0"}, {:opentelemetry, "~> 0.5.0"}, {:opentelemetry_api, "~> 0.5.0"} ] diff --git a/mix.lock b/mix.lock index d5ab913..e08b09c 100644 --- a/mix.lock +++ b/mix.lock @@ -1,10 +1,6 @@ %{ - "acceptor_pool": {:hex, :acceptor_pool, "1.0.0", "43c20d2acae35f0c2bcd64f9d2bde267e459f0f3fd23dab26485bf518c281b21", [:rebar3], [], "hexpm", "0cbcd83fdc8b9ad2eee2067ef8b91a14858a5883cb7cd800e6fcd5803e158788"}, - "chatterbox": {:hex, :ts_chatterbox, "0.9.1", "843557ee729b04b3c1bdac33fb162daefdbf4f7ae0af0bdc055fb16e91e057e3", [:rebar3], [{:hpack, "~>0.2.3", [hex: :hpack_erl, repo: "hexpm", optional: false]}], "hexpm", "d5427c3701cce85a7b7f9977a4a44b98e527494f6cb598717585a332ef4107b4"}, - "counters": {:hex, :counters, "0.2.1", "aa3d97e88f92573488987193d0f48efce0f3b2cd1443bf4ee760bc7f99322f0c", [:mix, :rebar3], [], "hexpm", "a020c714992f7db89178d27e1f39909e5d77da3b80daa4d6015877ed0c94b8ab"}, "cowboy": {:hex, :cowboy, "2.8.0", "f3dc62e35797ecd9ac1b50db74611193c29815401e53bac9a5c0577bd7bc667d", [:rebar3], [{:cowlib, "~> 2.9.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "4643e4fba74ac96d4d152c75803de6fad0b3fa5df354c71afdd6cbeeb15fac8a"}, "cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"}, - "ctx": {:hex, :ctx, "0.5.0", "78e0f16712e12d707a7f34277381b8e193d7c71eaa24d37330dc02477c09eda5", [:rebar3], [], "hexpm", "52554d80f9d93b3f82dba8e1776e8ea87b0d6218ae94ba0f73d61ad1579aed08"}, "floki": {:git, "https://github.com/midas-framework/floki.git", "4bae91f3129fbf517aae084695db5671eb115931", [tag: "4bae91f3129fbf517aae084695db5671eb115931"]}, "gleam_cowboy": {:hex, :gleam_cowboy, "0.1.2", "63ed10783989868ac8a5276feaa00de90e171a0c909b0ef955dce1d99633848b", [:rebar3], [{:cowboy, "~> 2.8", [hex: :cowboy, repo: "hexpm", optional: false]}, {:gleam_http, "~> 1.3", [hex: :gleam_http, repo: "hexpm", optional: false]}, {:gleam_otp, "~> 0.0", [hex: :gleam_otp, repo: "hexpm", optional: false]}, {:gleam_stdlib, "~> 0.10", [hex: :gleam_stdlib, repo: "hexpm", optional: false]}], "hexpm", "a6c5f7fc11e9e2e88a20b16db495d7f55f9aa68d5b9a88995ebd42c745225b3f"}, "gleam_http": {:hex, :gleam_http, "1.6.0", "7d37b0287ea47a47987da5fd7cadb75db9c96c3192d7c28c2182cd793496784f", [:rebar3], [{:gleam_stdlib, "~> 0.12", [hex: :gleam_stdlib, repo: "hexpm", optional: false]}], "hexpm", "1dd7e0f0103de27b1f5f985c0b146446c9d2726ef3b3525e8765d1e02fbe3926"}, @@ -12,19 +8,11 @@ "gleam_json": {:hex, :gleam_json, "0.1.0", "8740eb85e079f38a15f2627d53c306491d90c43c423aae56a4abc371319cc346", [:rebar3], [{:gleam_stdlib, "0.10.1", [hex: :gleam_stdlib, repo: "hexpm", optional: false]}, {:jsone, "1.5.2", [hex: :jsone, repo: "hexpm", optional: false]}], "hexpm", "8c6f144bc4f2ddcb0347a84c4dee134bd771a8a7c95c135a31d373d5ea95652b"}, "gleam_otp": {:hex, :gleam_otp, "0.1.3", "1501f9f838b254b854b7d0894113790a444096eccabc2f7010f56c643aeb7d96", [:rebar3], [{:gleam_stdlib, "~> 0.11", [hex: :gleam_stdlib, repo: "hexpm", optional: false]}], "hexpm", "4c914e4c73e311d546e4bc17812a3a6acdf49c68750ce2ccdf98f93da742ccb6"}, "gleam_stdlib": {:hex, :gleam_stdlib, "0.12.0", "722b00f9a08e44d9582922b4ef6e890ca60e2caebefe81192f3cc8d337f2f0cf", [:rebar3], [], "hexpm", "c3435f25629ed5f2c0d53a1bc2fdf89acdffa75f036cb27396c1ef70396f644a"}, - "gproc": {:hex, :gproc, "0.8.0", "cea02c578589c61e5341fce149ea36ccef236cc2ecac8691fba408e7ea77ec2f", [:rebar3], [], "hexpm", "580adafa56463b75263ef5a5df4c86af321f68694e7786cb057fd805d1e2a7de"}, - "grpcbox": {:hex, :grpcbox, "0.11.0", "ea9f9160120a4884838d397dde64b36edb122adf335238f639debc12087da67f", [:rebar3], [{:acceptor_pool, "~>1.0.0", [hex: :acceptor_pool, repo: "hexpm", optional: false]}, {:chatterbox, "~>0.9.1", [hex: :ts_chatterbox, repo: "hexpm", optional: false]}, {:ctx, "~>0.5.0", [hex: :ctx, repo: "hexpm", optional: false]}, {:gproc, "~>0.8.0", [hex: :gproc, repo: "hexpm", optional: false]}], "hexpm", "26ffc946d6471309eae2e29b6126e8be3729018dc581fb0e471368d15badf472"}, - "hpack": {:hex, :hpack_erl, "0.2.3", "17670f83ff984ae6cd74b1c456edde906d27ff013740ee4d9efaa4f1bf999633", [:rebar3], [], "hexpm", "06f580167c4b8b8a6429040df36cc93bba6d571faeaec1b28816523379cbb23a"}, "html_entities": {:hex, :html_entities, "0.5.1", "1c9715058b42c35a2ab65edc5b36d0ea66dd083767bef6e3edb57870ef556549", [:mix], [], "hexpm", "30efab070904eb897ff05cd52fa61c1025d7f8ef3a9ca250bc4e6513d16c32de"}, "jsone": {:hex, :jsone, "1.5.2", "87adea283c9cf24767b4deed44602989a5331156df5d60a2660e9c9114d54046", [:rebar3], [], "hexpm", "170c171ce7f6dd70c858065154a3305b8564833c6dcca17e10b676ca31ea976f"}, - "jsx": {:hex, :jsx, "2.9.0", "d2f6e5f069c00266cad52fb15d87c428579ea4d7d73a33669e12679e203329dd", [:mix, :rebar3], [], "hexpm", "8ee1db1cabafdd578a2776a6aaae87c2a8ce54b47b59e9ec7dab5d7eb71cd8dc"}, "mix_gleam": {:hex, :mix_gleam, "0.1.0", "a0cee5d30de865124a32ca6cd53b64c3e2ac57f12adf6e47b88fb673f47c716e", [:mix], [], "hexpm", "9ff518e6aab444c7f2e74038f9383020ef89810cf1f4402911f33b202ffd72e7"}, - "opencensus": {:hex, :opencensus, "0.9.3", "a7bb2771b40593f8513fc14eb70d822e88bea1b2fb552e19a1e2e6f98371427a", [:rebar3], [{:counters, "~> 0.2.1", [hex: :counters, repo: "hexpm", optional: false]}, {:ctx, "~> 0.5", [hex: :ctx, repo: "hexpm", optional: false]}, {:wts, "~> 0.3", [hex: :wts, repo: "hexpm", optional: false]}], "hexpm", "9495b4fa817f10a7cdf8b69cca929470aeda0633a04ea18cff6a0a9ea03a03e9"}, - "opencensus_zipkin": {:hex, :opencensus_zipkin, "0.3.0", "a966fb97c2d56a37371f49f387c0210f906081889e3084434bdec42f4781aeac", [:rebar3], [{:jsx, "~>2.9.0", [hex: :jsx, repo: "hexpm", optional: false]}, {:opencensus, "~>0.9.2", [hex: :opencensus, repo: "hexpm", optional: false]}], "hexpm", "e5e7de60ca4d601b39ae4b63251c4610e9aea9ab46d66ce67f2bbf28bb30cc4e"}, "opentelemetry": {:hex, :opentelemetry, "0.5.0", "6a7072a6f54b8be07a42dd2aaca1ee0389038681405d0a27c4c5e5325b6c1a82", [:rebar3], [{:opentelemetry_api, "~>0.5.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "a45261c421240199184d55447108f1d9f49c6b2b0e0e2056aaaa1a1fe77d2eda"}, "opentelemetry_api": {:hex, :opentelemetry_api, "0.5.0", "29ecaa7bb86df4dbd44b14fd71fd4faadff5c08d178545b66b3861bd350be28a", [:mix, :rebar3], [], "hexpm", "fa3c23198e84d6d1cdb8a4408374c8d73c9d2ee7a9e587a6d539def15851ffad"}, - "opentelemetry_exporter": {:hex, :opentelemetry_exporter, "0.5.0", "71c32f865123aeb7f72e15a1a8dddbbf868f07a5d65795d8f5d909b36fddc7be", [:rebar3], [{:grpcbox, "~>0.11.0", [hex: :grpcbox, repo: "hexpm", optional: false]}, {:opentelemetry, "~>0.5.0", [hex: :opentelemetry, repo: "hexpm", optional: false]}, {:opentelemetry_api, "~>0.5.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "61de1db1c8b6a72298042e8fa83604a66f030b1331eb8c501403583db740bc59"}, "opentelemetry_zipkin": {:hex, :opentelemetry_zipkin, "0.4.0", "868ce254d03f43d0ebeb1952e80b4b0a6cef72ae5e85d8c3bffe3a0cb48516fa", [:rebar3], [{:opentelemetry, "~>0.5.0", [hex: :opentelemetry, repo: "hexpm", optional: false]}, {:opentelemetry_api, "~>0.5.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "6384d3aca2c39f9c67c9c17c1bac445f6f693326d3c96cd1443ea43dbdd2dd21"}, "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, - "wts": {:hex, :wts, "0.4.0", "62d9dc400ad29f0d233f0665b9c75c8f8eb0a8af75eec921056ba4a73b0605a2", [:rebar3], [], "hexpm", "711bb675de2ce2b3ebab80a613ac93b994f74df44af4cff7970dc9eebe724869"}, } From 0a4dee6d8dd9c432af95002de608bdf3a2bc5ed0 Mon Sep 17 00:00:00 2001 From: Peter Date: Sun, 29 Nov 2020 00:04:35 +0000 Subject: [PATCH 7/8] central start for tracer --- lib/glance/application.ex | 3 ++- src/glance/web/router.gleam | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/glance/application.ex b/lib/glance/application.ex index c2f27ae..afbb347 100644 --- a/lib/glance/application.ex +++ b/lib/glance/application.ex @@ -7,11 +7,12 @@ defmodule Glance.Application do port = port() true = OpenTelemetry.register_application_tracer(:glance) + tracer = OpenTelemetry.get_tracer(:glance) children = [ %{ id: :cowboy, - start: {:gleam@http@cowboy, :start, [&:glance@web@router.handle(&1, nil), port]} + start: {:gleam@http@cowboy, :start, [&:glance@web@router.handle(&1, tracer), port]} } ] diff --git a/src/glance/web/router.gleam b/src/glance/web/router.gleam index a64cf78..ab5585f 100644 --- a/src/glance/web/router.gleam +++ b/src/glance/web/router.gleam @@ -25,8 +25,7 @@ pub fn set_resp_json(response, data) { |> http.set_resp_body(body) } -pub fn handle(request: Request(BitString), config: Nil) -> Response(BitBuilder) { - let tracer = open_telemetry.get_tracer(atom.create_from_string("glance")) +pub fn handle(request: Request(BitString), tracer: open_telemetry.Tracer) -> Response(BitBuilder) { open_telemetry.with_span( tracer, "http.request", From da09cdae2811fe5bfa13c96d7941dcbe2d4e7ff8 Mon Sep 17 00:00:00 2001 From: Peter Saxton Date: Sun, 29 Nov 2020 18:40:25 +0000 Subject: [PATCH 8/8] add helpers for extracting span data from http requests --- src/glance/web/router.gleam | 81 +++++++++++++++++++++-------------- src/open_telemetry.gleam | 6 +++ src/open_telemetry/http.gleam | 28 ++++++++++++ 3 files changed, 84 insertions(+), 31 deletions(-) create mode 100644 src/open_telemetry/http.gleam diff --git a/src/glance/web/router.gleam b/src/glance/web/router.gleam index ab5585f..075eaad 100644 --- a/src/glance/web/router.gleam +++ b/src/glance/web/router.gleam @@ -10,6 +10,7 @@ import gleam/httpc import gleam/json import floki import open_telemetry +import open_telemetry/http as otel_http import glance/strategy/strategy import glance/snapshot @@ -25,42 +26,60 @@ pub fn set_resp_json(response, data) { |> http.set_resp_body(body) } -pub fn handle(request: Request(BitString), tracer: open_telemetry.Tracer) -> Response(BitBuilder) { +pub fn handle( + request: Request(BitString), + tracer: open_telemetry.Tracer, +) -> Response(BitBuilder) { open_telemetry.with_span( tracer, - "http.request", + "HTTP.SERVER", fn(span_context) { - open_telemetry.set_attribute(span_context, "foo", "value 1") - case request.method { - http.Options -> - http.response(200) - |> http.set_resp_body(bit_builder.from_bit_string(<<>>)) - _ -> - case request.query { - Some(target) -> { - assert Ok(uri.Uri(path: path, host: Some(host), ..)) = - uri.parse(target) - let req = - http.default_req() - |> http.set_method(http.Get) - |> http.set_host(host) - |> http.set_path(path) - assert Ok(Response(status: 200, body: html, ..)) = httpc.send(req) - assert Ok(document) = floki.parse_document(html) - let snapshot = strategy.apply(host, document) - http.response(200) - |> set_resp_json(json.object([ - tuple("snapshot", snapshot.to_json(snapshot)), - ])) + open_telemetry.set_attributes( + span_context, + otel_http.request_attributes(request), + ) + let response = + case request.method { + http.Options -> + http.response(200) + |> http.set_resp_body(bit_builder.from_bit_string(<<>>)) + _ -> + case request.query { + Some(target) -> { + assert Ok(uri.Uri(path: path, host: Some(host), ..)) = + uri.parse(target) + // Run the span on the client call + assert Ok(Response(status: 200, body: html, ..)) = open_telemetry.with_span(tracer, "HTTP.CLIENT", fn(span_context) { + let req = + http.default_req() + |> http.set_method(http.Get) + |> http.set_host(host) + |> http.set_path(path) + httpc.send(req) + }) + // Run the span on the parsing step + let snapshot = open_telemetry.with_span(tracer, "PARSE SNAPSHOT", fn(span_context) { + assert Ok(document) = floki.parse_document(html) + strategy.apply(host, document) + }) + http.response(200) + |> set_resp_json(json.object([ + tuple("snapshot", snapshot.to_json(snapshot)), + ])) + } } - } - } - |> http.prepend_resp_header("access-control-allow-origin", "*") - |> http.prepend_resp_header("access-control-allow-credentials", "true") - |> http.prepend_resp_header( - "access-control-allow-headers", - "content-type", + } + |> http.prepend_resp_header("access-control-allow-origin", "*") + |> http.prepend_resp_header("access-control-allow-credentials", "true") + |> http.prepend_resp_header( + "access-control-allow-headers", + "content-type", + ) + open_telemetry.set_attributes( + span_context, + otel_http.response_attributes(response), ) + response }, ) } diff --git a/src/open_telemetry.gleam b/src/open_telemetry.gleam index e8d2f62..9290feb 100644 --- a/src/open_telemetry.gleam +++ b/src/open_telemetry.gleam @@ -20,3 +20,9 @@ pub external fn set_attribute( value: String, ) -> Nil = "otel_span" "set_attribute" + +pub external fn set_attributes( + span: SpanContext, + attributes: List(tuple(String, String)), +) -> Nil = + "otel_span" "set_attributes" diff --git a/src/open_telemetry/http.gleam b/src/open_telemetry/http.gleam new file mode 100644 index 0000000..1a5c6a4 --- /dev/null +++ b/src/open_telemetry/http.gleam @@ -0,0 +1,28 @@ +import gleam/int +import gleam/option +import gleam/string +import gleam/http.{Request, Response} + +pub fn request_attributes(request: Request(a)) { + let scheme = http.scheme_to_string(request.scheme) + let host = request.host + let path = request.path + // TODO decide if empty string is a good idea when query missing + let query = option.unwrap(request.query, "") + let method = string.uppercase(http.method_to_string(request.method)) + assert Ok(user_agent) = http.get_req_header(request, "user-agent") + [ + tuple("http.scheme", scheme), + tuple("http.method", method), + tuple("http.host", host), + tuple("http.path", path), + tuple("http.query", query), + tuple("http.user_agent", user_agent), + ] +} + +pub fn response_attributes(response: Response(a)) { + let status_code = int.to_string(response.status) + [tuple("http.status_code", status_code)] + // TODO set status as ok +}