diff --git a/.github/workflows/elixir.yml b/.github/workflows/elixir.yml index 1c76a70f..b1c9763d 100644 --- a/.github/workflows/elixir.yml +++ b/.github/workflows/elixir.yml @@ -11,7 +11,7 @@ on: jobs: unit_test: name: Unit Tests - Elixir ${{matrix.elixir}} / OTP ${{matrix.otp}} - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest continue-on-error: true strategy: diff --git a/examples/apps/absinthe_example/test/absinthe_example_test.exs b/examples/apps/absinthe_example/test/absinthe_example_test.exs index e4c4919f..c02efc25 100644 --- a/examples/apps/absinthe_example/test/absinthe_example_test.exs +++ b/examples/apps/absinthe_example/test/absinthe_example_test.exs @@ -27,39 +27,16 @@ defmodule AbsintheExampleTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "Absinthe/AbsintheExample.Schema/query/one.two.three" - end) - - tx_root_process = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "Transaction Root Process" - end) - - process = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "Process" - end) - - operation = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "query:TestQuery" - end) - - one_resolver = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "&AbsintheExample.Resolvers.one/3" - end) - - three_resolver = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "&AbsintheExample.Resolvers.three/3" - end) + TestHelper.find_infinite_span(spans, "Absinthe/AbsintheExample.Schema/query/one.two.three") + + tx_root_process = TestHelper.find_infinite_span(spans, "Transaction Root Process") + process = TestHelper.find_infinite_span(spans, "Process") + operation = TestHelper.find_infinite_span(spans, "query:TestQuery") + one_resolver = TestHelper.find_infinite_span(spans, "&AbsintheExample.Resolvers.one/3") + three_resolver = TestHelper.find_infinite_span(spans, "&AbsintheExample.Resolvers.three/3") do_three_fn_trace = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "AbsintheExample.Resolvers.do_three/1" - end) + TestHelper.find_infinite_span(spans, "AbsintheExample.Resolvers.do_three/1") assert operation.attributes[:"absinthe.operation.name"] == "TestQuery" assert operation.attributes[:"absinthe.operation.type"] == "query" diff --git a/examples/apps/redix_example/test/redix_example_test.exs b/examples/apps/redix_example/test/redix_example_test.exs index 3e04cdee..11620bb1 100644 --- a/examples/apps/redix_example/test/redix_example_test.exs +++ b/examples/apps/redix_example/test/redix_example_test.exs @@ -55,8 +55,7 @@ defmodule RedixExampleTest do span_events = TestHelper.gather_harvest(Collector.SpanEvent.Harvester) - [get_event, _, _] = - Enum.find(span_events, fn [ev, _, _] -> ev[:name] == "Datastore/operation/Redis/GET" end) + get_event = TestHelper.find_span(span_events, "Datastore/operation/Redis/GET") assert get_event[:"peer.address"] == "localhost:6379" assert get_event[:"db.statement"] == "GET mykey" @@ -65,18 +64,14 @@ defmodule RedixExampleTest do assert get_event[:timestamp] |> is_number assert get_event[:duration] > 0.0 - [pipeline_event, _, _] = - Enum.find(span_events, fn [ev, _, _] -> - ev[:name] == "Datastore/operation/Redis/PIPELINE" - end) + pipeline_event = TestHelper.find_span(span_events, "Datastore/operation/Redis/PIPELINE") assert pipeline_event[:"peer.address"] == "localhost:6379" assert pipeline_event[:"db.statement"] == "DEL counter; INCR counter; INCR counter; GET counter" - [hset_event, _, _] = - Enum.find(span_events, fn [ev, _, _] -> ev[:name] == "Datastore/operation/Redis/HSET" end) + hset_event = TestHelper.find_span(span_events, "Datastore/operation/Redis/HSET") assert hset_event[:"peer.address"] == "localhost:6379" end @@ -89,10 +84,7 @@ defmodule RedixExampleTest do span_events = TestHelper.gather_harvest(Collector.SpanEvent.Harvester) - [err_event, _, _] = - Enum.find(span_events, fn [ev, _, _] -> - ev[:name] == "Datastore/operation/Redis/PIPELINE" - end) + err_event = TestHelper.find_span(span_events, "Datastore/operation/Redis/PIPELINE") assert err_event[:"peer.address"] == "localhost:6379" # On elixir 1.14 OTP 26, the error message is "unknown POSIX error: timeout" diff --git a/test/infinite_tracing_test.exs b/test/infinite_tracing_test.exs index fdd32ca7..e3a717cd 100644 --- a/test/infinite_tracing_test.exs +++ b/test/infinite_tracing_test.exs @@ -131,40 +131,13 @@ defmodule InfiniteTracingTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - tx_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true - end) - - tx_root_process_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "Transaction Root Process" - end) - - cowboy_request_process_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"parent.id"] == tx_root_process_span[:id] - end) - - function_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "InfiniteTracingTest.Traced.hello/0" - end) - - nested_function_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "InfiniteTracingTest.Traced.do_hello/0" - end) - - task_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "Process" && attr[:"parent.id"] == cowboy_request_process_span[:id] - end) - - nested_external_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "External/example.com/HttpClient/GET" - end) + tx_span = TestHelper.find_infinite_span(spans, %{"nr.entryPoint": true}) + tx_root_process_span = TestHelper.find_infinite_span(spans, "Transaction Root Process") + cowboy_request_process_span = TestHelper.find_infinite_span(spans, %{"parent.id": tx_root_process_span[:id]}) + function_span = TestHelper.find_infinite_span(spans, "InfiniteTracingTest.Traced.hello/0") + nested_function_span = TestHelper.find_infinite_span(spans, "InfiniteTracingTest.Traced.do_hello/0") + task_span = TestHelper.find_infinite_span(spans, %{name: "Process", "parent.id": cowboy_request_process_span[:id]}) + nested_external_span = TestHelper.find_infinite_span(spans, "External/example.com/HttpClient/GET") [[_intrinsics, tx_event]] = TestHelper.gather_harvest(Collector.TransactionEvent.Harvester) @@ -274,10 +247,7 @@ defmodule InfiniteTracingTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - error_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "InfiniteTracingTest.Traced.error/0" - end) + error_span = TestHelper.find_infinite_span(spans, "InfiniteTracingTest.Traced.error/0") assert error_span.attributes[:"error.message"] == "(RuntimeError) Err" @@ -294,10 +264,7 @@ defmodule InfiniteTracingTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - exit_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "InfiniteTracingTest.Traced.exit/0" - end) + exit_span = TestHelper.find_infinite_span(spans, "InfiniteTracingTest.Traced.exit/0") assert exit_span.attributes[:"error.message"] == "(EXIT) :bad" diff --git a/test/instrumented/task_test.exs b/test/instrumented/task_test.exs index 4e26c472..9c18073b 100644 --- a/test/instrumented/task_test.exs +++ b/test/instrumented/task_test.exs @@ -52,10 +52,7 @@ defmodule InstrumentedTaskTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true - end) + spansaction = TestHelper.find_infinite_span(spans, %{"nr.entryPoint": true}) refute spansaction.attributes[:not_instrumented] assert spansaction.attributes[:instrumented] == 6 @@ -93,10 +90,7 @@ defmodule InstrumentedTaskTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true - end) + spansaction = TestHelper.find_infinite_span(spans, %{"nr.entryPoint": true}) refute spansaction.attributes[:not_instrumented] assert spansaction.attributes[:instrumented] == "check" @@ -151,10 +145,7 @@ defmodule InstrumentedTaskTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true - end) + spansaction = TestHelper.find_infinite_span(spans, %{"nr.entryPoint": true}) refute spansaction.attributes[:not_instrumented] assert spansaction.attributes[:instrumented] == "check" @@ -233,10 +224,7 @@ defmodule InstrumentedTaskTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true - end) + spansaction = TestHelper.find_infinite_span(spans, %{"nr.entryPoint": true}) refute spansaction.attributes[:not_instrumented] assert spansaction.attributes[:instrumented] == "check" @@ -305,10 +293,7 @@ defmodule InstrumentedTaskTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true - end) + spansaction = TestHelper.find_infinite_span(spans, %{"nr.entryPoint": true}) refute spansaction.attributes[:not_instrumented] assert spansaction.attributes[:instrumented] == 3 @@ -368,10 +353,7 @@ defmodule InstrumentedTaskTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true - end) + spansaction = TestHelper.find_infinite_span(spans, %{"nr.entryPoint": true}) refute spansaction.attributes[:not_instrumented] assert spansaction.attributes[:instrumented] == 3 @@ -397,10 +379,7 @@ defmodule InstrumentedTaskTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true - end) + spansaction = TestHelper.find_infinite_span(spans, %{"nr.entryPoint": true}) refute spansaction.attributes[:not_instrumented] assert spansaction.attributes[:instrumented] == "check" diff --git a/test/other_transaction_test.exs b/test/other_transaction_test.exs index 6ae9f479..5969fb70 100644 --- a/test/other_transaction_test.exs +++ b/test/other_transaction_test.exs @@ -186,10 +186,7 @@ defmodule OtherTransactionTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true && attr[:name] == "Test/Error" - end) + spansaction = TestHelper.find_infinite_span(spans, %{"nr.entryPoint": true, name: "Test/Error"}) assert spansaction.attributes[:error] assert spansaction.attributes[:error_reason] =~ "RuntimeError" @@ -220,10 +217,7 @@ defmodule OtherTransactionTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true && attr[:name] == "Test/ExpectedError" - end) + spansaction = TestHelper.find_infinite_span(spans, %{"nr.entryPoint": true, name: "Test/ExpectedError"}) refute spansaction.attributes[:error] end diff --git a/test/sidecar_test.exs b/test/sidecar_test.exs index 3bc4f1ad..c9c7f345 100644 --- a/test/sidecar_test.exs +++ b/test/sidecar_test.exs @@ -256,52 +256,33 @@ defmodule SidecarTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) - spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true - end) + spansaction = TestHelper.find_infinite_span(spans, %{"nr.entryPoint": true}) assert spansaction.attributes[:root] == "YES" refute spansaction.attributes[:async_nolink] assert spansaction.attributes[:async_nolink_connected] == "YES" assert spansaction.attributes[:async_stream_nolink_connected] == "YES" - tx_root_process_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "Transaction Root Process" - end) + tx_root_process_span = TestHelper.find_infinite_span(spans, "Transaction Root Process") task_triggering_function_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "SidecarTest.Traced.instrumented_task_async_nolink/1" - end) + TestHelper.find_infinite_span(spans, "SidecarTest.Traced.instrumented_task_async_nolink/1") assert task_triggering_function_span.attributes[:"parent.id"] == tx_root_process_span[:id] task_triggered_process_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "Process" && - attr[:"parent.id"] == task_triggering_function_span[:id] - end) + TestHelper.find_infinite_span(spans, %{name: "Process", "parent.id": task_triggering_function_span[:id]}) - hey_function_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "SidecarTest.Traced.hey/0" - end) + hey_function_span = TestHelper.find_infinite_span(spans, "SidecarTest.Traced.hey/0") assert hey_function_span.attributes[:"parent.id"] == task_triggered_process_span[:id] connected_stream_task_process_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"parent.id"] == task_triggered_process_span[:id] - end) + TestHelper.find_infinite_span(spans, %{"parent.id": task_triggered_process_span[:id]}) assert connected_stream_task_process_span.attributes[:name] == "Process" - hello_function_span = - Enum.find(spans, fn %{attributes: attr} -> - attr[:name] == "SidecarTest.Traced.hello/0" - end) + hello_function_span = TestHelper.find_infinite_span(spans, "SidecarTest.Traced.hello/0") assert hello_function_span.attributes[:"parent.id"] == connected_stream_task_process_span[:id] end @@ -345,9 +326,7 @@ defmodule SidecarTest do [%{spans: spans}] = TestHelper.gather_harvest(TelemetrySdk.Spans.Harvester) spansaction = - Enum.find(spans, fn %{attributes: attr} -> - attr[:"nr.entryPoint"] == true && attr[:name] == "Test/double_connect_test" - end) + TestHelper.find_infinite_span(spans, %{name: "Test/double_connect_test", "nr.entryPoint": true}) assert spansaction.attributes[:root] == "YES" assert spansaction.attributes[:async_nolink_connected] == "YES" diff --git a/test/span_event_test.exs b/test/span_event_test.exs index aab08446..85ef967b 100644 --- a/test/span_event_test.exs +++ b/test/span_event_test.exs @@ -139,7 +139,7 @@ defmodule SpanEventTest do get "/hello" do Task.async(fn -> - Process.register(self(), :named_process) + Process.register(self(), :named_task) Process.sleep(5) Traced.http_request() end) @@ -169,15 +169,8 @@ defmodule SpanEventTest do span_events = TestHelper.gather_harvest(Collector.SpanEvent.Harvester) - [function, _, _] = - Enum.find(span_events, fn [ev, _, _] -> - ev[:name] == "SpanEventTest.Traced.function/0" - end) - - [http_request, _, _] = - Enum.find(span_events, fn [ev, _, _] -> - ev[:name] == "External/example.com/HttpClient/GET" - end) + function = TestHelper.find_span(span_events, "SpanEventTest.Traced.function/0") + http_request = TestHelper.find_span(span_events, "External/example.com/HttpClient/GET") assert function[:category] == "generic" assert function[:some] == "attribute" @@ -198,18 +191,12 @@ defmodule SpanEventTest do span_events = TestHelper.gather_harvest(Collector.SpanEvent.Harvester) - [another_span, _, _] = - Enum.find(span_events, fn [ev, _, _] -> - ev[:name] == "another.span" - end) + another_span = TestHelper.find_span(span_events, "another.span") assert another_span[:category] == "generic" assert another_span[:with] == "an attribute" - [single_span, _, _] = - Enum.find(span_events, fn [ev, _, _] -> - ev[:name] == "single.span" - end) + single_span = TestHelper.find_span(span_events, "single.span") assert single_span[:category] == "generic" @@ -227,31 +214,13 @@ defmodule SpanEventTest do ) span_events = TestHelper.gather_harvest(Collector.SpanEvent.Harvester) - - [spansaction_event, _, _] = - Enum.find(span_events, fn [ev, _, _] -> ev[:"nr.entryPoint"] == true end) - - [tx_root_process_event, _, _] = - Enum.find(span_events, fn [ev, _, _] -> ev[:parentId] == spansaction_event[:guid] end) - - [request_process_event, _, _] = - Enum.find(span_events, fn [ev, _, _] -> ev[:parentId] == tx_root_process_event[:guid] end) - - [function_event, _, _] = - Enum.find(span_events, fn [ev, _, _] -> ev[:name] == "SpanEventTest.Traced.hello/0" end) - - [nested_function_event, _, _] = - Enum.find(span_events, fn [ev, _, _] -> ev[:name] == "SpanEventTest.Traced.do_hello/0" end) - - [task_event, _, _] = - Enum.find(span_events, fn [ev, _, _] -> - ev[:pid] && ev[:parentId] == request_process_event[:guid] - end) - - [nested_external_event, _, _] = - Enum.find(span_events, fn [ev, _, _] -> - ev[:name] == "External/example.com/HttpClient/GET" - end) + spansaction_event = TestHelper.find_span(span_events, %{"nr.entryPoint": true}) + tx_root_process_event = TestHelper.find_span(span_events, %{parentId: spansaction_event[:guid]}) + request_process_event = TestHelper.find_span(span_events, %{parentId: tx_root_process_event[:guid]}) + function_event = TestHelper.find_span(span_events, "SpanEventTest.Traced.hello/0") + nested_function_event = TestHelper.find_span(span_events, "SpanEventTest.Traced.do_hello/0") + task_event = TestHelper.find_span(span_events, %{name: :named_task, parentId: request_process_event[:guid]}) + nested_external_event = TestHelper.find_span(span_events, "External/example.com/HttpClient/GET") [[_intrinsics, tx_event]] = TestHelper.gather_harvest(Collector.TransactionEvent.Harvester) diff --git a/test/support/test_helper.ex b/test/support/test_helper.ex index 9162df0b..74780a41 100644 --- a/test/support/test_helper.ex +++ b/test/support/test_helper.ex @@ -59,6 +59,26 @@ defmodule TestHelper do end) end + def find_infinite_span(spans, attrs) when is_map(attrs) do + Enum.find(spans, fn %{attributes: attributes} -> + Enum.all?(attrs, fn {k, v} -> attributes[k] == v end) + end) + end + + def find_infinite_span(spans, name) do + Enum.find(spans, fn %{attributes: attr} -> + attr[:name] == name + end) + end + + def find_span(spans, attrs) when is_map(attrs) do + Enum.find_value(spans, fn + [span, _, _] -> + Enum.all?(attrs, fn {k, v} -> span[k] == v end) && + span + end) + end + def find_span(spans, name) do Enum.find_value(spans, fn [%{name: ^name} = span, _, _] -> span diff --git a/test/transaction_trace_test.exs b/test/transaction_trace_test.exs index ba5df2cf..7e23cd66 100644 --- a/test/transaction_trace_test.exs +++ b/test/transaction_trace_test.exs @@ -332,11 +332,9 @@ defmodule TransactionTraceTest do TestHelper.request(TestPlugApp, conn(:get, "/huge_args")) - [span, _, _] = + span = TestHelper.gather_harvest(Collector.SpanEvent.Harvester) - |> Enum.find(fn [sp, _, _] -> - sp.name == "TransactionTraceTest.HelperModule.do_work/1" - end) + |> TestHelper.find_span("TransactionTraceTest.HelperModule.do_work/1") assert String.length(span[:"tracer.args"]) < 500 end @@ -347,11 +345,9 @@ defmodule TransactionTraceTest do TestHelper.request(TestPlugApp, conn(:get, "/huge_args")) - [span, _, _] = + span = TestHelper.gather_harvest(Collector.SpanEvent.Harvester) - |> Enum.find(fn [sp, _, _] -> - sp.name == "TransactionTraceTest.HelperModule.do_work/1" - end) + |> TestHelper.find_span("TransactionTraceTest.HelperModule.do_work/1") assert span[:"tracer.args"] == "[DISABLED]" end @@ -361,19 +357,15 @@ defmodule TransactionTraceTest do TestHelper.request(TestPlugApp, conn(:get, "/huge_args")) - [span, _, _] = + span = TestHelper.gather_harvest(Collector.SpanEvent.Harvester) - |> Enum.find(fn [sp, _, _] -> - sp.name == "TransactionTraceTest.HelperModule.work_hard/1" - end) + |> TestHelper.find_span("TransactionTraceTest.HelperModule.work_hard/1") assert span[:"tracer.args"] == "[DISABLED]" - [span, _, _] = + span = TestHelper.gather_harvest(Collector.SpanEvent.Harvester) - |> Enum.find(fn [sp, _, _] -> - sp.name == "TransactionTraceTest.HelperModule.do_work/1" - end) + |> TestHelper.find_span("TransactionTraceTest.HelperModule.do_work/1") refute span[:"tracer.args"] == "[DISABLED]" end @@ -383,19 +375,15 @@ defmodule TransactionTraceTest do TestHelper.request(TestPlugApp, conn(:get, "/transaction_trace")) - [span, _, _] = + span = TestHelper.gather_harvest(Collector.SpanEvent.Harvester) - |> Enum.find(fn [sp, _, _] -> - sp.name == "TransactionTraceTest.ExternalService.secret_query/1" - end) + |> TestHelper.find_span("TransactionTraceTest.ExternalService.secret_query/1") assert span[:"tracer.args"] == "[DISABLED]" - [span, _, _] = + span = TestHelper.gather_harvest(Collector.SpanEvent.Harvester) - |> Enum.find(fn [sp, _, _] -> - sp.name == "TransactionTraceTest.ExternalService.query/1" - end) + |> TestHelper.find_span("TransactionTraceTest.ExternalService.query/1") refute span[:"tracer.args"] == "[DISABLED]" end