Telemetry with AzureSDK
Mix.install([
# {:azure_sdk, path: Path.expand("..", __DIR__)},
{:azure_sdk, "~> 0.4.1"},
])
Overview
AzureSDK emits Telemetry events for requests, retries, signing, and service
operations. This notebook attaches handlers, then performs a blob upload against
Azurite (docker compose up -d).
{:ok, stats} = Agent.start_link(fn -> %{attempts: 0, durations: []} end)
:telemetry.attach(
"ex-azure-attempt",
[:azure_sdk, :request, :attempt],
fn _event, _measurements, metadata, _ ->
Agent.update(stats, fn s -> %{s | attempts: s.attempts + 1} end)
IO.inspect(metadata, label: "request attempt")
end,
nil
)
:telemetry.attach(
"ex-azure-stop",
[:azure_sdk, :request, :stop],
fn _event, %{duration: duration}, metadata, _ ->
Agent.update(stats, fn s -> %{s | durations: [duration | s.durations]} end)
IO.inspect({duration, metadata}, label: "request stop")
end,
nil
)
:telemetry.attach(
"ex-azure-blob",
[:azure_sdk, :blob, :put],
fn _event, measurements, metadata, _ ->
IO.inspect({measurements, metadata}, label: "blob put")
end,
nil
)
:ok
Emit events with a blob upload
credential =
AzureSDK.Identity.SharedKeyCredential.new(
"devstoreaccount1",
"Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="
)
client =
AzureSDK.Storage.Client.new(
account: "devstoreaccount1",
credential: credential,
endpoint: "http://127.0.0.1:10000/devstoreaccount1"
)
container = "telemetry-demo"
case AzureSDK.Storage.Container.exists?(client, container) do
true -> :ok
false -> {:ok, _} = AzureSDK.Storage.Container.create(client, container)
{:error, error} -> raise "Azurite Blob is not reachable: #{error.message}"
end
{:ok, _} = AzureSDK.Storage.Blob.upload(client, container, "metric.txt", "telemetry")
Agent.get(stats, & &1)
Clean up
{:ok, :deleted} = AzureSDK.Storage.Blob.delete(client, container, "metric.txt")
{:ok, :deleted} = AzureSDK.Storage.Container.delete(client, container)
:telemetry.detach("ex-azure-attempt")
:telemetry.detach("ex-azure-stop")
:telemetry.detach("ex-azure-blob")
:ok