Korzystając z SDK Google możemy w łatwy sposób pobrać metryki dla Pub/Sub.
Aby pobrać metryki dla projektu skorzystamy z biblioteki Google.Cloud.Monitoring.V3. Pozwala ona pobrać metryki dla większości serwisów oferowanych przez GCP. Nas w tym przypadku interesować będą metryki dla Pub/Suba.
Spis metryk które możemy pobrać znajduje się w oficjalnej dokumentacji: https://cloud.google.com/monitoring/api/metrics_gcp#gcp-pubsub
Rozpoczynamy od instalacji biblioteki, które umożliwi pobranie metryk:
API dla jednego zapytania obsługuje pobranie tylko jednej metryki. Nie możemy zatem w jednym zapytaniu pobrać np. czasu najstarszej wiadomości jak i ilości wiadomości oczekujących na subskrypcji.
var metricServiceClient = await MetricServiceClient.CreateAsync();
var request = new ListTimeSeriesRequest
{
ProjectName = new ProjectName("project_id"),
Filter = "metric.type = \"pubsub.googleapis.com/subscription/oldest_unacked_message_age\"",
Interval = new TimeInterval
{
StartTime = Timestamp.FromDateTime(DateTime.UtcNow.AddMinutes(-10)),
EndTime = Timestamp.FromDateTime(DateTime.UtcNow)
},
View = ListTimeSeriesRequest.Types.TimeSeriesView.Full
};
var results = metricServiceClient.ListTimeSeriesAsync(request);
await foreach (var result in results)
{
Console.WriteLine(result.Resource.Labels["subscription_id"]);
foreach (var point in result.Points)
{
Console.Write(point.Interval.StartTime);
switch (point.Value.ValueCase)
{
case TypedValue.ValueOneofCase.BoolValue:
Console.WriteLine(point.Value.BoolValue);
break;
case TypedValue.ValueOneofCase.Int64Value:
Console.WriteLine(point.Value.Int64Value);
break;
case TypedValue.ValueOneofCase.DoubleValue:
Console.WriteLine(point.Value.DoubleValue);
break;
case TypedValue.ValueOneofCase.StringValue:
Console.WriteLine(point.Value.StringValue);
break;
case TypedValue.ValueOneofCase.DistributionValue:
Console.WriteLine(point.Value.DistributionValue);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
Console.WriteLine(new string('-', 50));
}
Wynik po wykonaniu kodu:
Otrzymany wynik zgodnie z dokumentacją podany jest w sekundach.
A teraz przykład jak odfiltrować subskrypcję po jej nazwie (subscription_id).
request = new ListTimeSeriesRequest
{
ProjectName = new ProjectName("project_id"),
Filter = "metric.type = \"pubsub.googleapis.com/subscription/num_undelivered_messages\" AND (resource.label.subscription_id = starts_with(\"aaa.\") OR resource.label.subscription_id = starts_with(\"bbb.\"))",
Interval = new TimeInterval
{
StartTime = Timestamp.FromDateTime(DateTime.UtcNow.AddMinutes(-1)),
EndTime = Timestamp.FromDateTime(DateTime.UtcNow)
},
View = ListTimeSeriesRequest.Types.TimeSeriesView.Full
};
Oczywiście jeżeli nie chcemy wykonywać operacji typu like możemy od razu podać nazwę subskrypcji.
Pobrać możemy dowolną metrykę z oficjalnej specyfikacji. Metryki mogą być agregowane w różne okienka czasowe (minutowe, lub dłuższe). Za pomocą parametru Interval kontrolujemy przedział czasowy otrzymanych wyników.