C# で Microsoft Azure のリソースのメトリック取得

Microsoft Azure のリソースのメトリックを取得したかった。Azure SQL Database のとか。

Azure SDK for .NET の Azure.Monitor.Query 使えば、任意のリソースのメトリックを取得できた。

www.nuget.org

using Azure.Identity;
using Azure.Monitor.Query;
using Azure.Monitor.Query.Models;

var client = new MetricsQueryClient(
    credential: new DefaultAzureCredential());

var result = await client.QueryResourceAsync(
    resourceId: "<リソース ID>",
    metrics: new[]
    {
        "cpu_percent",
    },
    options: new MetricsQueryOptions
    {
        Aggregations =
        {
            MetricAggregationType.Average,
        },
        // 間隔
        Granularity = TimeSpan.FromMinutes(5),
        // 期間
        TimeRange = new QueryTimeRange(
            start: new DateTimeOffset(2023, 5, 29, 0, 0, 0, TimeSpan.Zero),
            end: new DateTimeOffset(2023, 5, 30, 0, 0, 0, TimeSpan.Zero)),
    });

foreach (var metric in result.Value.Metrics)
{
    Console.WriteLine(metric.Name);
    Console.WriteLine(metric.Description);
    Console.WriteLine(metric.Unit);
    foreach (var time in metric.TimeSeries)
    {
        foreach (var value in time.Values)
        {
            Console.WriteLine(value.Average);
        }
    }
    Console.WriteLine();
}

Console.ReadLine();

なお、TimeRange で UTC 以外の DateTimeOffset を指定すると、下記のようなレスポンスが返ってきた。

{"code":"BadRequest","message":"Detected invalid time interval input: 2023-05-29T00:00:00.0000000 09:00/2023-05-30T00:00:00.0000000 09:00, supported Iso 8601 time interval format: (Datetime/Datetime, Datetime/Duration, Duration/Datetime, Duration)"}

UTC しか対応してないのか?でも、Azure ポータルだと現地時間選べるし。SDK のバグでは。

ひとまず UTC で指定して、表示を工夫するしかないか。