poniedziałek, 27 lutego 2023

GCP Metryki Pub/Sub

 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. 

Brak komentarzy:

Prześlij komentarz