· Vojtech Svoboda · Observabilita  · 6 min čtení

Jak na metriky z Azure služeb

Jak exportovat a vizualizovat metriky z Azure služeb a obejít omezení Azure portálu

Jak exportovat a vizualizovat metriky z Azure služeb a obejít omezení Azure portálu

Export metrik z Azure a jejich vizualizace

Když jsem se poprvé snažil získat 3 měsíční pohled na metriky Azure, myslel jsem si, že se jedná o jednoduchý úkol. Prostě stačí v portálu natáhnout časovou osu grafu. Spoiler: nestačí.

Azure umožňuje v jednom grafu zobrazit maximálně 30 dní dat (je to z důvodů výkonu stránek). A co hůř — ve výchozím nastavení uchovává pouze 93 dní (pokud metriky neposíláte do Log Analytics Workspace).

Takže pokud chcete souvislý graf přes tři měsíce, nemůžete jen tak “odscrollovat zpět”. Musíte metriky exportovat, pospojovat a vytvořit vlastní vizualizaci. Přesně to jsem udělal — a tady je jak.


Omezení Azure

Nejdřív bych chtěl stručně shrnout, co Azure umí a neumí, než se pustím do popsání celého postupu.

  • Doba uchování: Azure uchovává metriky ve výchozím nastavení 93 dní.
  • Grafy v portálu: V grafu lze zobrazit maximálně 30 dní dlouhý interval.
  • Export přes CLI: Přes Azure CLI lze na jeden dotaz vyexportovat také maximálně 30 dní.

Z toho plyne, že jakýkoli požadavek na graf, zobrazující časové období delší než měsíc, vyžaduje export metrik a práci s nimi mimo Azure (datové agregace). Jakmile to víte, celý proces se změní na pipeline “stáhni, zpracuj, vizualizuj”.


Práce s Azure CLI

Prvním krokem je dostat data z Azure ven. Azure CLI je jednoduchý a flexibilní nástroj — je snadno skriptovatelný, multiplatformní a ideální pro automatizaci (alternativou by bylou použití Azure API). Abych obešel limit 30 dnů na dotaz, opakuji příkaz v cyklu pro celé požadované období. V každé iteraci upravuji start_time a end_time tak, abych sekvenčně exportoval 30denní úseky, dokud nezískám kompletní dataset pro požadovaný časový rámec.

Základní příkaz vypadá takto:

az monitor metrics list \
    --resource "$resource_id" \
    --metric "$metric_name" \
    --start-time "$start_time" \
    --end-time "$end_time" \
    --interval PT1H \
    --aggregation Total \
    --output json > "$output_file"

Podrobné informace k tomuto příkazu jsou v dokumentaci Azure.


Vysvětlení proměnných parametrů

Pojďme si nyní vysvětlit nejdůležitější parametry příkazu:

  • resource_id – Azure Resource ID v plném formátu. Příklad: /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.ContainerService/managedClusters/myCluster

  • metric_name – Název metriky, kterou chcete exportovat (např. node_network_in_bytes). Každá služba Azure nabízí jiné metriky.

  • start_time / end_time – Časový rozsah ve formátu YYYY-MM-DDThh:mm:ssZ. Maximum: 30 dní na jeden dotaz.

  • interval – Zde nastaveno na hodinový (PT1H), ale můžete přizpůsobit podle potřeby. Pro více podrobností se podívejte na dokumentaci Azure o agregaci metrik.

  • Formát výstupu – Používám JSON, protože se s ním dobře pracuje v kódu, ale Azure podporuje více formátů.


Jak vypadá výstup

Po spuštění příkazu Azure vrátí JSON dokument s poměrně komplexní strukturou. Obsahuje metadata, časové intervaly a vlastní hodnoty metrik.

Zkrácený příklad vypadá takto:

{
  "interval": "PT1H",
  "timespan": "2025-04-16T00:00:00Z/2025-05-15T23:59:59Z",
  "value": [
    {
      "displayDescription": "Network received bytes",
      "timeseries": [
        {
          "data": [
            { "timeStamp": "2025-04-16T00:00:00Z", "total": 11986356390.0 },
            ...
            { "timeStamp": "2025-04-16T01:00:00Z", "total": 8171367295.0 }
          ]
        }
      ],
      "unit": "Bytes"
    }
  ]
}

Pro nás je nejdůležitější přístup k datům, které jsou v následující JSONPath:

.value[].timeseries[].data[]

Tam se podíváme dál.


Další krok - vizualizace

Jakmile máme základní dataset, můžeme otevřít Excel a pracovat v něm. Ale JSON (nebo i CSV) je těžko čitelný formát pro člověka (nebo i Excel) a datech se špatně hledají klíčové trendy.

Dobrý graf z těchto čísel udělá něco intuitivního. Snadno vidíte peaky, trendy a anomálie. Proto je dalším krokem vykreslení dat v Pythonu.


Zpracování dat v Pythonu

Než něco vykreslíme, je potřeba vytáhnout relevantní data z JSONu a zjednodušit je pro další práci. Postupoval jsem takto:

