Monitoring Azure resources with Zabbix

Posted: August 21, 2018 in Azure

I used this post as starting point.

Creating Azure application

(ID/keys will be used for authentication to Azure)

In Azure portal click Azure Active directory-App registrations-new App registration



In App registrations select All apps from drop-down menu-click on Zabbix application


Write down application ID (we’ll use it on scripts)


Click Settings-Keys-set a name,duration and click Save


Write down key


Write down TenantID


Write down Subscription ID-from Azure dashboard,click Cost Management + Billing under my subscription write subscription ID


Give application read rights to resource group

click on resource group-Access control (IAM)


click Add-select Reader role-Assign access to Azure AD user,group or application and select Zabbix application


Install powershell on Zabbix server (CentOS)

# Register the Microsoft RedHat repository
curl | sudo tee /etc/yum.repos.d/microsoft.repo
# Install PowerShell
sudo yum install -y powershell

Extract and copy all files in to /usr/lib/zabbix/externalscripts, make sure *.sh files are executable

Supported services are SQL,storage account,Virtual Machines and Virtual Network gateway

All available services and metric:

Time periods (monitoring intervals) are called timegrains

time_grains = {
"PT1M" => "1 Minute",
"PT5M" => "5 Minutes",
"PT1H" => "1 Hour",
"PT12H" => "12 Hours"

In trapper.ps1 and azure.ps1 substitute TenantID,applicationID, application key in appropriate sections/

Files can be downloaded from here


For VM:

./ resource group subscription vm

For SQL:

./ resource group subscription sql

For network gateway:

./ resource group subscription vng

For Storage account

./ resource group subscription storage

[root@ip-172-31-27-77 externalscripts]# ./ RG  subscriptionD storage
"{#ID}": "/subscriptions/111-222-333/resourceGroups/RG/providers/Microsoft.Storage/storageAccounts/storageaccount",
"{#STORAGEACCOUNT}": "storageaccount"
"{#ID}": "/subscriptions/111-222-333/resourceGroups/RG/providers/Microsoft.Storage/storageAccounts/storageaccount",
"{#STORAGEACCOUNT}": "storageaccount"
"{#ID}": "/subscriptions/111-222-333/resourceGroups/RG/providers/Microsoft.Storage/storageAccounts/storageaccount",
"{#STORAGEACCOUNT}": "storageaccount"

give ownership of azure.json to zabbix user:

chown zabbix:zabbix azure.json

create dummy host and attach template, specify resource group and subscription ID


Test zabbix trapper:

./ zabbix-dummy-host

if no issues,create cron job for trapper (for example to run it every 15 minutes):

*/15 * * * * /usr/lib/zabbix/externalscripts/ dummy-host

  1. Uladzislau Dadzimau says:

    I believe you might want to put a back-link to the original source of your code:

    Liked by 1 person

  2. jane says:

    Hello. Thanks for your detailed manuals. By the way, I’m the beginner of azure-zabbix.
    I wonder what you mean about the below sentence.

    “Copy all files in to /usr/lib/zabbix/externalscripts, make sure *.sh files are executable”

    Which files do I need to make it as a zip file ? Where are the *.sh files located?
    I would appreciate your reply asap.


  3. Paulo Rezende says:

    Dear good afternoon

    Next all the tutorial with no error, however, if you test an integration, do not call anything. Look:



  4. Paulo Rezende says:



  5. Dragan979

    I try test here but I have one error

    You cannot call a method on a null-valued expression.
    At /usr/lib/zabbix/externalscripts/azure/azure.ps1:32 char:13
    + if ($token.expires_on.ToInt64($null) – [int64]((Get-Date).ToU …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull


    • dragan979 says:

      azure script should be under /usr/lib/zabbix/externalscripts/azure.ps1, not inside azure folder


      • Mun says:

        I try to run: ./ XXXXXX XXXXXXXXXXXXXXXXXXXXXX but there is no result appears. Only shows:
        and my azure.json is not empty.
        On Zabbix GUI appears “value should be json object”
        Any suggestion?


  6. Dmitriy says:

    Hi! When I run the script from console with “sudo -u zabbix”, it returns correct data, but at zubbix console there is error “value should be a JSON object”. There are no particular errors In the zabbix_server.log with debug level = 5… Do you have any ideas where to look?


    • dragan979 says:

      hmm, never faced similar issue, i suggest to create cron job to run every 40 minutes under zabbix user, i suspect Azure keys expires every 60 minutes.


    • Dmitriy says:

      I’ve found the issue – create not lld item with the same external check key and type “text” and get the error : ./azure.ps1 not found… I’ve created .sh with the relevant path and this script successfully runs at the console and doesn’t work with as external check…


  7. Thomas says:

    Can you please re-upload the file the onedrive link is not working ?


  8. Thomas says:

    It’s working sorry.


  9. Daniel Cardoso says:

    Please, can you help me?
    What i did wrong?
    The only change I made was to insert the PWSH because it was WSH only.

    [root@zabbixlab externalscripts]# ./

    Unhandled Exception: System.ArgumentNullException: Value cannot be null.
    Parameter name: value
    at System.String.IndexOf(String value, Int32 startIndex, Int32 count, StringComparison comparisonType)
    at Microsoft.PowerShell.CommandLineParameterParser.MatchSwitch(String switchKey, String match, String smallestUnambiguousMatch)
    at Microsoft.PowerShell.CommandLineParameterParser.EarlyParseHelper(String[] args)
    at Microsoft.PowerShell.CommandLineParameterParser.EarlyParse(String[] args)
    at Microsoft.PowerShell.UnmanagedPSEntry.Start(String consoleFilePath, String[] args, Int32 argc)
    at Microsoft.PowerShell.ManagedPSEntry.Main(String[] args) in /PowerShell/src/powershell/Program.cs:line 22
    ./ line 1: 53019 Aborted pwsh /usr/lib/zabbix/externalscripts/trapper.ps1 $1


  10. Ayush says:

    one drive link is not working .. Kindly Help !!


  11. Greg says:


    Nice post!

    Does the following mean AppServices cannot be monitored?

    “Supported services are SQL,storage account,Virtual Machines and Virtual Network gateway”


    • dragan979 says:

      Yes, of course, “supported” means what is important for me to monitor 🙂

      But i can’t help you with that, try using my pattern to monitor what you need


  12. Test says:

    Thank you very much for your post.


  13. currently following this when I get to the IAM role assignment it can’t see my zabbix application.
    would it be possible to update the azure screen shots so they match the current azure portal?


  14. Prathamesh says:

    How much does this Zabbix application cost on azure?


  15. username says:


    I’ve re-factored original code and solution to be more flexible and modular:

    Everything is on the GitHub now, so you guys are free to create issues.

    Liked by 1 person

  16. Rafael Christófano says:


    I run ./ myRG Subscription ID sql

    I am getting this message:

    Line 165 _servers = (Invoke-RestMethod -Uri $uri -Headers $azure_header -Metho …

    The cmdlet cannot run because the -ContentType parameter is not a valid Content-Type header. Specify a valid Content-Type for
    | -ContentType, then retry. To suppress header validation, supply the -SkipHeaderValidation parameter.


  17. Guilherme says:

    does it work on mysql? I have this error:

    s: /data/zabbix/externalscripts/azure.ps1:1
    Line |
    1 | s
    | ~
    | The term ‘s’ is not recognized as a name of a cmdlet, function, script file, or executable program. Check the spelling of the name, or if a path was
    | included, verify that the path is correct and try again.

    InvalidOperation: /data/zabbix/externalscripts/azure.ps1:32
    Line |
    32 | if ($token.expires_in.ToInt64($null) – [int64]((Get-Date).ToU …
    | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~
    | You cannot call a method on a null-valued expression.

    Invoke-RestMethod: /data/zabbix/externalscripts/azure.ps1:165
    Line |
    165 | … _servers = (Invoke-RestMethod -Uri $uri -Headers $azure_header -Metho …
    | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~
    | The cmdlet cannot run because the -ContentType parameter is not a valid Content-Type header. Specify a valid Content-Type for -ContentType, then
    | retry. To suppress header validation, supply the -SkipHeaderValidation parameter.



Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s