Powered by AppSignal & Oban Pro

Telemetry with AzureSDK

livebooks/telemetry.livemd

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