Övervaka Azure Service Bus med Elasticsearch & Azure Function med .NET Core 3.0

25 Nov 2019 - 10 minuters läsning

Problemet

De flesta som någon gång har suttit med Azure Service Bus som transportlager i någon form av event-driven arkitektur har förmodligen använt sig av Paolo Salvatoris WinForms-projekt, Service Bus Explorer.

Personligen har jag haft mycket nytta av Service Bus Explorer men jag är uppriktigt förvånad att det är det enda tillgängliga verktyg i sin klass som finns tillgängligt för att övervaka och titta på köer i Service Bus, och applikationen saknar relevanta funktioner som jag som utvecklare och systemförvaltare behöver för att göra ett bra jobb.

Behovet att övervaka och kunna larma när meddelanden börjar samlas upp på kö eller DLQ har varit återkommande de senaste sex månaderna. Det specifika fallet jag har arbetat i har ställt krav på lösningen att kunna göra följande:

  1. 1. Monitorera antal meddelanden på deadletter-kö (Azure Service Bus)
  2. 2. Identifiera problem utifrån regler som kan konfigureras, larma och då skicka e-post
  3. 3. Kontinuerligt uppdatera ett Elasticsearch-index med detaljer om köer
  4. 4. Visualisera detta Elasticsearch-index på en Dashboard i Elasticsearch

För att göra detta har vi tagit fram en enkel Azure Function som kör var femte minut, larmar om konfigurationen påbjuder och uppdaterar Elasticsearch med rätt data. Några enkla steg för att få till den här lösningen.

Sätt upp Elasticsearch Index

Följande curl skapar ett index i Elasticsearch med namnet example-queue.

curl -X PUT https://{username}:{password}.{elasticsearch-instance}:9243/example-queue 

Sätt upp Azure Function

I Azureportalen sätter vi upp en Azure Function-container. Vi kallar den för example-queue-monitor.

Azure Function

När det finns en Azure Function på plats kan vi passa på att sätta upp den med rätt inställningar.

Advanced edit

[

{
"name": "AlertRules:FiveMinutePercentageThreshold",
"value": "50",
"slotSetting": false
},
{
"name": "AlertRules:HighThreshold",
"value": "100",
"slotSetting": false
},
{
"name": "AlertRules:LowThreshold",
"value": "2",
"slotSetting": false
},
{
"name": "AlertRules:MediumThreshold",
"value": "10",
"slotSetting": false
},
{
"name": "APPINSIGHTS_INSTRUMENTATIONKEY",
"value": "",
"slotSetting": false
},
{
"name": "AzureWebJobsStorage",
"value": "",
"slotSetting": false
},
{
"name": "ElasticConnection",
"value": "https://{username}:{password}.{elasticsearch-instance}:9243",
"slotSetting": false
},
{
"name": "ElasticIndex",
"value": "example-queue",
"slotSetting": false
},
{
"name": "EmailConfig:Recipient",
"value": "where.to.send.the.alarm@example.com",
"slotSetting": false
},
{
"name": "EmailConfig:Sender",
"value": "valid.postmark.sender@example.com",
"slotSetting": false
},
{
"name": "Environment",
"value": "user for logging",
"slotSetting": false
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~2",
"slotSetting": false
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "dotnet",
"slotSetting": false
},
{
"name": "LogQueue",
"value": "elastic-log-index",
"slotSetting": false
},
{
"name": "PostMarkWarningTemplateId",
"value": "15046353",
"slotSetting": false
},
{
"name": "ServiceBusConnection",
"value": "Endpoint=sb://my-servicebus.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey={key}",
"slotSetting": false
},
{
"name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
"value": "",
"slotSetting": false
},
{
"name": "WEBSITE_CONTENTSHARE",
"value": "",
"slotSetting": false
},
{
"name": "WEBSITE_RUN_FROM_PACKAGE",
"value": "",
"slotSetting": false
}
]

ServiceBusMonitorFunction

ServiceBusMonitorFunction finns tillgänglig på GitHub (uppskattar varmt förbättringsförslag ;) ). Vi publicerar funktionen till vår Azure Function och kör igenom den en gång.

Azure Function running

Elasticsearch

Förutom vårt nya index, example-queue, behöver vi ett index pattern för att kunna visualisera data på ett meningsfullt sätt. Vi skapar det i Elasticsearch dashboard. I vårt fall kan vi ha ett exakt mönster som också heter example-queue.

I steg 2 kan vi välja om vi vill använda Created eller Updated som Time-attribut i Elasticsearch, som används för filtrering. I vårt fall använder vi Updated.

Elasticsearch Dashboard

Det finns många olika sätt att visualisera data i Elasticsearch men för ändamålet nöjer vi oss med ett enkelt cirkeldiagram.

Cirkeldiagram

Så har vi till slut en mycket simpel övervakning med mailutskick när meddelanden byggs upp på DLQ. Några saker vi vet om är att nuvarande lösning skickar ett mail var femte minut om inte deadletter-köerna bearbetas och töms, det kan ju vara både bra och dåligt beroende på vem som får mailen ;)

Name

Skriven av

Marcus Nordquist