with open(json_file, 'r') as f:
    data = json.load(f)

metrics_data = []
for datapoint in data['value'][0]['timeseries'][0]['data']:
    if 'timeStamp' in datapoint:
        timestamp = datetime.fromisoformat(
            datapoint['timeStamp'].replace('Z', '+00:00'))
        value = datapoint.get('total')

        # Convert bytes to GiB
        value_gb = value / (1024**3)

        metrics_data.append({
            'timestamp': timestamp,
            'value': float(value),
            'value_gb': float(value_gb)
        })

Z mého pohledu:

  • Načítám JSON soubor pomocí Pythonu.
  • Procházím každý datový bod.
  • Převádím hodnoty z bajtů na gibibajty (protože pracovat s miliardami není příliš uživatelsky přívětivé).
  • Výsledky ukládám do jednoduchého seznamu slovníků (ano, čeština se zde nepotkává s terminologií programátorů, chápejme tedy List of Dictionaries).

Vykreslení dat

Se strukturovanými daty je vykreslení jednoduché. Pro práci s daty jsem využil knihovny Pandas a matplotlib, které jsou v Python komunitě široce používané. Pandas usnadní třídění a organizaci dat, Matplotlib vykreslování do grafu.

Následující úryvky kódu jsou součástí Python skriptu, který jsem použil, ale pojďme si je rozložit pro lepší pochopení procesu.

V prvním úryvku vytvářím samotný graf. Poté načtu data do Pandas DataFrames, primárně pro jednodušší manipulaci s daty. V tomto příkladu data moc neupravuji, pouze je řadím podle časového razítka (timestamp) pro případ, že by mi Azure poslal neseřazený seznam. Pokud bych však chtěl kombinovat více časových období dat dohromady, nebo provádět jinou manipulaci s daty, DataFrames by mi úkol značně usnadnily.

Více informací o těchto knihovnách najdete v dokumentaci Matplotlib a dokumentaci Pandas.

# Named imports
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Create figure
fig, ax = plt.subplots(1, 1, figsize=(16, 8))

# Set title
fig.suptitle("Metrics graph", fontsize=16, fontweight='bold', y=0.95)

# Get data into dataframes and sort them
df = pd.DataFrame(metrics_data)
df = df.sort_values('timestamp')
# Plot line
ax.plot(df['timestamp'], df['value_gb'],
                color='#1f77b4',
                linewidth=2,
                alpha=0.9)

V této chvíli mám čistou křivku se stínováním — pro člověka mnohem čitelnější a více vypovídající než JSON.


Jak si graf vylepšit

Dobrý graf není jen o čáře — jde o to, aby byly detaily jasné bez zahlcení. Tato část kódu nastavuje jednotlivé části grafu. Vypíchnul bych zde nastavení osy X, kde kód přizpůsobuje popisky os rozsahu dat, aby se datumy nehromadily a zůstaly čitelné.

# Add subtle fill under the line
ax.fill_between(df['timestamp'], df['value_gb'],
                alpha=alpha_fill, color=fill_color)

# Clean, minimal styling
ax.set_xlabel('Time', fontsize=11)
ax.set_ylabel('Network Traffic (GB)', fontsize=11)

# Minimal grid
ax.grid(True, alpha=0.3, linestyle='-', linewidth=0.5)
ax.set_axisbelow(True)

# Format x-axis - adaptive based on data range
date_range = (df['timestamp'].max() - df['timestamp'].min()).days

if date_range <= 7:  # Week or less - daily ticks
    ax.xaxis.set_major_locator(mdates.DayLocator(interval=1))
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
elif date_range <= 31:  # Month or less - every few days
    ax.xaxis.set_major_locator(mdates.DayLocator(interval=3))
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
else:  # Longer periods - weekly
    ax.xaxis.set_major_locator(mdates.WeekdayLocator(interval=1))
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))

plt.setp(ax.xaxis.get_majorticklabels(),
         rotation=45, fontsize=9, ha='right')

# Clean background
ax.set_facecolor('#ffffff')

# Plot padding adjustments
plt.tight_layout()
plt.subplots_adjust(top=0.9, bottom=0.15)

Uložení grafu

Jakmile jsme spokojení s výsledkem, uložíme graf jako PNG pro sdílení, reporty nebo archív.

output_file = os.path.join(output_dir, 'my_awesome_graph.png')
plt.savefig(output_file, dpi=300, bbox_inches='tight', facecolor='white')
plt.close()

Výsledek

Výsledný graf může vypadat například takto: Příklad grafu Azure metrik


Závěrem

Tento postup není nejrychlejší — musíte exportovat, transformovat a vizualizovat — ale nabízí skvělou kontrolu (a pro mě osobně je mnohem rychlejší, než práce v Excelu).

Už nejsme svázáni 30denním oknem Azure. Můžeme vidět větší perspektivu, když poskládáme data z více měsíců, a grafy si přizpůsobíme podle sebe.

A upřímně, je dost uspokojující vzít JSON z Azure a proměnit ho v pěknou a přehlednou vizualizaci.

Zpět na blog