zabbix_export: version: '7.0' template_groups: - uuid: c2c162144c2d4c5491c8801193af4945 name: Templates/Cloud host_groups: - uuid: 748ad4d098d447d492bb935c907f652f name: Databases - uuid: 137f19e6e2dc4219b33553b812627bc2 name: 'Virtual machines' templates: - uuid: fa58228fee8a4e34a7c6503950d1c615 template: 'Azure by HTTP' name: 'Azure by HTTP' description: | This template is designed to monitor Microsoft Azure by HTTP. It works without any external scripts and uses the script item. Currently the template supports the discovery of virtual machines (VMs), Cosmos DB for MongoDB, Storage accounts, Microsoft SQL, MySQL, and PostgreSQL servers. Setup: 1. Create an Azure service principal via the Azure command-line interface (Azure CLI) for your subscription. `az ad sp create-for-rbac --name zabbix --role reader --scope /subscriptions/` See https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli for more details. 2. Link the template to a host. 3. Configure the macros: `{$AZURE.APP.ID}`, `{$AZURE.PASSWORD}`, `{$AZURE.TENANT.ID}`, and `{$AZURE.SUBSCRIPTION.ID}`. You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/ Generated by official Zabbix template tool "Templator" 2.0.0 vendor: name: Zabbix version: 7.0-0 groups: - name: Templates/Cloud items: - uuid: 7b2fe9a7ee164718933eb456b0068fea name: 'Azure: Get errors' type: DEPENDENT key: azure.get.errors delay: '0' history: 7d trends: '0' value_type: TEXT description: 'A list of errors from API requests.' preprocessing: - type: JSONPATH parameters: - $.errors - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.get.resources tags: - tag: component value: raw triggers: - uuid: 502cb582546046a29267715763c46bff expression: 'length(last(/Azure by HTTP/azure.get.errors))>0' name: 'Azure: There are errors in requests to API' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'Zabbix has received errors in response to API requests.' tags: - tag: scope value: availability - uuid: fb6abf3631b240b08357ea9ce9ba89a4 name: 'Azure: Get resources' type: SCRIPT key: azure.get.resources delay: 10m history: '0' trends: '0' value_type: TEXT params: | var Azure = { params: {}, token: null, setParams: function (params) { ['app_id', 'password', 'tenant_id', 'subscription_id'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); Azure.params = params; }, request: function (url, data) { if (typeof data === 'undefined' || data === null) { data = ''; } var response, request = new HttpRequest(); if (typeof Azure.params.proxy !== 'undefined' && Azure.params.proxy !== '') { request.setProxy(Azure.params.proxy); } if (Azure.token) { request.addHeader('Accept: application/json'); request.addHeader('Authorization: Bearer ' + Azure.token); } Zabbix.log(4, '[ Azure ] Sending request: ' + url); if (data !== '') { request.addHeader('Content-Type: application/x-www-form-urlencoded'); response = request.post(url, data); } else { response = request.get(url); } Zabbix.log(4, '[ Azure ] Received response with status code ' + request.getStatus() + ': ' + response); if (request.getStatus() !== 200 || response === null) { throw 'Request failed with status code ' + request.getStatus() + ': ' + response; } try { return JSON.parse(response); } catch (error) { throw 'Failed to parse response received from API.'; } }, nextlink: function (data) { next_data = data; while ('nextLink' in next_data) { next_data = Azure.request(next_data.nextLink); next_data.value.forEach(function (value) { data.value.push(value); }); } return data; } }; var result, data = {}, types = [ {"method": "Microsoft.Compute/virtualMachines", "version": "2022-03-01"}, {"method": "Microsoft.DBforMySQL/flexibleServers", "version": "2021-05-01"}, {"method": "Microsoft.DBforMySQL/servers", "version": "2017-12-01"}, {"method": "Microsoft.DBforPostgreSQL/flexibleServers", "version": "2021-06-01"}, {"method": "Microsoft.DBforPostgreSQL/servers", "version": "2017-12-01"}, {"method": "Microsoft.Sql/servers", "version": "2022-05-01-preview"}, {"method": "Microsoft.DocumentDB/databaseAccounts", "version": "2022-11-15-preview"} ]; data['errors'] = {}, data['resources'] = {}; data.resources.value = []; try { Azure.setParams(JSON.parse(value)); try { result = Azure.request( 'https://login.microsoftonline.com/' + encodeURIComponent(Azure.params.tenant_id) + '/oauth2/token', 'grant_type=client_credentials&resource=' + encodeURIComponent('https://management.azure.com/') + '&client_id=' + encodeURIComponent(Azure.params.app_id) + '&client_secret=' + encodeURIComponent(Azure.params.password) ); if ('access_token' in result) { Azure.token = result['access_token']; } else { throw 'Auth response does not contain access token.'; } } catch (error) { data.errors.auth = error.toString(); } if (!('auth' in data.errors)) { try { for (var i in types) { if (types[i].method === "Microsoft.Sql/servers") { mssql_servers = Azure.request('https://management.azure.com/subscriptions/' + encodeURIComponent(Azure.params.subscription_id) + '/providers/' + types[i].method + '?api-version=' + types[i].version); if ('nextLink' in mssql_servers) { mssql_servers = Azure.nextlink(mssql_servers); } if ('value' in mssql_servers && mssql_servers.value.length > 0) { for (j in mssql_servers.value) { mssql_dbs = Azure.request('https://management.azure.com' + mssql_servers.value[j].id + '/databases?api-version=' + types[i].version); if ('nextLink' in mssql_dbs) { mssql_dbs = Azure.nextlink(mssql_dbs); } mssql_dbs.value.forEach(function (value) { raw_data.value.push(value); }); } } } else { raw_data = Azure.request('https://management.azure.com/subscriptions/' + encodeURIComponent(Azure.params.subscription_id) + '/providers/' + types[i].method + '?api-version=' + types[i].version); if ('nextLink' in raw_data) { raw_data = Azure.nextlink(raw_data); } } raw_data.value.forEach(function (value) { value.resourceGroup = value.id.split("/")[4]; data.resources.value.push(value); }); } } catch (error) { data.errors.resources = error.toString(); } } } catch (error) { data.errors.params = error.toString(); } if (Object.keys(data.errors).length !== 0) { errors = 'Failed to receive data:'; for (var error in data.errors) { errors += '\n' + error + ' : ' + data.errors[error]; } data.errors = errors; } else { data.errors = ''; } return JSON.stringify(data); description: 'The result of API requests is expressed in the JSON.' timeout: '{$AZURE.DATA.TIMEOUT}' parameters: - name: app_id value: '{$AZURE.APP.ID}' - name: password value: '{$AZURE.PASSWORD}' - name: tenant_id value: '{$AZURE.TENANT.ID}' - name: subscription_id value: '{$AZURE.SUBSCRIPTION.ID}' - name: proxy value: '{$AZURE.PROXY}' tags: - tag: component value: raw - uuid: 91b2290d65b949ad9ea801763c35cf40 name: 'Azure: Get storage accounts' type: SCRIPT key: azure.get.storage.acc delay: 10m history: '0' trends: '0' value_type: TEXT params: | var Azure = { params: {}, token: '', setParams: function (params) { ['app_id', 'password', 'tenant_id', 'subscription_id'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); Azure.params = params; }, login: function () { var response, login = new HttpRequest(); if (typeof Azure.params.proxy !== 'undefined' && Azure.params.proxy !== '') { login.setProxy(Azure.params.proxy); } login.addHeader('Content-Type: application/x-www-form-urlencoded'); response = login.post( 'https://login.microsoftonline.com/' + encodeURIComponent(Azure.params.tenant_id) + '/oauth2/token', 'grant_type=client_credentials&resource=' + encodeURIComponent('https://management.azure.com/') + '&client_id=' + encodeURIComponent(Azure.params.app_id) + '&client_secret=' + encodeURIComponent(Azure.params.password) ); if (login.getStatus() !== 200) { throw 'Login failed with status code ' + login.getStatus() + ': ' + response; } try { response = JSON.parse(response); if (!response.hasOwnProperty('access_token')) { throw null; } } catch (error) { throw 'Authentication response does not contain access token.'; } Azure.token = response['access_token']; }, request: function (url) { var response, request = new HttpRequest(); if (typeof Azure.params.proxy !== 'undefined' && Azure.params.proxy !== '') { request.setProxy(Azure.params.proxy); } if (!Azure.token) { throw 'Request does not contain access token.'; } request.addHeader('Accept: application/json'); request.addHeader('Authorization: Bearer ' + Azure.token); response = request.get(url); if (request.getStatus() !== 200) { throw 'Request failed with status code ' + request.getStatus() + ': ' + response; } try { return JSON.parse(response); } catch (error) { throw 'Failed to parse response received from API.'; } }, getField: function (data, path) { var steps = path.split('.'); for (var i = 0; i < steps.length; i++) { var step = steps[i]; if (typeof data !== 'object' || typeof data[step] === 'undefined') { throw 'Required field was not found: ' + path; } data = data[step]; } return data; }, getMetricsData: function () { var metric = Azure.request('https://management.azure.com/subscriptions/' + encodeURIComponent(Azure.params.subscription_id) + '/providers/Microsoft.Storage/storageAccounts?api-version=2021-05-01'), data = []; if (!metric.hasOwnProperty('value')) { throw 'Failed getting required field. Check debug log for more information.'; } for (k in metric.value) { id = Azure.getField(metric.value[k], 'id'); json = {}; input = id.split('/'); for (var i = 1; i < input.length; i += 2) { json[input[i]] = input[i + 1]; } data.push({ 'name': Azure.getField(metric.value[k], 'name'), 'id': id, 'resourceGroup': Azure.getField(json, 'resourceGroups'), 'location': Azure.getField(metric.value[k], 'location'), 'token': Azure.token }); } return data; } }; try { Azure.setParams(JSON.parse(value)); Azure.login(); return JSON.stringify(Azure.getMetricsData()); } catch (error) { error += (String(error).endsWith('.')) ? '' : '.'; Zabbix.log(3, '[ Azure ] ERROR: ' + error); return JSON.stringify({'error': error}); } description: 'The result of API requests is expressed in the JSON.' timeout: '{$AZURE.DATA.TIMEOUT}' parameters: - name: app_id value: '{$AZURE.APP.ID}' - name: password value: '{$AZURE.PASSWORD}' - name: tenant_id value: '{$AZURE.TENANT.ID}' - name: subscription_id value: '{$AZURE.SUBSCRIPTION.ID}' - name: proxy value: '{$AZURE.PROXY}' tags: - tag: component value: raw - uuid: 2e425a9ef8d34ea68f7998ceed30ebc4 name: 'Azure: Get storage accounts errors' type: DEPENDENT key: azure.get.storage.acc.errors delay: '0' history: 7d trends: '0' value_type: TEXT description: 'The errors from API requests.' preprocessing: - type: JSONPATH parameters: - $.error error_handler: CUSTOM_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.get.storage.acc tags: - tag: component value: status triggers: - uuid: 253f0835cd134d2591bb2be1b9dc9b29 expression: 'length(last(/Azure by HTTP/azure.get.storage.acc.errors))>0' name: 'Azure: There are errors in storages requests to API' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'Zabbix has received errors in response to API requests.' dependencies: - name: 'Azure: There are errors in requests to API' expression: 'length(last(/Azure by HTTP/azure.get.errors))>0' tags: - tag: scope value: availability discovery_rules: - uuid: 3bfbfc8d770a4c77a17d62aaebb55e64 name: 'Cosmos DB account discovery' type: DEPENDENT key: azure.cosmos.mongo.db.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#TYPE}' value: ^Microsoft.DocumentDB/databaseAccounts formulaid: G - macro: '{#NAME}' value: '{$AZURE.COSMOS.MONGO.DB.NAME.MATCHES}' formulaid: E - macro: '{#NAME}' value: '{$AZURE.COSMOS.MONGO.DB.NAME.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: F - macro: '{#LOCATION}' value: '{$AZURE.COSMOS.MONGO.DB.LOCATION.MATCHES}' formulaid: C - macro: '{#LOCATION}' value: '{$AZURE.COSMOS.MONGO.DB.LOCATION.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: D - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.MATCHES}' formulaid: A - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B description: 'The list of the Cosmos databases is provided by the subscription.' host_prototypes: - uuid: 16eec30e921e4627b3599b4d06e48072 host: 'Azure Cosmos DB {#NAME}' name: 'Azure Cosmos DB {#NAME}' group_links: - group: name: Databases macros: - macro: '{$AZURE.RESOURCE.ID}' value: '{#ID}' tags: - tag: location value: '{#LOCATION}' - tag: resource-group value: '{#GROUP}' - tag: version value: '{#VERSION}' master_item: key: azure.get.resources lld_macro_paths: - lld_macro: '{#GROUP}' path: $.resourceGroup - lld_macro: '{#ID}' path: $.id - lld_macro: '{#LOCATION}' path: $.location - lld_macro: '{#NAME}' path: $.name - lld_macro: '{#TYPE}' path: $.type - lld_macro: '{#VERSION}' path: $.kind preprocessing: - type: JSONPATH parameters: - $.resources.value - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 6h overrides: - name: MongoDB step: '1' filter: conditions: - macro: '{#VERSION}' value: ^MongoDB$ formulaid: A operations: - operationobject: HOST_PROTOTYPE operator: REGEXP templates: - name: 'Azure Cosmos DB for MongoDB by HTTP' - uuid: c875a410ddd84ccfbc5b407cd6e34803 name: 'Microsoft SQL databases discovery' type: DEPENDENT key: azure.mssql.databases.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#TYPE}' value: ^Microsoft.Sql/servers/databases formulaid: H - macro: '{#NAME}' value: '{$AZURE.MSSQL.DB.NAME.MATCHES}' formulaid: E - macro: '{#NAME}' value: '{$AZURE.MSSQL.DB.NAME.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: F - macro: '{#LOCATION}' value: '{$AZURE.MSSQL.DB.LOCATION.MATCHES}' formulaid: C - macro: '{#LOCATION}' value: '{$AZURE.MSSQL.DB.LOCATION.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: D - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.MATCHES}' formulaid: A - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B - macro: '{#SIZE}' value: '{$AZURE.MSSQL.DB.SIZE.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: G description: 'The list of the Microsoft SQL databases is provided by the subscription.' host_prototypes: - uuid: 2aaf7dc7e9f04ccf9dd91fcd803fa076 host: 'Azure Microsoft SQL database {#NAME}' name: 'Azure Microsoft SQL database {#NAME}' group_links: - group: name: Databases macros: - macro: '{$AZURE.RESOURCE.ID}' value: '{#ID}' tags: - tag: location value: '{#LOCATION}' - tag: resource-group value: '{#GROUP}' - tag: size value: '{#SIZE}' - tag: version value: '{#VERSION}' master_item: key: azure.get.resources lld_macro_paths: - lld_macro: '{#GROUP}' path: $.resourceGroup - lld_macro: '{#ID}' path: $.id - lld_macro: '{#LOCATION}' path: $.location - lld_macro: '{#NAME}' path: $.name - lld_macro: '{#SIZE}' path: $.sku.name - lld_macro: '{#TYPE}' path: $.type - lld_macro: '{#VERSION}' path: $.kind preprocessing: - type: JSONPATH parameters: - $.resources.value - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 6h overrides: - name: Server step: '2' filter: conditions: - macro: '{#VERSION}' value: '^((?!serverless).)*$' formulaid: A operations: - operationobject: HOST_PROTOTYPE operator: REGEXP templates: - name: 'Azure Microsoft SQL Database by HTTP' - name: Serverless step: '1' filter: conditions: - macro: '{#VERSION}' value: '^.*serverless$' formulaid: A operations: - operationobject: HOST_PROTOTYPE operator: REGEXP templates: - name: 'Azure Microsoft SQL Serverless Database by HTTP' - uuid: 7fafbef68f8b46d083eb43da7cd1e2cc name: 'MySQL servers discovery' type: DEPENDENT key: azure.mysql.servers.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#TYPE}' value: ^Microsoft.DBforMySQL formulaid: G - macro: '{#NAME}' value: '{$AZURE.MYSQL.DB.NAME.MATCHES}' formulaid: E - macro: '{#NAME}' value: '{$AZURE.MYSQL.DB.NAME.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: F - macro: '{#LOCATION}' value: '{$AZURE.MYSQL.DB.LOCATION.MATCHES}' formulaid: C - macro: '{#LOCATION}' value: '{$AZURE.MYSQL.DB.LOCATION.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: D - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.MATCHES}' formulaid: A - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B description: 'The list of the MySQL servers is provided by the subscription.' host_prototypes: - uuid: 55b87078c14c4561b53e64af5ed77d61 host: 'Azure MySQL server {#NAME}' name: 'Azure MySQL server {#NAME}' group_links: - group: name: Databases macros: - macro: '{$AZURE.RESOURCE.ID}' value: '{#ID}' tags: - tag: location value: '{#LOCATION}' - tag: resource-group value: '{#GROUP}' - tag: size value: '{#SIZE}' - tag: version value: '{#VERSION}' master_item: key: azure.get.resources lld_macro_paths: - lld_macro: '{#GROUP}' path: $.resourceGroup - lld_macro: '{#ID}' path: $.id - lld_macro: '{#LOCATION}' path: $.location - lld_macro: '{#NAME}' path: $.name - lld_macro: '{#SIZE}' path: $.sku.name - lld_macro: '{#TYPE}' path: $.type - lld_macro: '{#VERSION}' path: $.properties.version preprocessing: - type: JSONPATH parameters: - $.resources.value - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 6h overrides: - name: 'Flexible server' step: '1' filter: conditions: - macro: '{#TYPE}' value: Microsoft.DBforMySQL/flexibleServers formulaid: A operations: - operationobject: HOST_PROTOTYPE operator: REGEXP templates: - name: 'Azure MySQL Flexible Server by HTTP' - name: 'Single server' step: '2' filter: conditions: - macro: '{#TYPE}' value: Microsoft.DBforMySQL/servers formulaid: A operations: - operationobject: HOST_PROTOTYPE operator: REGEXP templates: - name: 'Azure MySQL Single Server by HTTP' - uuid: a4b35b5fe8c04b52a9640f2f41013230 name: 'PostgreSQL servers discovery' type: DEPENDENT key: azure.pgsql.servers.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#TYPE}' value: ^Microsoft.DBforPostgreSQL formulaid: G - macro: '{#NAME}' value: '{$AZURE.PGSQL.DB.NAME.MATCHES}' formulaid: E - macro: '{#NAME}' value: '{$AZURE.PGSQL.DB.NAME.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: F - macro: '{#LOCATION}' value: '{$AZURE.PGSQL.DB.LOCATION.MATCHES}' formulaid: C - macro: '{#LOCATION}' value: '{$AZURE.PGSQL.DB.LOCATION.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: D - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.MATCHES}' formulaid: A - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B description: 'The list of the PostgreSQL servers is provided by the subscription.' host_prototypes: - uuid: 54f0e0ec288f4feb9a2dc58a8726bd1d host: 'Azure PostgreSQL server {#NAME}' name: 'Azure PostgreSQL server {#NAME}' group_links: - group: name: Databases macros: - macro: '{$AZURE.RESOURCE.ID}' value: '{#ID}' tags: - tag: location value: '{#LOCATION}' - tag: resource-group value: '{#GROUP}' - tag: size value: '{#SIZE}' - tag: version value: '{#VERSION}' master_item: key: azure.get.resources lld_macro_paths: - lld_macro: '{#GROUP}' path: $.resourceGroup - lld_macro: '{#ID}' path: $.id - lld_macro: '{#LOCATION}' path: $.location - lld_macro: '{#NAME}' path: $.name - lld_macro: '{#SIZE}' path: $.sku.name - lld_macro: '{#TYPE}' path: $.type - lld_macro: '{#VERSION}' path: $.properties.version preprocessing: - type: JSONPATH parameters: - $.resources.value - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 6h overrides: - name: 'Flexible server' step: '1' filter: conditions: - macro: '{#TYPE}' value: Microsoft.DBforPostgreSQL/flexibleServers formulaid: A operations: - operationobject: HOST_PROTOTYPE operator: REGEXP templates: - name: 'Azure PostgreSQL Flexible Server by HTTP' - name: 'Single server' step: '2' filter: conditions: - macro: '{#TYPE}' value: Microsoft.DBforPostgreSQL/servers formulaid: A operations: - operationobject: HOST_PROTOTYPE operator: REGEXP templates: - name: 'Azure PostgreSQL Single Server by HTTP' - uuid: 3b9bde32dd6b4e3aa2dd8d7949f655e9 name: 'Storage accounts discovery' type: DEPENDENT key: azure.starage.acc.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#NAME}' value: '{$AZURE.STORAGE.ACC.NAME.MATCHES}' formulaid: E - macro: '{#NAME}' value: '{$AZURE.STORAGE.ACC.NAME.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: F - macro: '{#LOCATION}' value: '{$AZURE.STORAGE.ACC.LOCATION.MATCHES}' formulaid: C - macro: '{#LOCATION}' value: '{$AZURE.STORAGE.ACC.LOCATION.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: D - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.MATCHES}' formulaid: A - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B description: 'The list of all storage accounts available under the subscription.' item_prototypes: - uuid: 3361508a601748f5aca339f952430889 name: 'Azure: Storage account [{#NAME}]: Get data' type: SCRIPT key: 'azure.get.storage.acc[{#NAME}]' history: '0' trends: '0' value_type: TEXT params: | var AzureStorage = { params: {}, setParams: function (params) { ['token', 'id'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); AzureStorage.params = params; }, request: function (url) { var response, request = new HttpRequest(); if (typeof AzureStorage.params.proxy !== 'undefined' && AzureStorage.params.proxy !== '') { request.setProxy(AzureStorage.params.proxy); } request.addHeader('Accept: application/json'); request.addHeader('Authorization: Bearer ' + AzureStorage.params.token); Zabbix.log(4, '[ Azure ] Sending request: ' + url); response = request.get(url); if (request.getStatus() !== 200) { throw 'Request failed with status code ' + request.getStatus() + ': ' + response; } try { return JSON.parse(response); } catch (error) { throw 'Failed to parse response received from API.'; } }, getField: function (data, path) { var steps = path.split('.'); for (var i = 0; i < steps.length; i++) { var step = steps[i]; if (typeof data !== 'object' || typeof data[step] === 'undefined') { throw 'Required field was not found: ' + path + ' input data: ' + JSON.stringify(data); } data = data[step]; } return data; }, getMetricsData: function () { var data = {}; start_date = new Date((new Date().getTime()) - 4200000).toISOString().replace(/\.\d+/, ''); end_date = new Date((new Date().getTime()) - 600000).toISOString().replace(/\.\d+/, ''); endpoints = { 'tableServices': '/tableServices/default/providers/Microsoft.Insights/metrics?metricnames=TableCapacity,TableCount,TableEntityCount,Transactions,Ingress,Egress,SuccessServerLatency,SuccessE2ELatency,Availability&api-version=2021-05-01&interval=PT1H×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date), 'blobServices': '/blobServices/default/providers/Microsoft.Insights/metrics?metricnames=BlobCapacity,BlobCount,ContainerCount,IndexCapacity,Transactions,Ingress,Egress,SuccessServerLatency,SuccessE2ELatency,Availability&api-version=2021-05-01&interval=PT1H×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date), 'fileServices': '/fileServices/default/providers/Microsoft.Insights/metrics?metricnames=FileCapacity,FileCount,FileShareCount,FileShareSnapshotCount,FileShareSnapshotSize,FileShareCapacityQuota,Transactions,Ingress,Egress,SuccessServerLatency,SuccessE2ELatency,Availability&api-version=2021-05-01&interval=PT1H×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date), 'storageAccount': '/providers/Microsoft.Insights/metrics?metricnames=UsedCapacity,Transactions,Ingress,Egress,SuccessServerLatency,SuccessE2ELatency,Availability&api-version=2021-05-01&interval=PT1H×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date), 'queueServices': '/queueServices/default/providers/Microsoft.Insights/metrics?metricnames=QueueCapacity,QueueCount,QueueMessageCount,Transactions,Ingress,Egress,SuccessServerLatency,SuccessE2ELatency,Availability&api-version=2021-05-01&interval=PT1H×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date) }; Object.keys(endpoints).forEach(function (field) { data[field] = {}; metrics = AzureStorage.request('https://management.azure.com' + AzureStorage.params.id + endpoints[field]); if (!metrics.hasOwnProperty('value')) { throw 'Failed getting required field. Check debug log for more information.'; } for (k in metrics.value) { key = AzureStorage.getField(metrics.value[k], 'name.value') if (metrics.value[k].timeseries.length === 0) { metrics.value[k].timeseries.push({ 'data': ['nodata'] }) } data[field][key] = AzureStorage.getField(metrics.value[k], 'timeseries.0.data.0'); } }); return data } }; try { AzureStorage.setParams(JSON.parse(value)); return JSON.stringify(AzureStorage.getMetricsData()); } catch (error) { error += (String(error).endsWith('.')) ? '' : '.'; Zabbix.log(3, '[ Azure ] ERROR: ' + error); return JSON.stringify({ 'error': error }); } description: 'The HTTP API endpoint that returns storage metrics with the name `[{#NAME}]`.' timeout: '{$AZURE.DATA.TIMEOUT}' parameters: - name: id value: '{#ID}' - name: token value: '{#TOKEN}' - name: proxy value: '{$AZURE.PROXY}' tags: - tag: component value: raw - tag: component value: storages - tag: storage value: '{#NAME}' - uuid: 08ce66b39b084182bdb60a5556b88c88 name: 'Azure: Storage account [{#NAME}]: Availability' type: DEPENDENT key: 'azure.storage.availability[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: '%' description: | The percentage of availability for the storage service or a specified API operation. Availability is calculated by taking the `TotalBillableRequests` value and dividing it by the number of applicable requests, including those that produced unexpected errors. All unexpected errors result in reduced availability for the storage service or the specified API operation. preprocessing: - type: JSONPATH parameters: - $.storageAccount.Availability.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: common - tag: storage value: '{#NAME}' trigger_prototypes: - uuid: 6a0b3edebded4d848ad76f86f8152377 expression: '(min(/Azure by HTTP/azure.storage.availability[{#NAME}],#3))<{$AZURE.STORAGE.ACC.AVAILABILITY:"{#NAME}"}' name: 'Azure: Storage account [{#NAME}]: Availability is low' event_name: 'Azure: Storage account [{#NAME} availability are too low (less than {$AZURE.STORAGE.ACC.AVAILABILITY:"{#NAME}"}%)' opdata: '{ITEM.LASTVALUE1}' priority: WARNING tags: - tag: scope value: availability - uuid: 9ae0af76a37047f5ba84de2f43dfb5c4 name: 'Azure: Storage account [{#NAME}]: Blob Availability' type: DEPENDENT key: 'azure.storage.blob.availability[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: '%' description: | The percentage of availability for the storage service or a specified API operation. Availability is calculated by taking the `TotalBillableRequests` value and dividing it by the number of applicable requests, including those that produced unexpected errors. All unexpected errors result in reduced availability for the storage service or the specified API operation. preprocessing: - type: JSONPATH parameters: - $.blobServices.Availability.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: blob - tag: storage value: '{#NAME}' trigger_prototypes: - uuid: 4cd8ac56b50c4120bf9de56bb1f06245 expression: '(min(/Azure by HTTP/azure.storage.blob.availability[{#NAME}],#3))<{$AZURE.STORAGE.ACC.BLOB.AVAILABILITY:"{#NAME}"}' name: 'Azure: Storage account [{#NAME}]: Blob Availability is low' event_name: 'Azure: Storage account [{#NAME} blob availability are too low (less than {$AZURE.STORAGE.ACC.BLOB.AVAILABILITY:"{#NAME}"}%)' opdata: '{ITEM.LASTVALUE1}' priority: WARNING tags: - tag: scope value: availability - uuid: c6437ade4fee44f783ab379fb179508d name: 'Azure: Storage account [{#NAME}]: Blob Capacity' type: DEPENDENT key: 'azure.storage.blob.capacity[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: 'The amount of storage used by the blob service of the storage account with the name `[{#NAME}]`, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.blobServices.BlobCapacity.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: blob - tag: storage value: '{#NAME}' - uuid: 707be15f02a141548ce5f89097c303a0 name: 'Azure: Storage account [{#NAME}]: Blob Container Count' type: DEPENDENT key: 'azure.storage.blob.container.count[{#NAME}]' delay: '0' history: 7d description: 'The number of containers in the storage account with the name `[{#NAME}]`.' preprocessing: - type: JSONPATH parameters: - $.blobServices.ContainerCount.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: blob - tag: storage value: '{#NAME}' - uuid: 9bd8b8f1b5844298a245d449548de46e name: 'Azure: Storage account [{#NAME}]: Blob Count' type: DEPENDENT key: 'azure.storage.blob.count[{#NAME}]' delay: '0' history: 7d description: 'The number of blob objects stored in the storage account with the name `[{#NAME}]`.' preprocessing: - type: JSONPATH parameters: - $.blobServices.BlobCount.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: blob - tag: storage value: '{#NAME}' - uuid: ae28bbd289644619b20b1907212d8293 name: 'Azure: Storage account [{#NAME}]: Blob Egress' type: DEPENDENT key: 'azure.storage.blob.engress[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: | The amount of egress data. This number includes egress to external client from Azure Storage and also egress within Azure. As a result, this number does not reflect billable egress. preprocessing: - type: JSONPATH parameters: - $.blobServices.Egress.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: blob - tag: storage value: '{#NAME}' - uuid: 8e73a2aba92444dd9c02c6f94227a4e5 name: 'Azure: Storage account [{#NAME}]: Blob Index Capacity' type: DEPENDENT key: 'azure.storage.blob.index.capacity[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: 'The amount of storage with the name `[{#NAME}]` used by the Azure Data Lake Storage Gen2 hierarchical index.' preprocessing: - type: JSONPATH parameters: - $.blobServices.IndexCapacity.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: blob - tag: storage value: '{#NAME}' - uuid: ff40325efb174839bef7bc775049837e name: 'Azure: Storage account [{#NAME}]: Blob Ingress' type: DEPENDENT key: 'azure.storage.blob.ingress[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: 'The amount of ingress data, expressed in bytes. This number includes ingress from an external client into Azure Storage and also ingress within Azure.' preprocessing: - type: JSONPATH parameters: - $.blobServices.Ingress.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: blob - tag: storage value: '{#NAME}' - uuid: e17d6f2ed79c4b5eaa54730c82d6840f name: 'Azure: Storage account [{#NAME}]: Blob Success E2E Latency' type: DEPENDENT key: 'azure.storage.blob.success.e2e.latency[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: s description: | The average end-to-end latency of successful requests made to a storage service or the specified API operation, expressed in milliseconds. This value includes the required processing time within Azure Storage to read the request, send the response, and receive acknowledgment of the response. preprocessing: - type: JSONPATH parameters: - $.blobServices.SuccessE2ELatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: blob - tag: storage value: '{#NAME}' - uuid: 727fb792fe5c4229995f7aa5bbb681ed name: 'Azure: Storage account [{#NAME}]: Blob Success Server Latency' type: DEPENDENT key: 'azure.storage.blob.success.server.latency[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: s description: | The average time used to process a successful request by Azure Storage. This value does not include the network latency specified in `SuccessE2ELatency`. preprocessing: - type: JSONPATH parameters: - $.blobServices.SuccessServerLatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: blob - tag: storage value: '{#NAME}' - uuid: 48ecb880def34474b73a03eb895db3ea name: 'Azure: Storage account [{#NAME}]: Blob Transactions' type: DEPENDENT key: 'azure.storage.blob.transactions[{#NAME}]' delay: '0' history: 7d description: | The number of requests made to the storage service or a specified API operation. This number includes successful and failed requests and also requests that produced errors. Use `ResponseType` dimension for the number of different types of responses. preprocessing: - type: JSONPATH parameters: - $.blobServices.Transactions.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: blob - tag: storage value: '{#NAME}' - uuid: 4198807e1e08439a9009481ddcfd3bab name: 'Azure: Storage account [{#NAME}]: Egress' type: DEPENDENT key: 'azure.storage.engress[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: | The amount of egress data. This number includes egress to external client from Azure Storage and also egress within Azure. As a result, this number does not reflect billable egress. preprocessing: - type: JSONPATH parameters: - $.storageAccount.Egress.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: common - tag: storage value: '{#NAME}' - uuid: 43069f165849449d8403d1a8c82fe634 name: 'Azure: Storage account [{#NAME}]: File Capacity' type: DEPENDENT key: 'azure.storage.file.capacity[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: 'The amount of File storage used by the storage account with the name `[{#NAME}]`, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.fileServices.FileCapacity.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: file - tag: storage value: '{#NAME}' - uuid: 3483741c11a141c2866ea58a74a91135 name: 'Azure: Storage account [{#NAME}]: File Count' type: DEPENDENT key: 'azure.storage.file.count[{#NAME}]' delay: '0' history: 7d description: 'The number of files in the storage account with the name `[{#NAME}]`.' preprocessing: - type: JSONPATH parameters: - $.fileServices.FileCount.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: file - tag: storage value: '{#NAME}' - uuid: 7f6d01573bf24d9889f41a14cb581075 name: 'Azure: Storage account [{#NAME}]: File Egress' type: DEPENDENT key: 'azure.storage.file.engress[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: | The amount of egress data. This number includes egress to external client from Azure Storage and also egress within Azure. As a result, this number does not reflect billable egress. preprocessing: - type: JSONPATH parameters: - $.fileServices.Egress.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: file - tag: storage value: '{#NAME}' - uuid: 9f9b6772f9d9478ba3be3a93c5408ba2 name: 'Azure: Storage account [{#NAME}]: File Ingress' type: DEPENDENT key: 'azure.storage.file.ingress[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: 'The amount of ingress data, expressed in bytes. This number includes ingress from an external client into Azure Storage and also ingress within Azure.' preprocessing: - type: JSONPATH parameters: - $.fileServices.Ingress.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: file - tag: storage value: '{#NAME}' - uuid: 4cb60e5473ce46a08bc962dc97c1f4db name: 'Azure: Storage account [{#NAME}]: File Share Capacity Quota' type: DEPENDENT key: 'azure.storage.file.share.capacity.quota[{#NAME}]' delay: '0' history: 7d units: B description: 'The upper limit on the amount of storage that can be used by Azure Files Service, in bytes.' preprocessing: - type: JSONPATH parameters: - $.fileServices.FileShareCapacityQuota.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: file - tag: storage value: '{#NAME}' - uuid: 220673a2e99a4108b034d04d79108231 name: 'Azure: Storage account [{#NAME}]: File Share Count' type: DEPENDENT key: 'azure.storage.file.share.count[{#NAME}]' delay: '0' history: 7d description: 'The number of file shares in the storage account.' preprocessing: - type: JSONPATH parameters: - $.fileServices.FileShareCount.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: file - tag: storage value: '{#NAME}' - uuid: 47c48f39b9744a92ac13e9db69f6e629 name: 'Azure: Storage account [{#NAME}]: File Share Snapshot Size' type: DEPENDENT key: 'azure.storage.file.share.snapshot.size[{#NAME}]' delay: '0' history: 7d units: B description: 'The amount of storage used by the snapshots in storage account''s File service, in bytes.' preprocessing: - type: JSONPATH parameters: - $.fileServices.FileShareSnapshotSize.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: file - tag: storage value: '{#NAME}' - uuid: f0394f8f2d55471c8ab557045349a6ec name: 'Azure: Storage account [{#NAME}]: File Share Snapshot Count' type: DEPENDENT key: 'azure.storage.file.shares.snapshot.count[{#NAME}]' delay: '0' history: 7d description: 'The number of snapshots present on the share in storage account''s Files Service.' preprocessing: - type: JSONPATH parameters: - $.fileServices.FileShareSnapshotCount.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: file - tag: storage value: '{#NAME}' - uuid: 431a6c51418d401697d105a0d9b62d23 name: 'Azure: Storage account [{#NAME}]: File Success E2E Latency' type: DEPENDENT key: 'azure.storage.file.success.e2e.latency[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: s description: | The average end-to-end latency of successful requests made to a storage service or the specified API operation, expressed in milliseconds. This value includes the required processing time within Azure Storage to read the request, send the response, and receive acknowledgment of the response. preprocessing: - type: JSONPATH parameters: - $.fileServices.file.SuccessE2ELatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: file - tag: storage value: '{#NAME}' - uuid: 43b6c0b948f64d9daada7aaac520c839 name: 'Azure: Storage account [{#NAME}]: File Success Server Latency' type: DEPENDENT key: 'azure.storage.file.success.server.latency[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: s description: | The average time used to process a successful request by Azure Storage. This value does not include the network latency specified in `SuccessE2ELatency`. preprocessing: - type: JSONPATH parameters: - $.fileServices.SuccessServerLatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: file - tag: storage value: '{#NAME}' - uuid: ed4b7ac10368493ba01c7cbeffba3042 name: 'Azure: Storage account [{#NAME}]: File Transactions' type: DEPENDENT key: 'azure.storage.file.transactions[{#NAME}]' delay: '0' history: 7d description: | The number of requests made to the storage service or a specified API operation. This number includes successful and failed requests and also requests that produced errors. Use `ResponseType` dimension for the number of different types of responses. preprocessing: - type: JSONPATH parameters: - $.fileServices.Transactions.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: file - tag: storage value: '{#NAME}' - uuid: caeaa6805904471a8b18480f34ef9807 name: 'Azure: Storage account [{#NAME}]: Ingress' type: DEPENDENT key: 'azure.storage.ingress[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: 'The amount of ingress data, expressed in bytes. This number includes ingress from an external client into Azure Storage and also ingress within Azure.' preprocessing: - type: JSONPATH parameters: - $.storageAccount.Ingress.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: common - tag: storage value: '{#NAME}' - uuid: be8b82396ff243e8a52864069b192dea name: 'Azure: Storage account [{#NAME}]: Queue Capacity' type: DEPENDENT key: 'azure.storage.queue.capacity[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: 'The amount of Queue storage used by the storage account with the name `[{#NAME}]`, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.queueServices.QueueCapacity.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: queue - tag: storage value: '{#NAME}' - uuid: 9174d372235e4d14a4896a79ddcbc051 name: 'Azure: Storage account [{#NAME}]: Queue Count' type: DEPENDENT key: 'azure.storage.queue.count[{#NAME}]' delay: '0' history: 7d description: 'The number of queues in the storage account with the name `[{#NAME}]`.' preprocessing: - type: JSONPATH parameters: - $.queueServices.QueueCount.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: queue - tag: storage value: '{#NAME}' - uuid: b8cff599c4194b4abd74f4a27ca93284 name: 'Azure: Storage account [{#NAME}]: Queue Egress' type: DEPENDENT key: 'azure.storage.queue.engress[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: | The amount of egress data. This number includes egress to external client from Azure Storage and also egress within Azure. As a result, this number does not reflect billable egress. preprocessing: - type: JSONPATH parameters: - $.queueServices.Egress.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: queue - tag: storage value: '{#NAME}' - uuid: 599f612c3cc64e81a53d507ae0078ab1 name: 'Azure: Storage account [{#NAME}]: Queue Ingress' type: DEPENDENT key: 'azure.storage.queue.ingress[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: 'The amount of ingress data, expressed in bytes. This number includes ingress from an external client into Azure Storage and also ingress within Azure.' preprocessing: - type: JSONPATH parameters: - $.queueServices.Ingress.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: queue - tag: storage value: '{#NAME}' - uuid: 70c7b436a03145c5ab694b3a20ac52b1 name: 'Azure: Storage account [{#NAME}]: Queue Message Count' type: DEPENDENT key: 'azure.storage.queue.message.count[{#NAME}]' delay: '0' history: 7d description: 'The number of unexpired queue messages in the storage account with the name `[{#NAME}]`.' preprocessing: - type: JSONPATH parameters: - $.queueServices.QueueMessageCount.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: queue - tag: storage value: '{#NAME}' - uuid: eccdbf48412e4c28afc3bbf87c545cc2 name: 'Azure: Storage account [{#NAME}]: Queue Success E2E Latency' type: DEPENDENT key: 'azure.storage.queue.success.e2e.latency[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: s description: | The average end-to-end latency of successful requests made to a storage service or the specified API operation, expressed in milliseconds. This value includes the required processing time within Azure Storage to read the request, send the response, and receive acknowledgment of the response. preprocessing: - type: JSONPATH parameters: - $.queueServices.queue.SuccessE2ELatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: queue - tag: storage value: '{#NAME}' - uuid: 4d9aa2753d944690b01a23bcd44fd52d name: 'Azure: Storage account [{#NAME}]: Queue Success Server Latency' type: DEPENDENT key: 'azure.storage.queue.success.server.latency[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: s description: | The average time used to process a successful request by Azure Storage. This value does not include the network latency specified in `SuccessE2ELatency`. preprocessing: - type: JSONPATH parameters: - $.queueServices.SuccessServerLatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: queue - tag: storage value: '{#NAME}' - uuid: e472739df4634b55be2466bd91af9886 name: 'Azure: Storage account [{#NAME}]: Queue Transactions' type: DEPENDENT key: 'azure.storage.queue.transactions[{#NAME}]' delay: '0' history: 7d description: | The number of requests made to the storage service or a specified API operation. This number includes successful and failed requests and also requests that produced errors. Use `ResponseType` dimension for the number of different types of responses. preprocessing: - type: JSONPATH parameters: - $.queueServices.Transactions.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: queue - tag: storage value: '{#NAME}' - uuid: 48437de0bdca4f5392c295ca8b82bd0a name: 'Azure: Storage account [{#NAME}]: Success E2E Latency' type: DEPENDENT key: 'azure.storage.success.e2e.latency[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: s description: | The average end-to-end latency of successful requests made to a storage service or the specified API operation, expressed in milliseconds. This value includes the required processing time within Azure Storage to read the request, send the response, and receive acknowledgment of the response. preprocessing: - type: JSONPATH parameters: - $.storageAccount.SuccessE2ELatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: common - tag: storage value: '{#NAME}' - uuid: 7076dbfb45cd49828b96064aa892e8e4 name: 'Azure: Storage account [{#NAME}]: Success Server Latency' type: DEPENDENT key: 'azure.storage.success.server.latency[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: s description: | The average time used to process a successful request by Azure Storage. This value does not include the network latency specified in `SuccessE2ELatency`. preprocessing: - type: JSONPATH parameters: - $.storageAccount.SuccessServerLatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: common - tag: storage value: '{#NAME}' - uuid: 918f1d1c70964e7c9f5521cf99bbb21d name: 'Azure: Storage account [{#NAME}]: Table Availability' type: DEPENDENT key: 'azure.storage.table.availability[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: '%' description: | The percentage of availability for the storage service or a specified API operation. Availability is calculated by taking the `TotalBillableRequests` value and dividing it by the number of applicable requests, including those that produced unexpected errors. All unexpected errors result in reduced availability for the storage service or the specified API operation. preprocessing: - type: JSONPATH parameters: - $.tableServices.Availability.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: table - tag: storage value: '{#NAME}' trigger_prototypes: - uuid: bfb1e82685224048ba8082447cad57ca expression: '(min(/Azure by HTTP/azure.storage.table.availability[{#NAME}],#3))<{$AZURE.STORAGE.ACC.TABLE.AVAILABILITY:"{#NAME}"}' name: 'Azure: Storage account [{#NAME}]: Table Availability is low' event_name: 'Azure: Storage account [{#NAME} table availability are too low (less than {$AZURE.STORAGE.ACC.TABLE.AVAILABILITY:"{#NAME}"}%)' opdata: '{ITEM.LASTVALUE1}' priority: WARNING tags: - tag: scope value: availability - uuid: ee19a3857a7a4650952eb855193991ee name: 'Azure: Storage account [{#NAME}]: Table Capacity' type: DEPENDENT key: 'azure.storage.table.capacity[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: 'The amount of storage used by the table service of the storage account with the name `[{#NAME}]`, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.tableServices.TableCapacity.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: table - tag: storage value: '{#NAME}' - uuid: a3d11321b1cc4c1b9c322c0a7162e76e name: 'Azure: Storage account [{#NAME}]: Table Count' type: DEPENDENT key: 'azure.storage.table.count[{#NAME}]' delay: '0' history: 7d description: 'The number of tables in the storage account with the name `[{#NAME}]`.' preprocessing: - type: JSONPATH parameters: - $.tableServices.TableCount.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: table - tag: storage value: '{#NAME}' - uuid: d75bd57fdd9f4377aea7c1e52a109c18 name: 'Azure: Storage account [{#NAME}]: Table Egress' type: DEPENDENT key: 'azure.storage.table.engress[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: | The amount of egress data. This number includes egress to external client from Azure Storage and also egress within Azure. As a result, this number does not reflect billable egress. preprocessing: - type: JSONPATH parameters: - $.tableServices.Egress.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: table - tag: storage value: '{#NAME}' - uuid: f2911504457b4d329ae7cf7d7a24594a name: 'Azure: Storage account [{#NAME}]: Table Entity Count' type: DEPENDENT key: 'azure.storage.table.entity.count[{#NAME}]' delay: '0' history: 7d description: 'The number of table entities in the storage account with the name `[{#NAME}]`.' preprocessing: - type: JSONPATH parameters: - $.tableServices.TableEntityCount.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: table - tag: storage value: '{#NAME}' - uuid: 993ca2e5bcd74d27b19998d77f0abec8 name: 'Azure: Storage account [{#NAME}]: Table Ingress' type: DEPENDENT key: 'azure.storage.table.ingress[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: 'The amount of ingress data, expressed in bytes. This number includes ingress from an external client into Azure Storage and also ingress within Azure.' preprocessing: - type: JSONPATH parameters: - $.tableServices.Ingress.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: table - tag: storage value: '{#NAME}' - uuid: 00c441cc77f4447584d4bffbefc304e0 name: 'Azure: Storage account [{#NAME}]: Table Success E2E Latency' type: DEPENDENT key: 'azure.storage.table.success.e2e.latency[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: s description: | The average end-to-end latency of successful requests made to a storage service or the specified API operation, expressed in milliseconds. This value includes the required processing time within Azure Storage to read the request, send the response, and receive acknowledgment of the response. preprocessing: - type: JSONPATH parameters: - $.tableServices.SuccessE2ELatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: table - tag: storage value: '{#NAME}' - uuid: f29e3ad4be034f38932cb85654397926 name: 'Azure: Storage account [{#NAME}]: Table Success Server Latency' type: DEPENDENT key: 'azure.storage.table.success.server.latency[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: s description: | The average time used to process a successful request by Azure Storage. This value does not include the network latency specified in `SuccessE2ELatency`. preprocessing: - type: JSONPATH parameters: - $.tableServices.SuccessServerLatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: table - tag: storage value: '{#NAME}' - uuid: 9ba25e87c5bb466a99855a9fb893283d name: 'Azure: Storage account [{#NAME}]: Table Transactions' type: DEPENDENT key: 'azure.storage.table.transactions[{#NAME}]' delay: '0' history: 7d description: | The number of requests made to the storage service or a specified API operation. This number includes successful and failed requests and also requests that produced errors. Use `ResponseType` dimension for the number of different types of responses. preprocessing: - type: JSONPATH parameters: - $.tableServices.Transactions.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: table - tag: storage value: '{#NAME}' - uuid: 6f68f0d8a63640ffa549fde44e8fe56c name: 'Azure: Storage account [{#NAME}]: Transactions' type: DEPENDENT key: 'azure.storage.transactions[{#NAME}]' delay: '0' history: 7d description: | The number of requests made to the storage service or a specified API operation. This number includes successful and failed requests and also requests that produced errors. Use `ResponseType` dimension for the number of different types of responses. preprocessing: - type: JSONPATH parameters: - $.storageAccount.Transactions.total error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: common - tag: storage value: '{#NAME}' - uuid: 08ef07d874db4823bd167482bf049916 name: 'Azure: Storage account [{#NAME}]: Used Capacity' type: DEPENDENT key: 'azure.storage.used.capacity[{#NAME}]' delay: '0' history: 7d value_type: FLOAT units: B description: | The amount of storage used by the storage account with the name `[{#NAME}]`, expressed in bytes. For standard storage accounts, it's the sum of capacity used by blob, table, file, and queue. For premium storage accounts and Blob storage accounts, it is the same as BlobCapacity or FileCapacity. preprocessing: - type: JSONPATH parameters: - $.storageAccount.UsedCapacity.average error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h master_item: key: 'azure.get.storage.acc[{#NAME}]' tags: - tag: component value: storages - tag: metrics value: common - tag: storage value: '{#NAME}' graph_prototypes: - uuid: d569e0daf1974df58584432805f95557 name: 'Azure: Capacity by storage [{#NAME}]' graph_items: - color: 199C0D item: host: 'Azure by HTTP' key: 'azure.storage.used.capacity[{#NAME}]' - sortorder: '1' color: F63100 item: host: 'Azure by HTTP' key: 'azure.storage.blob.capacity[{#NAME}]' - sortorder: '2' color: 00611C item: host: 'Azure by HTTP' key: 'azure.storage.table.capacity[{#NAME}]' - sortorder: '3' color: F7941D item: host: 'Azure by HTTP' key: 'azure.storage.file.capacity[{#NAME}]' - sortorder: '4' color: FC6EA3 item: host: 'Azure by HTTP' key: 'azure.storage.queue.capacity[{#NAME}]' - uuid: 9c87dfb9ed7e4c1ea32c8e35c6e23381 name: 'Azure: Transactions by storage [{#NAME}]' graph_items: - color: 199C0D item: host: 'Azure by HTTP' key: 'azure.storage.transactions[{#NAME}]' - sortorder: '1' color: F63100 item: host: 'Azure by HTTP' key: 'azure.storage.blob.transactions[{#NAME}]' - sortorder: '2' color: 00611C item: host: 'Azure by HTTP' key: 'azure.storage.table.transactions[{#NAME}]' - sortorder: '3' color: F7941D item: host: 'Azure by HTTP' key: 'azure.storage.file.transactions[{#NAME}]' - sortorder: '4' color: FC6EA3 item: host: 'Azure by HTTP' key: 'azure.storage.queue.transactions[{#NAME}]' master_item: key: azure.get.storage.acc lld_macro_paths: - lld_macro: '{#GROUP}' path: $.resourceGroup - lld_macro: '{#ID}' path: $.id - lld_macro: '{#LOCATION}' path: $.location - lld_macro: '{#NAME}' path: $.name - lld_macro: '{#TOKEN}' path: $.token preprocessing: - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 6h - uuid: f9386233186648ce828f406c52972ce5 name: 'Virtual machines discovery' type: DEPENDENT key: azure.vm.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#TYPE}' value: ^Microsoft.Compute/virtualMachines$ formulaid: G - macro: '{#NAME}' value: '{$AZURE.VM.NAME.MATCHES}' formulaid: E - macro: '{#NAME}' value: '{$AZURE.VM.NAME.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: F - macro: '{#LOCATION}' value: '{$AZURE.VM.LOCATION.MATCHES}' formulaid: C - macro: '{#LOCATION}' value: '{$AZURE.VM.LOCATION.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: D - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.MATCHES}' formulaid: A - macro: '{#GROUP}' value: '{$AZURE.RESOURCE.GROUP.NOT.MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B description: 'The list of the virtual machines is provided by the subscription.' host_prototypes: - uuid: d08c0ee33c924b28bf1fed571da6c7f4 host: 'Azure virtual machine {#NAME}' name: 'Azure virtual machine {#NAME}' group_links: - group: name: 'Virtual machines' templates: - name: 'Azure Virtual Machine by HTTP' macros: - macro: '{$AZURE.RESOURCE.ID}' value: '{#ID}' tags: - tag: location value: '{#LOCATION}' - tag: os value: '{#OS}' - tag: resource-group value: '{#GROUP}' - tag: size value: '{#SIZE}' master_item: key: azure.get.resources lld_macro_paths: - lld_macro: '{#GROUP}' path: $.resourceGroup - lld_macro: '{#ID}' path: $.id - lld_macro: '{#LOCATION}' path: $.location - lld_macro: '{#NAME}' path: $.name - lld_macro: '{#OS}' path: $.properties.storageProfile.osDisk.osType - lld_macro: '{#SIZE}' path: $.properties.hardwareProfile.vmSize - lld_macro: '{#TYPE}' path: $.type preprocessing: - type: JSONPATH parameters: - $.resources.value - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 6h tags: - tag: class value: software - tag: target value: azure macros: - macro: '{$AZURE.APP.ID}' description: 'The App ID of Microsoft Azure.' - macro: '{$AZURE.COSMOS.MONGO.DB.LOCATION.MATCHES}' value: '.*' description: 'This macro is used in Microsoft Cosmos DB account discovery rule.' - macro: '{$AZURE.COSMOS.MONGO.DB.LOCATION.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in Microsoft Cosmos DB account discovery rule.' - macro: '{$AZURE.COSMOS.MONGO.DB.NAME.MATCHES}' value: '.*' description: 'This macro is used in Microsoft Cosmos DB account discovery rule.' - macro: '{$AZURE.COSMOS.MONGO.DB.NAME.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in Microsoft Cosmos DB account discovery rule.' - macro: '{$AZURE.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$AZURE.MSSQL.DB.LOCATION.MATCHES}' value: '.*' description: 'This macro is used in Microsoft SQL databases discovery rule.' - macro: '{$AZURE.MSSQL.DB.LOCATION.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in Microsoft SQL databases discovery rule.' - macro: '{$AZURE.MSSQL.DB.NAME.MATCHES}' value: '.*' description: 'This macro is used in Microsoft SQL databases discovery rule.' - macro: '{$AZURE.MSSQL.DB.NAME.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in Microsoft SQL databases discovery rule.' - macro: '{$AZURE.MSSQL.DB.SIZE.NOT.MATCHES}' value: ^System$ description: 'This macro is used in Microsoft SQL databases discovery rule.' - macro: '{$AZURE.MYSQL.DB.LOCATION.MATCHES}' value: '.*' description: 'This macro is used in MySQL servers discovery rule.' - macro: '{$AZURE.MYSQL.DB.LOCATION.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in MySQL servers discovery rule.' - macro: '{$AZURE.MYSQL.DB.NAME.MATCHES}' value: '.*' description: 'This macro is used in MySQL servers discovery rule.' - macro: '{$AZURE.MYSQL.DB.NAME.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in MySQL servers discovery rule.' - macro: '{$AZURE.PASSWORD}' type: SECRET_TEXT description: 'Microsoft Azure password.' - macro: '{$AZURE.PGSQL.DB.LOCATION.MATCHES}' value: '.*' description: 'This macro is used in PostgreSQL servers discovery rule.' - macro: '{$AZURE.PGSQL.DB.LOCATION.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in PostgreSQL servers discovery rule.' - macro: '{$AZURE.PGSQL.DB.NAME.MATCHES}' value: '.*' description: 'This macro is used in PostgreSQL servers discovery rule.' - macro: '{$AZURE.PGSQL.DB.NAME.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in PostgreSQL servers discovery rule.' - macro: '{$AZURE.PROXY}' description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.' - macro: '{$AZURE.RESOURCE.GROUP.MATCHES}' value: '.*' description: 'This macro is used in discovery rules.' - macro: '{$AZURE.RESOURCE.GROUP.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in discovery rules.' - macro: '{$AZURE.STORAGE.ACC.AVAILABILITY}' value: '70' description: 'The warning threshold of the storage account availability.' - macro: '{$AZURE.STORAGE.ACC.BLOB.AVAILABILITY}' value: '70' description: 'The warning threshold of the storage account blob services availability.' - macro: '{$AZURE.STORAGE.ACC.LOCATION.MATCHES}' value: '.*' description: 'This macro is used in storage accounts discovery rule.' - macro: '{$AZURE.STORAGE.ACC.LOCATION.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in storage accounts discovery rule.' - macro: '{$AZURE.STORAGE.ACC.NAME.MATCHES}' value: '.*' description: 'This macro is used in storage accounts discovery rule.' - macro: '{$AZURE.STORAGE.ACC.NAME.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in storage accounts discovery rule.' - macro: '{$AZURE.STORAGE.ACC.TABLE.AVAILABILITY}' value: '70' description: 'The warning threshold of the storage account table services availability.' - macro: '{$AZURE.SUBSCRIPTION.ID}' description: 'Microsoft Azure subscription ID.' - macro: '{$AZURE.TENANT.ID}' description: 'Microsoft Azure tenant ID.' - macro: '{$AZURE.VM.LOCATION.MATCHES}' value: '.*' description: 'This macro is used in virtual machines discovery rule.' - macro: '{$AZURE.VM.LOCATION.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in virtual machines discovery rule.' - macro: '{$AZURE.VM.NAME.MATCHES}' value: '.*' description: 'This macro is used in virtual machines discovery rule.' - macro: '{$AZURE.VM.NAME.NOT.MATCHES}' value: CHANGE_IF_NEEDED description: 'This macro is used in virtual machines discovery rule.' - uuid: 29325098807848aa928b4192ad5e020f template: 'Azure Cosmos DB for MongoDB by HTTP' name: 'Azure Cosmos DB for MongoDB by HTTP' description: | This template is designed to monitor Microsoft Azure Cosmos DB for MongoDB by HTTP. It works without any external scripts and uses the script item. Setup: 1. Create an Azure service principal via the Azure command-line interface (Azure CLI) for your subscription. `az ad sp create-for-rbac --name zabbix --role reader --scope /subscriptions/` See https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli for more details. 2. Link the template to a host. 3. Configure the macros: {$AZURE.APP.ID}, {$AZURE.PASSWORD}, {$AZURE.TENANT.ID}, {$AZURE.SUBSCRIPTION.ID}, and {$AZURE.RESOURCE.ID}. You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/ Generated by official Zabbix template tool "Templator" 2.0.0 vendor: name: Zabbix version: 7.0-0 groups: - name: Templates/Cloud items: - uuid: 9e247bdb17f44630b9440b59d5ef251b name: 'Azure MongoDB: Autoscale max throughput' type: DEPENDENT key: azure.cosmosdb.autoscale.max.throughput delay: '0' history: 7d description: 'The autoscale max throughput.' preprocessing: - type: JSONPATH parameters: - $.requests.AutoscaleMaxThroughput.maximum error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: 35a7d2c96990407f937e07fd160266a9 name: 'Azure MongoDB: Get errors' type: DEPENDENT key: azure.cosmosdb.data.errors delay: '0' history: 7d trends: '0' value_type: TEXT description: 'A list of errors from API requests.' preprocessing: - type: JSONPATH parameters: - $.error error_handler: CUSTOM_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.cosmosdb.data.get tags: - tag: component value: raw triggers: - uuid: dfd484aa8a4e4b759e4e34c5318c7176 expression: 'length(last(/Azure Cosmos DB for MongoDB by HTTP/azure.cosmosdb.data.errors))>0' name: 'Azure MongoDB: There are errors in requests to API' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'Zabbix has received errors in response to API requests.' tags: - tag: scope value: availability - uuid: 647faea1597c4da6a3cd78694be8e77e name: 'Azure MongoDB: Get data' type: SCRIPT key: azure.cosmosdb.data.get history: 0d trends: '0' value_type: TEXT params: | var AzureCosmoDB = { params: {}, token: null, setParams: function (params) { ['app_id', 'password', 'tenant_id', 'subscription_id', 'resource_id'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); AzureCosmoDB.params = params; }, login: function () { var response, login = new HttpRequest(); if (typeof AzureCosmoDB.params.proxy !== 'undefined' && AzureCosmoDB.params.proxy !== '') { login.setProxy(AzureCosmoDB.params.proxy); } login.addHeader('Content-Type: application/x-www-form-urlencoded'); response = login.post( 'https://login.microsoftonline.com/' + encodeURIComponent(AzureCosmoDB.params.tenant_id) + '/oauth2/token', 'grant_type=client_credentials&resource=' + encodeURIComponent('https://management.azure.com/') + '&client_id=' + encodeURIComponent(AzureCosmoDB.params.app_id) + '&client_secret=' + encodeURIComponent(AzureCosmoDB.params.password) ); if (login.getStatus() !== 200) { throw 'Login failed with status code ' + login.getStatus() + ': ' + response; } try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse login session response.'; } if (!response.hasOwnProperty('access_token')) { throw 'Authentication response does not contain access token.'; } AzureCosmoDB.token = response['access_token']; }, request: function (url) { var response, request = new HttpRequest(); if (typeof AzureCosmoDB.params.proxy !== 'undefined' && AzureCosmoDB.params.proxy !== '') { request.setProxy(AzureCosmoDB.params.proxy); } if (!AzureCosmoDB.token) { throw 'Request does not contain access token.'; } request.addHeader('Accept: application/json'); request.addHeader('Authorization: Bearer ' + AzureCosmoDB.token); Zabbix.log(4, '[ AzureCosmoDB ] request url: ' + url); response = request.get(url); if (request.getStatus() !== 200) { throw 'Request failed with status code ' + request.getStatus() + ': ' + response; } try { return JSON.parse(response); } catch (error) { throw 'Failed to parse response received from API.'; } }, getField: function (data, path) { var steps = path.split('.'); for (var i = 0; i < steps.length; i++) { var step = steps[i]; if (typeof data !== 'object' || typeof data[step] === 'undefined') { throw 'Required field was not found: ' + path; } data = data[step]; } return data; }, getMetricsData: function () { var data = {}; start_date = new Date((new Date().getTime()) - 600000).toISOString().replace(/\.\d+/, ''); end_date = new Date(new Date().getTime()).toISOString().replace(/\.\d+/, ''); endpoints = { 'availability': '/providers/Microsoft.Insights/metrics?metricnames=ServiceAvailability&api-version=2021-05-01&interval=PT1H×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date), 'requests': '/providers/Microsoft.Insights/metrics?metricnames=DataUsage,IndexUsage,DocumentQuota,AvailableStorage,DocumentCount,NormalizedRUConsumption,PhysicalPartitionThroughputInfo,PhysicalPartitionSizeInfo,AutoscaleMaxThroughput,ProvisionedThroughput,TotalRequests,TotalRequestUnits,MetadataRequests,MongoRequests,MongoRequestCharge,ServerSideLatency,ServerSideLatencyGateway,ServerSideLatencyDirect,ReplicationLatency&api-version=2021-05-01×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date), }; Object.keys(endpoints).forEach(function (field) { data[field] = {}; try { metrics = AzureCosmoDB.request('https://management.azure.com' + AzureCosmoDB.params.resource_id + endpoints[field]); if (!metrics.hasOwnProperty('value')) { throw 'Failed getting required field. Check debug log for more information.'; } for (k in metrics.value) { key = AzureCosmoDB.getField(metrics.value[k], 'name.value') if (metrics.value[k].timeseries.length === 0) { metrics.value[k].timeseries.push({ 'data': ['nodata'] }) } data[field][key] = AzureCosmoDB.getField(metrics.value[k], 'timeseries.0.data.0'); } } catch (error) { data.error = error.toString(); } }); return data } }; try { AzureCosmoDB.setParams(JSON.parse(value)); AzureCosmoDB.login(); return JSON.stringify(AzureCosmoDB.getMetricsData()); } catch (error) { error += (String(error).endsWith('.')) ? '' : '.'; Zabbix.log(3, '[ AzureCosmoDB ] ERROR: ' + error); return JSON.stringify({ 'error': error }); } description: 'The result of API requests is expressed in the JSON.' timeout: '{$AZURE.DATA.TIMEOUT}' parameters: - name: app_id value: '{$AZURE.APP.ID}' - name: password value: '{$AZURE.PASSWORD}' - name: tenant_id value: '{$AZURE.TENANT.ID}' - name: subscription_id value: '{$AZURE.SUBSCRIPTION.ID}' - name: resource_id value: '{$AZURE.RESOURCE.ID}' - name: proxy value: '{$AZURE.PROXY}' tags: - tag: component value: raw - uuid: 947a2eb530754a609fa81c59e29fe7b7 name: 'Azure MongoDB: Data usage' type: DEPENDENT key: azure.cosmosdb.data.usage delay: '0' history: 7d units: B description: 'The total data usage.' preprocessing: - type: JSONPATH parameters: - $.requests.DataUsage.total error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: 0bf3da9168144016b663c9b8e76447fa name: 'Azure MongoDB: Document count' type: DEPENDENT key: azure.cosmosdb.document.count delay: '0' history: 7d description: 'The total document count.' preprocessing: - type: JSONPATH parameters: - $.requests.DocumentCount.total error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: 7fa0f59f8cfa4d9e83086b203e4f71ea name: 'Azure MongoDB: Document quota' type: DEPENDENT key: azure.cosmosdb.document.quota delay: '0' history: 7d units: B description: 'The total storage quota.' preprocessing: - type: JSONPATH parameters: - $.requests.DocumentQuota.total error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: b09f9445d960415185457b89b6a73452 name: 'Azure MongoDB: Index usage' type: DEPENDENT key: azure.cosmosdb.index.usage delay: '0' history: 7d units: B description: 'The total index usage.' preprocessing: - type: JSONPATH parameters: - $.requests.IndexUsage.total error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: cd35f04b180542cda50dc5d4e979e54e name: 'Azure MongoDB: Metadata requests' type: DEPENDENT key: azure.cosmosdb.metadata.requests delay: '0' history: 7d description: | The count of metadata requests. Cosmos DB maintains system metadata collection for each account, that allows you to enumerate collections, databases, etc, and their configurations, free of charge. preprocessing: - type: JSONPATH parameters: - $.requests.MetadataRequests.count error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: e42cf83e456a490295a84cfe9eb288ef name: 'Azure MongoDB: Mongo requests' type: DEPENDENT key: azure.cosmosdb.mongo.requests delay: '0' history: 7d description: 'The number of Mongo requests made.' preprocessing: - type: JSONPATH parameters: - $.requests.MongoRequests.count error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: 8fd4068986af444799ae64c6bc8f16a6 name: 'Azure MongoDB: Mongo request charge' type: DEPENDENT key: azure.cosmosdb.mongo.requests.charge delay: '0' history: 7d description: 'The Mongo request units consumed.' preprocessing: - type: JSONPATH parameters: - $.requests.MongoRequestCharge.total error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: fda6b39ce6ef4b8c8418b2e123ecdd17 name: 'Azure MongoDB: Normalized RU consumption' type: DEPENDENT key: azure.cosmosdb.normalized.ru.consumption delay: '0' history: 7d units: '%' description: 'The max RU consumption percentage per minute.' preprocessing: - type: JSONPATH parameters: - $.requests.NormalizedRUConsumption.maximum error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: be6800214a0443e899c40f8a4b6c3f21 name: 'Azure MongoDB: Physical partition size' type: DEPENDENT key: azure.cosmosdb.physical.partition.size delay: '0' history: 7d units: B description: 'The physical partition size in bytes.' preprocessing: - type: JSONPATH parameters: - $.requests.PhysicalPartitionSizeInfo.maximum error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: e30d5eadde15427484e7a0d1cb38e9e3 name: 'Azure MongoDB: Physical partition throughput' type: DEPENDENT key: azure.cosmosdb.physical.partition.throughput delay: '0' history: 7d description: 'The physical partition throughput.' preprocessing: - type: JSONPATH parameters: - $.requests.PhysicalPartitionThroughputInfo.maximum error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: 49311bbfb2584a46b42ed1a7d8fcfd94 name: 'Azure MongoDB: Provisioned throughput' type: DEPENDENT key: azure.cosmosdb.provisioned.throughput delay: '0' history: 7d description: 'The provisioned throughput.' preprocessing: - type: JSONPATH parameters: - $.requests.ProvisionedThroughput.maximum error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: 6d7175e27d10406191c883dc2e5949e4 name: 'Azure MongoDB: Replication latency, P99' type: DEPENDENT key: azure.cosmosdb.replication.latency delay: '0' history: 7d value_type: FLOAT units: s description: 'The P99 replication latency across source and target regions for geo-enabled account.' preprocessing: - type: JSONPATH parameters: - $.requests.ReplicationLatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' master_item: key: azure.cosmosdb.data.get tags: - tag: component value: network - uuid: d9b5af0c71874114b48464ce20f8cf3d name: 'Azure MongoDB: Server side latency' type: DEPENDENT key: azure.cosmosdb.server.side.latency delay: '0' history: 7d value_type: FLOAT units: s description: 'The server side latency.' preprocessing: - type: JSONPATH parameters: - $.requests.ServerSideLatency.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' master_item: key: azure.cosmosdb.data.get tags: - tag: component value: network - uuid: 7587d3750d1643f085db5931670dc2f3 name: 'Azure MongoDB: Server side latency, direct' type: DEPENDENT key: azure.cosmosdb.server.side.latency.direct delay: '0' history: 7d value_type: FLOAT units: s description: 'The server side latency in direct connection mode.' preprocessing: - type: JSONPATH parameters: - $.requests.ServerSideLatencyDirect.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' master_item: key: azure.cosmosdb.data.get tags: - tag: component value: network - uuid: 0aefdc3101fe4bcba4743d6e32671554 name: 'Azure MongoDB: Server side latency, gateway' type: DEPENDENT key: azure.cosmosdb.server.side.latency.gateway delay: '0' history: 7d value_type: FLOAT units: s description: 'The server side latency in gateway connection mode.' preprocessing: - type: JSONPATH parameters: - $.requests.ServerSideLatencyGateway.average error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.001' master_item: key: azure.cosmosdb.data.get tags: - tag: component value: network - uuid: 42bd03c1753b4f19bc9793b03834cd3d name: 'Azure MongoDB: Service availability' type: DEPENDENT key: azure.cosmosdb.service.availability delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The account requests availability at one hour granularity.' preprocessing: - type: JSONPATH parameters: - $.availability.ServiceAvailability.average error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: health triggers: - uuid: c7649cd317f04a3d8fec0eebe3df6766 expression: '(min(/Azure Cosmos DB for MongoDB by HTTP/azure.cosmosdb.service.availability,#3))<{$AZURE.DB.COSMOS.MONGO.AVAILABILITY}' name: 'Azure MongoDB: Cosmos DB for MongoDB account: Availability is low' opdata: '{ITEM.LASTVALUE1}' priority: WARNING tags: - tag: scope value: availability - uuid: f4d4d2def5e945ab9048ada4813b7f04 name: 'Azure MongoDB: Total request units' type: DEPENDENT key: azure.cosmosdb.total.request.units delay: '0' history: 7d value_type: FLOAT description: 'The request units consumed per minute.' preprocessing: - type: JSONPATH parameters: - $.requests.TotalRequestUnits.total error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage - uuid: 3dd2cd4edb7746edb9d917c83b280ca3 name: 'Azure MongoDB: Total requests' type: DEPENDENT key: azure.cosmosdb.total.requests delay: '0' history: 7d description: 'Number of requests per minute.' preprocessing: - type: JSONPATH parameters: - $.requests.TotalRequests.count error_handler: DISCARD_VALUE master_item: key: azure.cosmosdb.data.get tags: - tag: component value: storage tags: - tag: class value: software - tag: target value: azure - tag: target value: cosmosdb - tag: target value: mongodb macros: - macro: '{$AZURE.APP.ID}' description: 'The App ID of Microsoft Azure.' - macro: '{$AZURE.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$AZURE.DB.COSMOS.MONGO.AVAILABILITY}' value: '70' description: 'The warning threshold of the Cosmos DB for MongoDB service availability.' - macro: '{$AZURE.PASSWORD}' type: SECRET_TEXT description: 'Microsoft Azure password.' - macro: '{$AZURE.PROXY}' description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.' - macro: '{$AZURE.RESOURCE.ID}' description: 'Microsoft Azure Cosmos DB ID.' - macro: '{$AZURE.SUBSCRIPTION.ID}' description: 'Microsoft Azure subscription ID.' - macro: '{$AZURE.TENANT.ID}' description: 'Microsoft Azure tenant ID.' dashboards: - uuid: 323fb91b388a44bfbd4b7d634f6e6b6c name: 'Overview Cosmos DB for MongoDB' pages: - widgets: - type: graph 'y': '14' width: '24' height: '5' fields: - type: GRAPH name: graphid value: host: 'Azure Cosmos DB for MongoDB by HTTP' name: 'Azure MongoDB: Latency' - type: graph 'y': '9' width: '24' height: '5' fields: - type: GRAPH name: graphid value: host: 'Azure Cosmos DB for MongoDB by HTTP' name: 'Azure MongoDB: Requests' - type: graph 'y': '4' width: '24' height: '5' fields: - type: GRAPH name: graphid value: host: 'Azure Cosmos DB for MongoDB by HTTP' name: 'Azure MongoDB: Usage' - type: item name: 'Document Count' x: '18' width: '6' height: '4' fields: - type: INTEGER name: show value: '2' - type: ITEM name: itemid value: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.document.count - type: item name: 'Normalized RU Consumption' x: '12' width: '6' height: '4' fields: - type: INTEGER name: show value: '4' - type: INTEGER name: show value: '2' - type: ITEM name: itemid value: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.normalized.ru.consumption - type: item name: 'Provisioned Throughput' x: '6' width: '6' height: '4' fields: - type: INTEGER name: show value: '2' - type: ITEM name: itemid value: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.provisioned.throughput - type: item name: 'Service Availability' width: '6' height: '4' fields: - type: INTEGER name: show value: '2' - type: INTEGER name: show value: '4' - type: INTEGER name: adv_conf value: '1' - type: INTEGER name: decimal_places value: '0' - type: STRING name: units value: '%' - type: STRING name: up_color value: 4CAF50 - type: STRING name: units_color value: 66BB6A - type: STRING name: value_color value: 66BB6A - type: STRING name: down_color value: FF0000 - type: ITEM name: itemid value: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.service.availability - uuid: 2d8b9329b5d04cdf85bf17d2d0db2b29 template: 'Azure Microsoft SQL Database by HTTP' name: 'Azure Microsoft SQL Database by HTTP' description: | This template is designed to monitor Microsoft SQL databases by HTTP. It works without any external scripts and uses the script item. Setup: 1. Create an Azure service principal via the Azure command-line interface (Azure CLI) for your subscription. `az ad sp create-for-rbac --name zabbix --role reader --scope /subscriptions/` See https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli for more details. 2. Link the template to a host. 3. Configure the macros: {$AZURE.APP.ID}, {$AZURE.PASSWORD}, {$AZURE.TENANT.ID}, {$AZURE.SUBSCRIPTION.ID}, and {$AZURE.RESOURCE.ID}. You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/ Generated by official Zabbix template tool "Templator" 2.0.0 vendor: name: Zabbix version: 7.0-0 groups: - name: Templates/Cloud items: - uuid: 2ff1f479e0b447f2b85e75e99bc011fe name: 'Azure Microsoft SQL: Availability status detailed' type: DEPENDENT key: azure.db.mssql.availability.details delay: '0' history: 7d trends: '0' value_type: CHAR description: 'The summary description of the availability status.' preprocessing: - type: JSONPATH parameters: - $.health.summary - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mssql.data.get tags: - tag: component value: health - uuid: f15e8075ac9a4f1ca6e95106940b246e name: 'Azure Microsoft SQL: Availability state' type: DEPENDENT key: azure.db.mssql.availability.state delay: '0' history: 7d description: 'The availability status of the resource.' valuemap: name: 'Azure resource health state' preprocessing: - type: JSONPATH parameters: - $.health.availabilityState error_handler: CUSTOM_VALUE error_handler_params: '3' - type: STR_REPLACE parameters: - Available - '0' - type: STR_REPLACE parameters: - Degraded - '1' - type: STR_REPLACE parameters: - Unavailable - '2' - type: STR_REPLACE parameters: - Unknown - '3' - type: IN_RANGE parameters: - '0' - '3' error_handler: CUSTOM_VALUE error_handler_params: '3' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mssql.data.get tags: - tag: component value: health triggers: - uuid: 5156f35b82084fd3b1d1a11c35757993 expression: 'last(/Azure Microsoft SQL Database by HTTP/azure.db.mssql.availability.state)=1' name: 'Azure Microsoft SQL: Microsoft SQL database is degraded' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'The resource is in degraded state.' tags: - tag: scope value: availability - uuid: 0cf3cce995c241838e13df12d5908b61 expression: 'last(/Azure Microsoft SQL Database by HTTP/azure.db.mssql.availability.state)=3' name: 'Azure Microsoft SQL: Microsoft SQL database is in unknown state' opdata: '{ITEM.LASTVALUE1}' priority: WARNING description: 'The resource state is unknown.' tags: - tag: scope value: availability - uuid: 2130dc83dee94fdfad87894127c6a578 expression: 'last(/Azure Microsoft SQL Database by HTTP/azure.db.mssql.availability.state)=2' name: 'Azure Microsoft SQL: Microsoft SQL database is unavailable' opdata: '{ITEM.LASTVALUE1}' priority: HIGH description: 'The resource state is unavailable.' tags: - tag: scope value: availability - uuid: ce744d69ed12435db781fbc6100d97ab name: 'Azure Microsoft SQL: Connections failed: System errors' type: DEPENDENT key: azure.db.mssql.connections.failed.system delay: '0' history: 7d value_type: FLOAT description: 'The count of failed connections with system errors.' preprocessing: - type: JSONPATH parameters: - $.metrics.connection_failed.total master_item: key: azure.db.mssql.data.get tags: - tag: component value: network - uuid: 8ec27240f59947858c41762a266cab25 name: 'Azure Microsoft SQL: Connections successful' type: DEPENDENT key: azure.db.mssql.connections.successful delay: '0' history: 7d value_type: FLOAT description: 'The count of successful connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.connection_successful.total master_item: key: azure.db.mssql.data.get tags: - tag: component value: network - uuid: 04737f2746444d2fb348a9444964dc7a name: 'Azure Microsoft SQL: CPU limit' type: DEPENDENT key: azure.db.mssql.cpu.limit delay: '0' history: 7d value_type: FLOAT description: 'The CPU limit. Applies to the vCore-based databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_limit.average error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: cpu - uuid: e55a199cc0bd4749a69478da8268785d name: 'Azure Microsoft SQL: Percentage CPU' type: DEPENDENT key: azure.db.mssql.cpu.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The CPU percent of a host.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: cpu triggers: - uuid: 506c034e707442519792a4366bc0879d expression: 'min(/Azure Microsoft SQL Database by HTTP/azure.db.mssql.cpu.percentage,5m)>{$AZURE.DB.CPU.UTIL.CRIT}' name: 'Azure Microsoft SQL: High CPU utilization' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: HIGH description: 'The CPU utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: 9a4a948f41e4434e9a94b3d9546df896 name: 'Azure Microsoft SQL: CPU used' type: DEPENDENT key: azure.db.mssql.cpu.used delay: '0' history: 7d value_type: FLOAT description: 'The CPU used. Applies to the vCore-based databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_used.average error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: cpu - uuid: e8aa1b70a7384ffead05cd2e95a6f10a name: 'Azure Microsoft SQL: Get errors' type: DEPENDENT key: azure.db.mssql.data.errors delay: '0' history: 7d trends: '0' value_type: TEXT description: 'A list of errors from API requests.' preprocessing: - type: JSONPATH parameters: - $.errors - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mssql.data.get tags: - tag: component value: raw triggers: - uuid: 62d08fe430bd45e890c81547860d5c3d expression: 'length(last(/Azure Microsoft SQL Database by HTTP/azure.db.mssql.data.errors))>0' name: 'Azure Microsoft SQL: There are errors in requests to API' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'Zabbix has received errors in response to API requests.' tags: - tag: scope value: availability - uuid: 741cc1ec6a824e429f06b3d12a8a7082 name: 'Azure Microsoft SQL: Get data' type: SCRIPT key: azure.db.mssql.data.get history: '0' trends: '0' value_type: TEXT params: | var AzureDB = { params: {}, token: null, setParams: function (params) { ['app_id', 'password', 'tenant_id', 'subscription_id', 'resource_id'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); AzureDB.params = params; }, request: function (url, data) { if (typeof data === 'undefined' || data === null) { data = ''; } var response, request = new HttpRequest(); if (typeof AzureDB.params.proxy !== 'undefined' && AzureDB.params.proxy !== '') { request.setProxy(AzureDB.params.proxy); } if (AzureDB.token) { request.addHeader('Accept: application/json'); request.addHeader('Authorization: Bearer ' + AzureDB.token); } Zabbix.log(4, '[ Azure ] Sending request: ' + url); if (data !== '') { request.addHeader('Content-Type: application/x-www-form-urlencoded'); response = request.post(url, data); } else { response = request.get(url); } Zabbix.log(4, '[ Azure ] Received response with status code ' + request.getStatus() + ': ' + response); if (request.getStatus() !== 200 || response === null) { throw 'Request failed with status code ' + request.getStatus() + ': ' + response; } try { return JSON.parse(response); } catch (error) { throw 'Failed to parse response received from API.'; } } }; var metrics = [ 'cpu_percent', 'physical_data_read_percent', 'log_write_percent', 'storage', 'connection_successful', 'connection_failed', 'blocked_by_firewall', 'deadlock', 'storage_percent', 'xtp_storage_percent', 'workers_percent', 'sessions_percent', 'sessions_count', 'cpu_limit', 'cpu_used', 'sqlserver_process_core_percent', 'sqlserver_process_memory_percent', 'tempdb_data_size', 'tempdb_log_size', 'tempdb_log_used_percent', 'allocated_data_storage' ], day_metrics = 'full_backup_size_bytes,diff_backup_size_bytes,log_backup_size_bytes', prepared_metrics = [], data = {}; data['errors'] = {}; data['metrics'] = {}; try { AzureDB.setParams(JSON.parse(value)); try { result = AzureDB.request( 'https://login.microsoftonline.com/' + encodeURIComponent(AzureDB.params.tenant_id) + '/oauth2/token', 'grant_type=client_credentials&resource=' + encodeURIComponent('https://management.azure.com/') + '&client_id=' + encodeURIComponent(AzureDB.params.app_id) + '&client_secret=' + encodeURIComponent(AzureDB.params.password) ); if ('access_token' in result) { AzureDB.token = result['access_token']; } else { throw 'Auth response does not contain access token.'; } } catch (error) { data.errors.auth = error.toString(); } if (!('auth' in data.errors)) { try { health = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.ResourceHealth/availabilityStatuses?api-version=2020-05-01'); if ('value' in health && Array.isArray(health.value) && health.value.length > 0 && 'properties' in health.value[0] && typeof health.value[0].properties === 'object') { data.health = health.value[0].properties; } } catch (error) { data.errors.health = error.toString(); } for (var i = 0; i < metrics.length; i += 20) { var chunk = metrics.slice(i, i + 20); prepared_metrics.push( chunk.map(function (element) { return encodeURIComponent(element); }).join(',') ); } start_date = new Date((new Date().getTime()) - 300000).toISOString().replace(/\.\d+/, ''); end_date = new Date().toISOString().replace(/\.\d+/, ''); for (var j in prepared_metrics) { try { metrics_data = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.Insights/metrics?metricnames=' + prepared_metrics[j] + '×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date) + '&api-version=2021-05-01'); if ('value' in metrics_data && Array.isArray(metrics_data.value) && metrics_data.value.length > 0) { for (k in metrics_data.value) { if ('name' in metrics_data.value[k] && typeof metrics_data.value[k].name === 'object' && 'value' in metrics_data.value[k].name && typeof metrics_data.value[k].name.value === 'string' && 'timeseries' in metrics_data.value[k] && Array.isArray(metrics_data.value[k].timeseries) && metrics_data.value[k].timeseries.length > 0 && 'data' in metrics_data.value[k].timeseries[0] && Array.isArray(metrics_data.value[k].timeseries[0].data) && metrics_data.value[k].timeseries[0].data.length > 0) { data.metrics[metrics_data.value[k].name.value.replace(/(\s|\/)+/g, '')] = metrics_data.value[k].timeseries[0].data[metrics_data.value[k].timeseries[0].data.length - 1]; } } } } catch (error) { data.errors[prepared_metrics[j]] = error.toString(); } } start_date = new Date((new Date().getTime()) - 86400000).toISOString().replace(/\.\d+/, ''); end_date = new Date().toISOString().replace(/\.\d+/, ''); try { metrics_data = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.Insights/metrics?metricnames=' + day_metrics + '×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date) + '&api-version=2021-05-01'); if ('value' in metrics_data && Array.isArray(metrics_data.value) && metrics_data.value.length > 0) { for (l in metrics_data.value) { if ('name' in metrics_data.value[l] && typeof metrics_data.value[l].name === 'object' && 'value' in metrics_data.value[l].name && typeof metrics_data.value[l].name.value === 'string' && 'timeseries' in metrics_data.value[l] && Array.isArray(metrics_data.value[l].timeseries) && metrics_data.value[l].timeseries.length > 0 && 'data' in metrics_data.value[l].timeseries[0] && Array.isArray(metrics_data.value[l].timeseries[0].data) && metrics_data.value[l].timeseries[0].data.length > 0) { data.metrics[metrics_data.value[l].name.value.replace(/(\s|\/)+/g, '')] = metrics_data.value[l].timeseries[0].data[metrics_data.value[l].timeseries[0].data.length - 1]; } } } } catch (error) { data.errors[day_metrics] = error.toString(); } } } catch (error) { data.errors.params = error.toString(); } if (Object.keys(data.errors).length !== 0) { errors = 'Failed to receive data:'; for (var error in data.errors) { errors += '\n' + error + ' : ' + data.errors[error]; } data.errors = errors; } else { data.errors = ''; } return JSON.stringify(data); description: 'The result of API requests is expressed in the JSON.' timeout: '{$AZURE.DATA.TIMEOUT}' parameters: - name: app_id value: '{$AZURE.APP.ID}' - name: password value: '{$AZURE.PASSWORD}' - name: tenant_id value: '{$AZURE.TENANT.ID}' - name: subscription_id value: '{$AZURE.SUBSCRIPTION.ID}' - name: resource_id value: '{$AZURE.RESOURCE.ID}' - name: proxy value: '{$AZURE.PROXY}' tags: - tag: component value: raw - uuid: 75d9288a8240425782cce8701c1bdfa8 name: 'Azure Microsoft SQL: Data IO percentage' type: DEPENDENT key: azure.db.mssql.data.read.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of physical data read.' preprocessing: - type: JSONPATH parameters: - $.metrics.physical_data_read_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: operations - uuid: 81f87d35131c426299b233279f8f6c4b name: 'Azure Microsoft SQL: Deadlocks' type: DEPENDENT key: azure.db.mssql.deadlocks delay: '0' history: 7d value_type: FLOAT description: 'The count of deadlocks. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.deadlock.total master_item: key: azure.db.mssql.data.get tags: - tag: component value: network - uuid: 4d78e4691b6f4ab095849e6af2713638 name: 'Azure Microsoft SQL: Connections blocked by firewall' type: DEPENDENT key: azure.db.mssql.firewall.blocked delay: '0' history: 7d value_type: FLOAT description: 'The count of connections blocked by a firewall.' preprocessing: - type: JSONPATH parameters: - $.metrics.blocked_by_firewall.total master_item: key: azure.db.mssql.data.get tags: - tag: component value: network - uuid: 324c16e5da5b40c78d687f1f41a9d180 name: 'Azure Microsoft SQL: Log IO percentage' type: DEPENDENT key: azure.db.mssql.log.write.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of I/O log. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.log_write_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: operations - uuid: f417464b2de14e3292d68442570b931d name: 'Azure Microsoft SQL: SQL Server process core percent' type: DEPENDENT key: azure.db.mssql.server.cpu.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The CPU usage as a percentage of the SQL DB process. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.sqlserver_process_core_percent.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: cpu - tag: component value: server - uuid: b39aa0798a824dafb3f3871b6406106a name: 'Azure Microsoft SQL: SQL Server process memory percent' type: DEPENDENT key: azure.db.mssql.server.memory.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'Memory usage as a percentage of the SQL DB process. Not applicable to data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.sqlserver_process_memory_percent.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: memory - tag: component value: server - uuid: 754b453cdf464f73b09eced3dd3e5859 name: 'Azure Microsoft SQL: Sessions count' type: DEPENDENT key: azure.db.mssql.sessions.count delay: '0' history: 7d value_type: FLOAT description: 'The number of active sessions. Not applicable to Synapse DW Analytics.' preprocessing: - type: JSONPATH parameters: - $.metrics.sessions_count.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: sessions - uuid: b6696ac3d83841e2a001cdad1aeaea89 name: 'Azure Microsoft SQL: Sessions percentage' type: DEPENDENT key: azure.db.mssql.sessions.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of sessions. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.sessions_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: sessions - uuid: fddff3dcbcf44c408314946f01f26a79 name: 'Azure Microsoft SQL: Data space allocated' type: DEPENDENT key: azure.db.mssql.storage.allocated delay: '0' history: 7d value_type: FLOAT units: B description: 'The allocated data storage. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.allocated_data_storage.average error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: 3d492b552468462ba17524a9c6951dd7 name: 'Azure Microsoft SQL: Differential backup storage size' type: DEPENDENT key: azure.db.mssql.storage.backup.diff.size delay: '0' history: 7d value_type: FLOAT units: B description: 'Cumulative differential backup storage size. Applies to the vCore-based databases. Not applicable to the Hyperscale databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.diff_backup_size_bytes.maximum - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1d master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: e8cd0339a82248e3ad777374f219552e name: 'Azure Microsoft SQL: Log backup storage size' type: DEPENDENT key: azure.db.mssql.storage.backup.log.size delay: '0' history: 7d value_type: FLOAT units: B description: 'Cumulative log backup storage size. Applies to the vCore-based and Hyperscale databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.log_backup_size_bytes.maximum - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1d master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: c92867a096ad4d89b31a2dba7e560df1 name: 'Azure Microsoft SQL: Full backup storage size' type: DEPENDENT key: azure.db.mssql.storage.backup.size delay: '0' history: 7d value_type: FLOAT units: B description: 'Cumulative full backup storage size. Applies to the vCore-based databases. Not applicable to the Hyperscale databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.full_backup_size_bytes.maximum - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1d master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: 6eb5dc0a0b864c0bb35634612472ed38 name: 'Azure Microsoft SQL: Data space used percent' type: DEPENDENT key: azure.db.mssql.storage.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'Data space used percent. Not applicable to the data warehouses or hyperscale databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_percent.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage triggers: - uuid: a2d6cf9ac67d4d0eb312e9536299b345 expression: 'last(/Azure Microsoft SQL Database by HTTP/azure.db.mssql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.CRIT}' name: 'Azure Microsoft SQL: Storage space is critically low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: AVERAGE description: 'Critical utilization of the storage space.' tags: - tag: scope value: capacity - uuid: 6dbf1d3aeb8b44b8bd96a9ca75f5249e expression: 'last(/Azure Microsoft SQL Database by HTTP/azure.db.mssql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.WARN}' name: 'Azure Microsoft SQL: Storage space is low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: WARNING description: 'High utilization of the storage space.' tags: - tag: scope value: capacity - uuid: a0335bde6f3546cdad5bbd2db8fa50b1 name: 'Azure Microsoft SQL: Data space used' type: DEPENDENT key: azure.db.mssql.storage.used delay: '0' history: 7d value_type: FLOAT units: B description: 'Data space used. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: 6ff07a9a680749bfa3deabbec508b7c3 name: 'Azure Microsoft SQL: In-Memory OLTP storage percent' type: DEPENDENT key: azure.db.mssql.storage.xtp.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'In-Memory OLTP storage percent. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.xtp_storage_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: 76da2f210c084546a19ce156e0aee1d6 name: 'Azure Microsoft SQL: Tempdb data file size' type: DEPENDENT key: azure.db.mssql.tempdb.data.size delay: '0' history: 7d value_type: FLOAT units: B description: 'The space used in `tempdb` data files, expressed in bytes. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.tempdb_data_size.maximum error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '1024' master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: dd2986cc6ce441fe9b3ab9b44b5fc103 name: 'Azure Microsoft SQL: Tempdb log used percent' type: DEPENDENT key: azure.db.mssql.tempdb.log.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of space used in `tempdb` transaction log file. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.tempdb_log_used_percent.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: 51212e2af3854079950064bd9d16da83 name: 'Azure Microsoft SQL: Tempdb log file size' type: DEPENDENT key: azure.db.mssql.tempdb.log.size delay: '0' history: 7d value_type: FLOAT units: B description: 'The space used in `tempdb` transaction log file, expressed in bytes. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.tempdb_log_size.maximum error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '1024' master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: b5d63b2cbcb1470d8559a90cb3df0002 name: 'Azure Microsoft SQL: Workers percentage' type: DEPENDENT key: azure.db.mssql.workers.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of workers. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.workers_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: workers tags: - tag: class value: software - tag: target value: azure - tag: target value: mssql macros: - macro: '{$AZURE.APP.ID}' description: 'The App ID of Microsoft Azure.' - macro: '{$AZURE.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$AZURE.DB.CPU.UTIL.CRIT}' value: '90' description: 'The critical threshold of CPU utilization, expressed in %.' - macro: '{$AZURE.DB.MEMORY.UTIL.CRIT}' value: '90' description: 'The critical threshold of memory utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.CRIT}' value: '90' description: 'The critical threshold of storage utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.WARN}' value: '80' description: 'The warning threshold of storage utilization, expressed in %.' - macro: '{$AZURE.PASSWORD}' type: SECRET_TEXT description: 'Microsoft Azure password.' - macro: '{$AZURE.PROXY}' description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.' - macro: '{$AZURE.RESOURCE.ID}' description: 'Microsoft Azure Microsoft SQL database ID.' - macro: '{$AZURE.SUBSCRIPTION.ID}' description: 'Microsoft Azure subscription ID.' - macro: '{$AZURE.TENANT.ID}' description: 'Microsoft Azure tenant ID.' valuemaps: - uuid: 6f9c01899d9e45c9a1316ee081718e9e name: 'Azure resource health state' mappings: - value: '0' newvalue: Available - value: '1' newvalue: Degraded - value: '2' newvalue: Unavailable - value: '3' newvalue: Unknown - uuid: 5175afdf713744d9a81ce53864ccfc1d template: 'Azure Microsoft SQL Serverless Database by HTTP' name: 'Azure Microsoft SQL Serverless Database by HTTP' description: | This template is designed to monitor Microsoft SQL serverless databases by HTTP. It works without any external scripts and uses the script item. Setup: 1. Create an Azure service principal via the Azure command-line interface (Azure CLI) for your subscription. `az ad sp create-for-rbac --name zabbix --role reader --scope /subscriptions/` See https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli for more details. 2. Link the template to a host. 3. Configure the macros: {$AZURE.APP.ID}, {$AZURE.PASSWORD}, {$AZURE.TENANT.ID}, {$AZURE.SUBSCRIPTION.ID}, and {$AZURE.RESOURCE.ID}. You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/ Generated by official Zabbix template tool "Templator" 2.0.0 vendor: name: Zabbix version: 7.0-0 groups: - name: Templates/Cloud items: - uuid: 7c11fcc4f4b349f8b98fac93ae5e32be name: 'Azure Microsoft SQL: App CPU billed' type: DEPENDENT key: azure.db.mssql.app.cpu.billed delay: '0' history: 7d value_type: FLOAT description: 'App CPU billed. Applies to serverless databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.app_cpu_billed.total error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: cpu - uuid: 6e67a868b2d84838803d3cb464ae9648 name: 'Azure Microsoft SQL: App CPU percentage' type: DEPENDENT key: azure.db.mssql.app.cpu.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'App CPU percentage. Applies to serverless databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.app_cpu_percent.average error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: cpu - uuid: a38a887341914e75a01c7527c40b678f name: 'Azure Microsoft SQL: App memory percentage' type: DEPENDENT key: azure.db.mssql.app.memory.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'App memory percentage. Applies to serverless databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.app_memory_percent.average error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: memory - uuid: c2d3bc4ff95b4e05898dccee3d73a349 name: 'Azure Microsoft SQL: Availability status detailed' type: DEPENDENT key: azure.db.mssql.availability.details delay: '0' history: 7d trends: '0' value_type: CHAR description: 'The summary description of the availability status.' preprocessing: - type: JSONPATH parameters: - $.health.summary - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mssql.data.get tags: - tag: component value: health - uuid: 9a3f2e99a768492c859c8f368c6a5cd3 name: 'Azure Microsoft SQL: Availability state' type: DEPENDENT key: azure.db.mssql.availability.state delay: '0' history: 7d description: 'The availability status of the resource.' valuemap: name: 'Azure resource health state' preprocessing: - type: JSONPATH parameters: - $.health.availabilityState error_handler: CUSTOM_VALUE error_handler_params: '3' - type: STR_REPLACE parameters: - Available - '0' - type: STR_REPLACE parameters: - Degraded - '1' - type: STR_REPLACE parameters: - Unavailable - '2' - type: STR_REPLACE parameters: - Unknown - '3' - type: IN_RANGE parameters: - '0' - '3' error_handler: CUSTOM_VALUE error_handler_params: '3' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mssql.data.get tags: - tag: component value: health triggers: - uuid: 37c52a28908a45378266f68acdf5c308 expression: 'last(/Azure Microsoft SQL Serverless Database by HTTP/azure.db.mssql.availability.state)=1' name: 'Azure Microsoft SQL: Microsoft SQL database is degraded' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'The resource is in degraded state.' tags: - tag: scope value: availability - uuid: 20bd79f05f3241a9950a83dcd9e325ba expression: 'last(/Azure Microsoft SQL Serverless Database by HTTP/azure.db.mssql.availability.state)=3' name: 'Azure Microsoft SQL: Microsoft SQL database is in unknown state' opdata: '{ITEM.LASTVALUE1}' priority: WARNING description: 'The resource state is unknown.' tags: - tag: scope value: availability - uuid: 124813388e9844e8aae5ce474a66a774 expression: 'last(/Azure Microsoft SQL Serverless Database by HTTP/azure.db.mssql.availability.state)=2' name: 'Azure Microsoft SQL: Microsoft SQL database is unavailable' opdata: '{ITEM.LASTVALUE1}' priority: HIGH description: 'The resource state is unavailable.' tags: - tag: scope value: availability - uuid: 2457708a49d141faa16bd7b4ceb2c0a4 name: 'Azure Microsoft SQL: Connections failed: System errors' type: DEPENDENT key: azure.db.mssql.connections.failed.system delay: '0' history: 7d value_type: FLOAT description: 'The count of failed connections with system errors.' preprocessing: - type: JSONPATH parameters: - $.metrics.connection_failed.total master_item: key: azure.db.mssql.data.get tags: - tag: component value: network - uuid: 59e028a7323d4222a4efd727314327c1 name: 'Azure Microsoft SQL: Connections successful' type: DEPENDENT key: azure.db.mssql.connections.successful delay: '0' history: 7d value_type: FLOAT description: 'The count of successful connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.connection_successful.total master_item: key: azure.db.mssql.data.get tags: - tag: component value: network - uuid: 0dc1cf6302574c1fbb51583e03409713 name: 'Azure Microsoft SQL: CPU limit' type: DEPENDENT key: azure.db.mssql.cpu.limit delay: '0' history: 7d value_type: FLOAT description: 'The CPU limit. Applies to the vCore-based databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_limit.average error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: cpu - uuid: 53be31ecfd48472c8edfe223107c0b07 name: 'Azure Microsoft SQL: Percentage CPU' type: DEPENDENT key: azure.db.mssql.cpu.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The CPU percent of a host.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: cpu triggers: - uuid: 933a04a1455b4a89b1527f9ce7848259 expression: 'min(/Azure Microsoft SQL Serverless Database by HTTP/azure.db.mssql.cpu.percentage,5m)>{$AZURE.DB.CPU.UTIL.CRIT}' name: 'Azure Microsoft SQL: High CPU utilization' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: HIGH description: 'The CPU utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: ec0fc85904e149939836c2818a6ca66a name: 'Azure Microsoft SQL: CPU used' type: DEPENDENT key: azure.db.mssql.cpu.used delay: '0' history: 7d value_type: FLOAT description: 'The CPU used. Applies to the vCore-based databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_used.average error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: cpu - uuid: d933dbacb2b94e40a757e15f13d51d2d name: 'Azure Microsoft SQL: Get errors' type: DEPENDENT key: azure.db.mssql.data.errors delay: '0' history: 7d trends: '0' value_type: TEXT description: 'A list of errors from API requests.' preprocessing: - type: JSONPATH parameters: - $.errors - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mssql.data.get tags: - tag: component value: raw triggers: - uuid: f56b125a8eff49d2aa002609c7df8b34 expression: 'length(last(/Azure Microsoft SQL Serverless Database by HTTP/azure.db.mssql.data.errors))>0' name: 'Azure Microsoft SQL: There are errors in requests to API' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'Zabbix has received errors in response to API requests.' tags: - tag: scope value: availability - uuid: e1c668773b974deeaf64c0d51d1cb02d name: 'Azure Microsoft SQL: Get data' type: SCRIPT key: azure.db.mssql.data.get history: '0' trends: '0' value_type: TEXT params: | var AzureDB = { params: {}, token: null, setParams: function (params) { ['app_id', 'password', 'tenant_id', 'subscription_id', 'resource_id'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); AzureDB.params = params; }, request: function (url, data) { if (typeof data === 'undefined' || data === null) { data = ''; } var response, request = new HttpRequest(); if (typeof AzureDB.params.proxy !== 'undefined' && AzureDB.params.proxy !== '') { request.setProxy(AzureDB.params.proxy); } if (AzureDB.token) { request.addHeader('Accept: application/json'); request.addHeader('Authorization: Bearer ' + AzureDB.token); } Zabbix.log(4, '[ Azure ] Sending request: ' + url); if (data !== '') { request.addHeader('Content-Type: application/x-www-form-urlencoded'); response = request.post(url, data); } else { response = request.get(url); } Zabbix.log(4, '[ Azure ] Received response with status code ' + request.getStatus() + ': ' + response); if (request.getStatus() !== 200 || response === null) { throw 'Request failed with status code ' + request.getStatus() + ': ' + response; } try { return JSON.parse(response); } catch (error) { throw 'Failed to parse response received from API.'; } } }; var metrics = [ 'cpu_percent', 'physical_data_read_percent', 'log_write_percent', 'storage', 'connection_successful', 'connection_failed', 'blocked_by_firewall', 'deadlock', 'storage_percent', 'xtp_storage_percent', 'workers_percent', 'sessions_percent', 'cpu_limit', 'cpu_used', 'sqlserver_process_core_percent', 'sqlserver_process_memory_percent', 'tempdb_data_size', 'tempdb_log_size', 'tempdb_log_used_percent', 'app_cpu_billed', 'app_cpu_percent', 'app_memory_percent', 'allocated_data_storage' ], prepared_metrics = [], data = {}; data['errors'] = {}; data['metrics'] = {}; try { AzureDB.setParams(JSON.parse(value)); try { result = AzureDB.request( 'https://login.microsoftonline.com/' + encodeURIComponent(AzureDB.params.tenant_id) + '/oauth2/token', 'grant_type=client_credentials&resource=' + encodeURIComponent('https://management.azure.com/') + '&client_id=' + encodeURIComponent(AzureDB.params.app_id) + '&client_secret=' + encodeURIComponent(AzureDB.params.password) ); if ('access_token' in result) { AzureDB.token = result['access_token']; } else { throw 'Auth response does not contain access token.'; } } catch (error) { data.errors.auth = error.toString(); } if (!('auth' in data.errors)) { try { health = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.ResourceHealth/availabilityStatuses?api-version=2020-05-01'); if ('value' in health && Array.isArray(health.value) && health.value.length > 0 && 'properties' in health.value[0] && typeof health.value[0].properties === 'object') { data.health = health.value[0].properties; } } catch (error) { data.errors.health = error.toString(); } for (var i = 0; i < metrics.length; i += 20) { var chunk = metrics.slice(i, i + 20); prepared_metrics.push( chunk.map(function (element) { return encodeURIComponent(element); }).join(',') ); } start_date = new Date((new Date().getTime()) - 300000).toISOString().replace(/\.\d+/, ''); end_date = new Date().toISOString().replace(/\.\d+/, ''); for (var j in prepared_metrics) { try { metrics_data = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.Insights/metrics?metricnames=' + prepared_metrics[j] + '×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date) + '&api-version=2021-05-01'); if ('value' in metrics_data && Array.isArray(metrics_data.value) && metrics_data.value.length > 0) { for (k in metrics_data.value) { if ('name' in metrics_data.value[k] && typeof metrics_data.value[k].name === 'object' && 'value' in metrics_data.value[k].name && typeof metrics_data.value[k].name.value === 'string' && 'timeseries' in metrics_data.value[k] && Array.isArray(metrics_data.value[k].timeseries) && metrics_data.value[k].timeseries.length > 0 && 'data' in metrics_data.value[k].timeseries[0] && Array.isArray(metrics_data.value[k].timeseries[0].data) && metrics_data.value[k].timeseries[0].data.length > 0) { data.metrics[metrics_data.value[k].name.value.replace(/(\s|\/)+/g, '')] = metrics_data.value[k].timeseries[0].data[metrics_data.value[k].timeseries[0].data.length - 1]; } } } } catch (error) { data.errors[prepared_metrics[j]] = error.toString(); } } } } catch (error) { data.errors.params = error.toString(); } if (Object.keys(data.errors).length !== 0) { errors = 'Failed to receive data:'; for (var error in data.errors) { errors += '\n' + error + ' : ' + data.errors[error]; } data.errors = errors; } else { data.errors = ''; } return JSON.stringify(data); description: 'The result of API requests is expressed in the JSON.' timeout: '{$AZURE.DATA.TIMEOUT}' parameters: - name: app_id value: '{$AZURE.APP.ID}' - name: password value: '{$AZURE.PASSWORD}' - name: tenant_id value: '{$AZURE.TENANT.ID}' - name: subscription_id value: '{$AZURE.SUBSCRIPTION.ID}' - name: resource_id value: '{$AZURE.RESOURCE.ID}' - name: proxy value: '{$AZURE.PROXY}' tags: - tag: component value: raw - uuid: 40b15dd3d7a943d99f1bbe7fb34a9f48 name: 'Azure Microsoft SQL: Data IO percentage' type: DEPENDENT key: azure.db.mssql.data.read.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The physical data read percentage.' preprocessing: - type: JSONPATH parameters: - $.metrics.physical_data_read_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: operations - uuid: 25b97b67d87945b48ae5c44b1db20187 name: 'Azure Microsoft SQL: Deadlocks' type: DEPENDENT key: azure.db.mssql.deadlocks delay: '0' history: 7d value_type: FLOAT description: 'The count of deadlocks. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.deadlock.total master_item: key: azure.db.mssql.data.get tags: - tag: component value: network - uuid: de91693b0a3345b4ad2c9aafd2af5325 name: 'Azure Microsoft SQL: Connections blocked by firewall' type: DEPENDENT key: azure.db.mssql.firewall.blocked delay: '0' history: 7d value_type: FLOAT description: 'The count of connections blocked by a firewall.' preprocessing: - type: JSONPATH parameters: - $.metrics.blocked_by_firewall.total master_item: key: azure.db.mssql.data.get tags: - tag: component value: network - uuid: b41292705c284a77847856c2818d7145 name: 'Azure Microsoft SQL: Log IO percentage' type: DEPENDENT key: azure.db.mssql.log.write.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of I/O log. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.log_write_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: operations - uuid: 7b772170199f41d4ab614dee66176630 name: 'Azure Microsoft SQL: SQL Server process core percent' type: DEPENDENT key: azure.db.mssql.server.cpu.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The CPU usage as a percentage of the SQL DB process. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.sqlserver_process_core_percent.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: cpu - tag: component value: server - uuid: 5c0a5b745c094475b1e7a0d4f17a5627 name: 'Azure Microsoft SQL: SQL Server process memory percent' type: DEPENDENT key: azure.db.mssql.server.memory.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'Memory usage as a percentage of the SQL DB process. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.sqlserver_process_memory_percent.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: memory - tag: component value: server - uuid: 924d96d212764c3ab18e5c14daa58840 name: 'Azure Microsoft SQL: Sessions percentage' type: DEPENDENT key: azure.db.mssql.sessions.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of sessions. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.sessions_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: sessions - uuid: a87fd8ac96944e57ac58b39a18f6ad41 name: 'Azure Microsoft SQL: Data space allocated' type: DEPENDENT key: azure.db.mssql.storage.allocated delay: '0' history: 7d value_type: FLOAT units: B description: 'The allocated data storage. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.allocated_data_storage.average error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: 2f95fd2dd48c4664afc5cd62d02b0b0a name: 'Azure Microsoft SQL: Data space used percent' type: DEPENDENT key: azure.db.mssql.storage.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of used data space. Not applicable to the data warehouses or hyperscale databases.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_percent.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage triggers: - uuid: 4638130e599243fba3206abc85a7447f expression: 'last(/Azure Microsoft SQL Serverless Database by HTTP/azure.db.mssql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.CRIT}' name: 'Azure Microsoft SQL: Storage space is critically low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: AVERAGE description: 'Critical utilization of the storage space.' tags: - tag: scope value: capacity - uuid: 4732eab4aabf439fa0b2d80b63e821e5 expression: 'last(/Azure Microsoft SQL Serverless Database by HTTP/azure.db.mssql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.WARN}' name: 'Azure Microsoft SQL: Storage space is low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: WARNING description: 'High utilization of the storage space.' tags: - tag: scope value: capacity - uuid: 3b1fb8f993e74795b38abd56eceace0a name: 'Azure Microsoft SQL: Data space used' type: DEPENDENT key: azure.db.mssql.storage.used delay: '0' history: 7d value_type: FLOAT units: B description: 'Data space used. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: fbd572ca3d3f42eea794ce78a5a27ec1 name: 'Azure Microsoft SQL: In-Memory OLTP storage percent' type: DEPENDENT key: azure.db.mssql.storage.xtp.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'In-Memory OLTP storage percent. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.xtp_storage_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: cea8a8ea0eaa4d26a28721882c19d9cd name: 'Azure Microsoft SQL: Tempdb data file size' type: DEPENDENT key: azure.db.mssql.tempdb.data.size delay: '0' history: 7d value_type: FLOAT units: B description: 'Space used in `tempdb` data files, expressed in bytes. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.tempdb_data_size.maximum error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '1024' master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: 6c8196751a504b82920b7ffa5314a2fc name: 'Azure Microsoft SQL: Tempdb log used percent' type: DEPENDENT key: azure.db.mssql.tempdb.log.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of space used in `tempdb` transaction log files. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.tempdb_log_used_percent.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: b83992d1001c41b6ad3d13dbb227a733 name: 'Azure Microsoft SQL: Tempdb log file size' type: DEPENDENT key: azure.db.mssql.tempdb.log.size delay: '0' history: 7d value_type: FLOAT units: B description: 'Space used in `tempdb` transaction log files, expressed in bytes. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.tempdb_log_size.maximum error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '1024' master_item: key: azure.db.mssql.data.get tags: - tag: component value: storage - uuid: a4f597ab784a4e31aedc82bfb34feeb7 name: 'Azure Microsoft SQL: Workers percentage' type: DEPENDENT key: azure.db.mssql.workers.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of workers. Not applicable to the data warehouses.' preprocessing: - type: JSONPATH parameters: - $.metrics.workers_percent.average master_item: key: azure.db.mssql.data.get tags: - tag: component value: workers tags: - tag: class value: software - tag: target value: azure - tag: target value: mssql macros: - macro: '{$AZURE.APP.ID}' description: 'The App ID of Microsoft Azure.' - macro: '{$AZURE.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$AZURE.DB.CPU.UTIL.CRIT}' value: '90' description: 'The critical threshold of CPU utilization, expressed in %.' - macro: '{$AZURE.DB.MEMORY.UTIL.CRIT}' value: '90' description: 'The critical threshold of memory utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.CRIT}' value: '90' description: 'The critical threshold of storage utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.WARN}' value: '80' description: 'The warning threshold of storage utilization, expressed in %.' - macro: '{$AZURE.PASSWORD}' type: SECRET_TEXT description: 'Microsoft Azure password.' - macro: '{$AZURE.PROXY}' description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.' - macro: '{$AZURE.RESOURCE.ID}' description: 'Microsoft Azure Microsoft SQL database ID.' - macro: '{$AZURE.SUBSCRIPTION.ID}' description: 'Microsoft Azure subscription ID.' - macro: '{$AZURE.TENANT.ID}' description: 'Microsoft Azure tenant ID.' valuemaps: - uuid: c87b2eaeb88c4932ad63c73fcafa5331 name: 'Azure resource health state' mappings: - value: '0' newvalue: Available - value: '1' newvalue: Degraded - value: '2' newvalue: Unavailable - value: '3' newvalue: Unknown - uuid: ec92c7b0b1d14946b6ac61de89357199 template: 'Azure MySQL Flexible Server by HTTP' name: 'Azure MySQL Flexible Server by HTTP' description: | This template is designed to monitor Microsoft Azure MySQL flexible servers by HTTP. It works without any external scripts and uses the script item. Setup: 1. Create an Azure service principal via the Azure command-line interface (Azure CLI) for your subscription. `az ad sp create-for-rbac --name zabbix --role reader --scope /subscriptions/` See https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli for more details. 2. Link the template to a host. 3. Configure the macros: {$AZURE.APP.ID}, {$AZURE.PASSWORD}, {$AZURE.TENANT.ID}, {$AZURE.SUBSCRIPTION.ID}, and {$AZURE.RESOURCE.ID}. You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/ Generated by official Zabbix template tool "Templator" 2.0.0 vendor: name: Zabbix version: 7.0-0 groups: - name: Templates/Cloud items: - uuid: 9c87cde45e984ce282d8ba9fbe184f9b name: 'Azure MySQL: Availability status detailed' type: DEPENDENT key: azure.db.mysql.availability.details delay: '0' history: 7d trends: '0' value_type: CHAR description: 'The summary description of the availability status.' preprocessing: - type: JSONPATH parameters: - $.health.summary - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mysql.data.get tags: - tag: component value: health - uuid: 7f2d8e8d94ae4c87ba0480a2d9518f65 name: 'Azure MySQL: Availability state' type: DEPENDENT key: azure.db.mysql.availability.state delay: '0' history: 7d description: 'The availability status of the resource.' valuemap: name: 'Azure resource health state' preprocessing: - type: JSONPATH parameters: - $.health.availabilityState error_handler: CUSTOM_VALUE error_handler_params: '3' - type: STR_REPLACE parameters: - Available - '0' - type: STR_REPLACE parameters: - Degraded - '1' - type: STR_REPLACE parameters: - Unavailable - '2' - type: STR_REPLACE parameters: - Unknown - '3' - type: IN_RANGE parameters: - '0' - '3' error_handler: CUSTOM_VALUE error_handler_params: '3' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mysql.data.get tags: - tag: component value: health triggers: - uuid: e822fd2214fb41db9b57cdb8eec0444a expression: 'last(/Azure MySQL Flexible Server by HTTP/azure.db.mysql.availability.state)=1' name: 'Azure MySQL: MySQL server is degraded' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'The resource is in degraded state.' tags: - tag: scope value: availability - uuid: ebb35037a5b646a0bd2c6be44bb1f3c6 expression: 'last(/Azure MySQL Flexible Server by HTTP/azure.db.mysql.availability.state)=3' name: 'Azure MySQL: MySQL server is in unknown state' opdata: '{ITEM.LASTVALUE1}' priority: WARNING description: 'The resource state is unknown.' tags: - tag: scope value: availability - uuid: 240b861c09a94e209036782b6c7496fa expression: 'last(/Azure MySQL Flexible Server by HTTP/azure.db.mysql.availability.state)=2' name: 'Azure MySQL: MySQL server is unavailable' opdata: '{ITEM.LASTVALUE1}' priority: HIGH description: 'The resource state is unavailable.' tags: - tag: scope value: availability - uuid: cab6ac822f2c4e118b030e49cc15eaa2 name: 'Azure MySQL: Connections aborted' type: DEPENDENT key: azure.db.mysql.connections.aborted delay: '0' history: 7d value_type: FLOAT description: 'The count of aborted connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.aborted_connections.total master_item: key: azure.db.mysql.data.get tags: - tag: component value: network triggers: - uuid: 3346ea2331c14fa18658eb33e461ec7c expression: 'min(/Azure MySQL Flexible Server by HTTP/azure.db.mysql.connections.aborted,5m)>{$AZURE.DB.ABORTED.CONN.MAX.WARN}' name: 'Azure MySQL: Server has aborted connections' opdata: 'Current value: {ITEM.LASTVALUE1}' priority: AVERAGE description: 'The number of failed attempts to connect to the MySQL server is more than `{$AZURE.DB.ABORTED.CONN.MAX.WARN}`.' tags: - tag: scope value: availability - uuid: 71b33f0a5d37498dbb57d185ac0f2741 name: 'Azure MySQL: Connections active' type: DEPENDENT key: azure.db.mysql.connections.active delay: '0' history: 7d value_type: FLOAT description: 'The count of active connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.active_connections.maximum master_item: key: azure.db.mysql.data.get tags: - tag: component value: network - uuid: 1993ae276fe44db6a89451291749f703 name: 'Azure MySQL: Connections total' type: DEPENDENT key: azure.db.mysql.connections.total delay: '0' history: 7d value_type: FLOAT description: 'The count of total connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.total_connections.total master_item: key: azure.db.mysql.data.get tags: - tag: component value: network - uuid: b235666b98954555ae5e75e757bba707 name: 'Azure MySQL: CPU credits consumed' type: DEPENDENT key: azure.db.mysql.cpu.credits.consumed delay: '0' history: 7d value_type: FLOAT description: 'The consumed CPU credits.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_credits_consumed.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mysql.data.get tags: - tag: component value: cpu - uuid: 4f591346d3d34d49b37cfff2a169f57e name: 'Azure MySQL: CPU credits remaining' type: DEPENDENT key: azure.db.mysql.cpu.credits.remaining delay: '0' history: 7d value_type: FLOAT description: 'The remaining CPU credits.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_credits_remaining.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mysql.data.get tags: - tag: component value: cpu - uuid: afe4d11c2f474428acc00d153ad2a6e5 name: 'Azure MySQL: Percentage CPU' type: DEPENDENT key: azure.db.mysql.cpu.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The CPU percent of a host.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_percent.maximum master_item: key: azure.db.mysql.data.get tags: - tag: component value: cpu triggers: - uuid: 5af82cc95239479c86c7ab3dabcfb592 expression: 'min(/Azure MySQL Flexible Server by HTTP/azure.db.mysql.cpu.percentage,5m)>{$AZURE.DB.CPU.UTIL.CRIT}' name: 'Azure MySQL: High CPU utilization' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: HIGH description: 'The CPU utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: f960e7667571497c96454b5c4b7b69ff name: 'Azure MySQL: Get errors' type: DEPENDENT key: azure.db.mysql.data.errors delay: '0' history: 7d trends: '0' value_type: TEXT description: 'A list of errors from API requests.' preprocessing: - type: JSONPATH parameters: - $.errors - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mysql.data.get tags: - tag: component value: raw triggers: - uuid: 98c1b86b79e9469cac2870fb2ba42949 expression: 'length(last(/Azure MySQL Flexible Server by HTTP/azure.db.mysql.data.errors))>0' name: 'Azure MySQL: There are errors in requests to API' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'Zabbix has received errors in response to API requests.' tags: - tag: scope value: availability - uuid: de712334db1440309fa68f9252d4f9bc name: 'Azure MySQL: Get data' type: SCRIPT key: azure.db.mysql.data.get history: '0' trends: '0' value_type: TEXT params: | var AzureDB = { params: {}, token: null, setParams: function (params) { ['app_id', 'password', 'tenant_id', 'subscription_id', 'resource_id'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); AzureDB.params = params; }, request: function (url, data) { if (typeof data === 'undefined' || data === null) { data = ''; } var response, request = new HttpRequest(); if (typeof AzureDB.params.proxy !== 'undefined' && AzureDB.params.proxy !== '') { request.setProxy(AzureDB.params.proxy); } if (AzureDB.token) { request.addHeader('Accept: application/json'); request.addHeader('Authorization: Bearer ' + AzureDB.token); } Zabbix.log(4, '[ Azure ] Sending request: ' + url); if (data !== '') { request.addHeader('Content-Type: application/x-www-form-urlencoded'); response = request.post(url, data); } else { response = request.get(url); } Zabbix.log(4, '[ Azure ] Received response with status code ' + request.getStatus() + ': ' + response); if (request.getStatus() !== 200 || response === null) { throw 'Request failed with status code ' + request.getStatus() + ': ' + response; } try { return JSON.parse(response); } catch (error) { throw 'Failed to parse response received from API.'; } } }; var metrics = [ 'cpu_percent', 'memory_percent', 'network_bytes_egress', 'network_bytes_ingress', 'active_connections', 'total_connections', 'aborted_connections', 'Queries', 'io_consumption_percent', 'storage_percent', 'storage_used', 'storage_limit', 'backup_storage_used', 'replication_lag', 'cpu_credits_remaining', 'cpu_credits_consumed' ], prepared_metrics = [], data = {}; data['errors'] = {}; data['metrics'] = {}; try { AzureDB.setParams(JSON.parse(value)); try { result = AzureDB.request( 'https://login.microsoftonline.com/' + encodeURIComponent(AzureDB.params.tenant_id) + '/oauth2/token', 'grant_type=client_credentials&resource=' + encodeURIComponent('https://management.azure.com/') + '&client_id=' + encodeURIComponent(AzureDB.params.app_id) + '&client_secret=' + encodeURIComponent(AzureDB.params.password) ); if ('access_token' in result) { AzureDB.token = result['access_token']; } else { throw 'Auth response does not contain access token.'; } } catch (error) { data.errors.auth = error.toString(); } if (!('auth' in data.errors)) { try { health = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.ResourceHealth/availabilityStatuses?api-version=2020-05-01'); if ('value' in health && Array.isArray(health.value) && health.value.length > 0 && 'properties' in health.value[0] && typeof health.value[0].properties === 'object') { data.health = health.value[0].properties; } } catch (error) { data.errors.health = error.toString(); } for (var i = 0; i < metrics.length; i += 20) { var chunk = metrics.slice(i, i + 20); prepared_metrics.push( chunk.map(function (element) { return encodeURIComponent(element); }).join(',') ); } start_date = new Date((new Date().getTime()) - 300000).toISOString().replace(/\.\d+/, ''); end_date = new Date().toISOString().replace(/\.\d+/, ''); for (var j in prepared_metrics) { try { metrics_data = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.Insights/metrics?metricnames=' + prepared_metrics[j] + '×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date) + '&api-version=2021-05-01'); if ('value' in metrics_data && Array.isArray(metrics_data.value) && metrics_data.value.length > 0) { for (k in metrics_data.value) { if ('name' in metrics_data.value[k] && typeof metrics_data.value[k].name === 'object' && 'value' in metrics_data.value[k].name && typeof metrics_data.value[k].name.value === 'string' && 'timeseries' in metrics_data.value[k] && Array.isArray(metrics_data.value[k].timeseries) && metrics_data.value[k].timeseries.length > 0 && 'data' in metrics_data.value[k].timeseries[0] && Array.isArray(metrics_data.value[k].timeseries[0].data) && metrics_data.value[k].timeseries[0].data.length > 0) { data.metrics[metrics_data.value[k].name.value.replace(/(\s|\/)+/g, '')] = metrics_data.value[k].timeseries[0].data[metrics_data.value[k].timeseries[0].data.length - 1]; } } } } catch (error) { data.errors[prepared_metrics[j]] = error.toString(); } } } } catch (error) { data.errors.params = error.toString(); } if (Object.keys(data.errors).length !== 0) { errors = 'Failed to receive data:'; for (var error in data.errors) { errors += '\n' + error + ' : ' + data.errors[error]; } data.errors = errors; } else { data.errors = ''; } return JSON.stringify(data); description: 'The result of API requests is expressed in the JSON.' timeout: '{$AZURE.DATA.TIMEOUT}' parameters: - name: app_id value: '{$AZURE.APP.ID}' - name: password value: '{$AZURE.PASSWORD}' - name: tenant_id value: '{$AZURE.TENANT.ID}' - name: subscription_id value: '{$AZURE.SUBSCRIPTION.ID}' - name: resource_id value: '{$AZURE.RESOURCE.ID}' - name: proxy value: '{$AZURE.PROXY}' tags: - tag: component value: raw - uuid: b4a6363aac734b6c8d043718ca667c09 name: 'Azure MySQL: IO consumption percent' type: DEPENDENT key: azure.db.mysql.io.consumption.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The consumption percent of I/O.' preprocessing: - type: JSONPATH parameters: - $.metrics.io_consumption_percent.maximum master_item: key: azure.db.mysql.data.get tags: - tag: component value: operations - uuid: f0f56a67942a40509d6835f3da9eb7e2 name: 'Azure MySQL: Memory utilization' type: DEPENDENT key: azure.db.mysql.memory.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The memory percent of a host.' preprocessing: - type: JSONPATH parameters: - $.metrics.memory_percent.maximum master_item: key: azure.db.mysql.data.get tags: - tag: component value: memory - uuid: 84f3d2b152784993944a2d4c3fad1a59 name: 'Azure MySQL: Network out' type: DEPENDENT key: azure.db.mysql.network.egress delay: '0' history: 7d value_type: FLOAT units: bps description: 'Network egress of a host, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.network_bytes_egress.total - type: MULTIPLIER parameters: - '0.0088' master_item: key: azure.db.mysql.data.get tags: - tag: component value: network - uuid: 5f38b6b4e3a849d09022bd34c4347088 name: 'Azure MySQL: Network in' type: DEPENDENT key: azure.db.mysql.network.ingress delay: '0' history: 7d value_type: FLOAT units: bps description: 'Network ingress of a host, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.network_bytes_ingress.total - type: MULTIPLIER parameters: - '0.0088' master_item: key: azure.db.mysql.data.get tags: - tag: component value: network - uuid: 05329dcdb2e14080a43d1bf7553037f6 name: 'Azure MySQL: Queries' type: DEPENDENT key: azure.db.mysql.queries delay: '0' history: 7d value_type: FLOAT description: 'The count of queries.' preprocessing: - type: JSONPATH parameters: - $.metrics.Queries.total master_item: key: azure.db.mysql.data.get tags: - tag: component value: queries - uuid: 80a05247fec04e39a99ccafaefbd0441 name: 'Azure MySQL: Replication lag' type: DEPENDENT key: azure.db.mysql.replication.lag delay: '0' history: 7d value_type: FLOAT units: s description: 'The replication lag, expressed in seconds.' preprocessing: - type: JSONPATH parameters: - $.metrics.replication_lag.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mysql.data.get tags: - tag: component value: replication - uuid: 8d5cd0d3cd0744a5a260a8a0485f6735 name: 'Azure MySQL: Backup storage used' type: DEPENDENT key: azure.db.mysql.storage.backup.used delay: '0' history: 7d value_type: FLOAT units: B description: 'Used backup storage, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.backup_storage_used.maximum master_item: key: azure.db.mysql.data.get tags: - tag: component value: storage - uuid: 78f3e03b5caf4f85a3c61513cf242f76 name: 'Azure MySQL: Storage limit' type: DEPENDENT key: azure.db.mysql.storage.limit delay: '0' history: 7d value_type: FLOAT units: B description: 'The storage limit, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_limit.maximum master_item: key: azure.db.mysql.data.get tags: - tag: component value: storage - uuid: ced51184b59643adaa51bef90710166b name: 'Azure MySQL: Storage percent' type: DEPENDENT key: azure.db.mysql.storage.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The storage utilization, expressed in %.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_percent.maximum master_item: key: azure.db.mysql.data.get tags: - tag: component value: storage triggers: - uuid: 1703edc1553644e5aa25d35928c5eafd expression: 'last(/Azure MySQL Flexible Server by HTTP/azure.db.mysql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.CRIT}' name: 'Azure MySQL: Storage space is critically low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: AVERAGE description: 'Critical utilization of the storage space.' tags: - tag: scope value: capacity - uuid: a2ec23a5e77c40aa9e45d214f4e06ca1 expression: 'last(/Azure MySQL Flexible Server by HTTP/azure.db.mysql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.WARN}' name: 'Azure MySQL: Storage space is low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: WARNING description: 'High utilization of the storage space.' tags: - tag: scope value: capacity - uuid: 9f96e947eee646f890742676e9f9a22a name: 'Azure MySQL: Storage used' type: DEPENDENT key: azure.db.mysql.storage.used delay: '0' history: 7d value_type: FLOAT units: B description: 'Used storage space, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_used.maximum master_item: key: azure.db.mysql.data.get tags: - tag: component value: storage tags: - tag: class value: software - tag: target value: azure - tag: target value: mysql macros: - macro: '{$AZURE.APP.ID}' description: 'The App ID of Microsoft Azure.' - macro: '{$AZURE.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$AZURE.DB.ABORTED.CONN.MAX.WARN}' value: '25' description: 'The number of failed attempts to connect to the MySQL server for a trigger expression.' - macro: '{$AZURE.DB.CPU.UTIL.CRIT}' value: '90' description: 'The critical threshold of CPU utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.CRIT}' value: '90' description: 'The critical threshold of the storage utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.WARN}' value: '80' description: 'The warning threshold of the storage utilization, expressed in %.' - macro: '{$AZURE.PASSWORD}' type: SECRET_TEXT description: 'Microsoft Azure password.' - macro: '{$AZURE.PROXY}' description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.' - macro: '{$AZURE.RESOURCE.ID}' description: 'Microsoft Azure MySQL server ID.' - macro: '{$AZURE.SUBSCRIPTION.ID}' description: 'Microsoft Azure subscription ID.' - macro: '{$AZURE.TENANT.ID}' description: 'Microsoft Azure tenant ID.' valuemaps: - uuid: 4eec167b4d69441398b96b8e375d6825 name: 'Azure resource health state' mappings: - value: '0' newvalue: Available - value: '1' newvalue: Degraded - value: '2' newvalue: Unavailable - value: '3' newvalue: Unknown - uuid: c1396bf1e8cf46f6a407e88ddceef0b8 template: 'Azure MySQL Single Server by HTTP' name: 'Azure MySQL Single Server by HTTP' description: | This template is designed to monitor Microsoft Azure MySQL single servers by HTTP. It works without any external scripts and uses the script item. Setup: 1. Create an Azure service principal via the Azure command-line interface (Azure CLI) for your subscription. `az ad sp create-for-rbac --name zabbix --role reader --scope /subscriptions/` See https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli for more details. 2. Link the template to a host. 3. Configure the macros: {$AZURE.APP.ID}, {$AZURE.PASSWORD}, {$AZURE.TENANT.ID}, {$AZURE.SUBSCRIPTION.ID}, and {$AZURE.RESOURCE.ID}. You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/ Generated by official Zabbix template tool "Templator" 2.0.0 vendor: name: Zabbix version: 7.0-0 groups: - name: Templates/Cloud items: - uuid: c7771aa67d3c424490d8de2d6c2d609a name: 'Azure MySQL: Availability status detailed' type: DEPENDENT key: azure.db.mysql.availability.details delay: '0' history: 7d trends: '0' value_type: CHAR description: 'The summary description of the availability status.' preprocessing: - type: JSONPATH parameters: - $.health.summary - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mysql.data.get tags: - tag: component value: health - uuid: c325b977b26e4e00acc3ea8703895f05 name: 'Azure MySQL: Availability state' type: DEPENDENT key: azure.db.mysql.availability.state delay: '0' history: 7d description: 'The availability status of the resource.' valuemap: name: 'Azure resource health state' preprocessing: - type: JSONPATH parameters: - $.health.availabilityState error_handler: CUSTOM_VALUE error_handler_params: '3' - type: STR_REPLACE parameters: - Available - '0' - type: STR_REPLACE parameters: - Degraded - '1' - type: STR_REPLACE parameters: - Unavailable - '2' - type: STR_REPLACE parameters: - Unknown - '3' - type: IN_RANGE parameters: - '0' - '3' error_handler: CUSTOM_VALUE error_handler_params: '3' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mysql.data.get tags: - tag: component value: health triggers: - uuid: 91a32645266547d78df3a70b44c7782b expression: 'last(/Azure MySQL Single Server by HTTP/azure.db.mysql.availability.state)=1' name: 'Azure MySQL: MySQL server is degraded' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'The resource is in degraded state.' tags: - tag: scope value: availability - uuid: 852aba88476a40aeb2170b933726b7d8 expression: 'last(/Azure MySQL Single Server by HTTP/azure.db.mysql.availability.state)=3' name: 'Azure MySQL: MySQL server is in unknown state' opdata: '{ITEM.LASTVALUE1}' priority: WARNING description: 'The resource state is unknown.' tags: - tag: scope value: availability - uuid: 5f2d2254dfc24f5481207585bed0d933 expression: 'last(/Azure MySQL Single Server by HTTP/azure.db.mysql.availability.state)=2' name: 'Azure MySQL: MySQL server is unavailable' opdata: '{ITEM.LASTVALUE1}' priority: HIGH description: 'The resource state is unavailable.' tags: - tag: scope value: availability - uuid: 69aba8caa6874c9d9423926a2ee78e99 name: 'Azure MySQL: Connections active' type: DEPENDENT key: azure.db.mysql.connections.active delay: '0' history: 7d value_type: FLOAT description: 'The count of active connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.active_connections.average master_item: key: azure.db.mysql.data.get tags: - tag: component value: network - uuid: e185b56984914507bc40c07c55153967 name: 'Azure MySQL: Connections failed' type: DEPENDENT key: azure.db.mysql.connections.failed delay: '0' history: 7d value_type: FLOAT description: 'The count of failed connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.connections_failed.total error_handler: DISCARD_VALUE master_item: key: azure.db.mysql.data.get tags: - tag: component value: network triggers: - uuid: 5b3a09ca04704e6a9972ee4865d358cd expression: 'min(/Azure MySQL Single Server by HTTP/azure.db.mysql.connections.failed,5m)>{$AZURE.DB.FAILED.CONN.MAX.WARN}' name: 'Azure MySQL: Server has failed connections' opdata: 'Current value: {ITEM.LASTVALUE1}' priority: AVERAGE description: 'The number of failed attempts to connect to the MySQL server is more than `{$AZURE.DB.FAILED.CONN.MAX.WARN}`.' tags: - tag: scope value: availability - uuid: d0b5864a56094166b76fbc58a5e05c7c name: 'Azure MySQL: Percentage CPU' type: DEPENDENT key: azure.db.mysql.cpu.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The CPU percent of a host.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_percent.average master_item: key: azure.db.mysql.data.get tags: - tag: component value: cpu triggers: - uuid: 7115fb320e2b4cc1ad1739c8a6cee155 expression: 'min(/Azure MySQL Single Server by HTTP/azure.db.mysql.cpu.percentage,5m)>{$AZURE.DB.CPU.UTIL.CRIT}' name: 'Azure MySQL: High CPU utilization' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: HIGH description: 'The CPU utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: 2fc253a20100478d91cac13590a64bfc name: 'Azure MySQL: Get errors' type: DEPENDENT key: azure.db.mysql.data.errors delay: '0' history: 7d trends: '0' value_type: TEXT description: 'A list of errors from API requests.' preprocessing: - type: JSONPATH parameters: - $.errors - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.mysql.data.get tags: - tag: component value: raw triggers: - uuid: df5fa33f8c13413bb9d61ea4470b9b2d expression: 'length(last(/Azure MySQL Single Server by HTTP/azure.db.mysql.data.errors))>0' name: 'Azure MySQL: There are errors in requests to API' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'Zabbix has received errors in response to API requests.' tags: - tag: scope value: availability - uuid: cd62d92ef0384ea9acf0cae71c88ebc6 name: 'Azure MySQL: Get data' type: SCRIPT key: azure.db.mysql.data.get history: '0' trends: '0' value_type: TEXT params: | var AzureDB = { params: {}, token: null, setParams: function (params) { ['app_id', 'password', 'tenant_id', 'subscription_id', 'resource_id'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); AzureDB.params = params; }, request: function (url, data) { if (typeof data === 'undefined' || data === null) { data = ''; } var response, request = new HttpRequest(); if (typeof AzureDB.params.proxy !== 'undefined' && AzureDB.params.proxy !== '') { request.setProxy(AzureDB.params.proxy); } if (AzureDB.token) { request.addHeader('Accept: application/json'); request.addHeader('Authorization: Bearer ' + AzureDB.token); } Zabbix.log(4, '[ Azure ] Sending request: ' + url); if (data !== '') { request.addHeader('Content-Type: application/x-www-form-urlencoded'); response = request.post(url, data); } else { response = request.get(url); } Zabbix.log(4, '[ Azure ] Received response with status code ' + request.getStatus() + ': ' + response); if (request.getStatus() !== 200 || response === null) { throw 'Request failed with status code ' + request.getStatus() + ': ' + response; } try { return JSON.parse(response); } catch (error) { throw 'Failed to parse response received from API.'; } } }; var metrics = [ 'cpu_percent', 'memory_percent', 'io_consumption_percent', 'storage_percent', 'storage_used', 'storage_limit', 'serverlog_storage_percent', 'serverlog_storage_usage', 'serverlog_storage_limit', 'active_connections', 'connections_failed', 'seconds_behind_master', 'backup_storage_used', 'network_bytes_egress', 'network_bytes_ingress' ], prepared_metrics = [], data = {}; data['errors'] = {}; data['metrics'] = {}; try { AzureDB.setParams(JSON.parse(value)); try { result = AzureDB.request( 'https://login.microsoftonline.com/' + encodeURIComponent(AzureDB.params.tenant_id) + '/oauth2/token', 'grant_type=client_credentials&resource=' + encodeURIComponent('https://management.azure.com/') + '&client_id=' + encodeURIComponent(AzureDB.params.app_id) + '&client_secret=' + encodeURIComponent(AzureDB.params.password) ); if ('access_token' in result) { AzureDB.token = result['access_token']; } else { throw 'Auth response does not contain access token.'; } } catch (error) { data.errors.auth = error.toString(); } if (!('auth' in data.errors)) { try { health = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.ResourceHealth/availabilityStatuses?api-version=2020-05-01'); if ('value' in health && Array.isArray(health.value) && health.value.length > 0 && 'properties' in health.value[0] && typeof health.value[0].properties === 'object') { data.health = health.value[0].properties; } } catch (error) { data.errors.health = error.toString(); } for (var i = 0; i < metrics.length; i += 20) { var chunk = metrics.slice(i, i + 20); prepared_metrics.push( chunk.map(function (element) { return encodeURIComponent(element); }).join(',') ); } start_date = new Date((new Date().getTime()) - 300000).toISOString().replace(/\.\d+/, ''); end_date = new Date().toISOString().replace(/\.\d+/, ''); for (var j in prepared_metrics) { try { metrics_data = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.Insights/metrics?metricnames=' + prepared_metrics[j] + '×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date) + '&api-version=2021-05-01'); if ('value' in metrics_data && Array.isArray(metrics_data.value) && metrics_data.value.length > 0) { for (k in metrics_data.value) { if ('name' in metrics_data.value[k] && typeof metrics_data.value[k].name === 'object' && 'value' in metrics_data.value[k].name && typeof metrics_data.value[k].name.value === 'string' && 'timeseries' in metrics_data.value[k] && Array.isArray(metrics_data.value[k].timeseries) && metrics_data.value[k].timeseries.length > 0 && 'data' in metrics_data.value[k].timeseries[0] && Array.isArray(metrics_data.value[k].timeseries[0].data) && metrics_data.value[k].timeseries[0].data.length > 0) { data.metrics[metrics_data.value[k].name.value.replace(/(\s|\/)+/g, '')] = metrics_data.value[k].timeseries[0].data[metrics_data.value[k].timeseries[0].data.length - 1]; } } } } catch (error) { data.errors[prepared_metrics[j]] = error.toString(); } } } } catch (error) { data.errors.params = error.toString(); } if (Object.keys(data.errors).length !== 0) { errors = 'Failed to receive data:'; for (var error in data.errors) { errors += '\n' + error + ' : ' + data.errors[error]; } data.errors = errors; } else { data.errors = ''; } return JSON.stringify(data); description: 'The result of API requests is expressed in the JSON.' timeout: '{$AZURE.DATA.TIMEOUT}' parameters: - name: app_id value: '{$AZURE.APP.ID}' - name: password value: '{$AZURE.PASSWORD}' - name: tenant_id value: '{$AZURE.TENANT.ID}' - name: subscription_id value: '{$AZURE.SUBSCRIPTION.ID}' - name: resource_id value: '{$AZURE.RESOURCE.ID}' - name: proxy value: '{$AZURE.PROXY}' tags: - tag: component value: raw - uuid: a17c365253eb4821841ec82ac8f61106 name: 'Azure MySQL: IO consumption percent' type: DEPENDENT key: azure.db.mysql.io.consumption.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The consumption percent of I/O.' preprocessing: - type: JSONPATH parameters: - $.metrics.io_consumption_percent.average master_item: key: azure.db.mysql.data.get tags: - tag: component value: operations - uuid: 5c19c08912634993b1f96fb11e5d1ae2 name: 'Azure MySQL: Memory utilization' type: DEPENDENT key: azure.db.mysql.memory.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The memory percent of a host.' preprocessing: - type: JSONPATH parameters: - $.metrics.memory_percent.average master_item: key: azure.db.mysql.data.get tags: - tag: component value: memory triggers: - uuid: a67b35f1ac674d6692b0b2bcd6f89bd8 expression: 'min(/Azure MySQL Single Server by HTTP/azure.db.mysql.memory.percentage,5m)>{$AZURE.DB.MEMORY.UTIL.CRIT}' name: 'Azure MySQL: High memory utilization' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: AVERAGE description: 'The system is running out of free memory.' tags: - tag: scope value: performance - uuid: fe1b9846a634412aaa6a76fc05dbe46a name: 'Azure MySQL: Network out' type: DEPENDENT key: azure.db.mysql.network.egress delay: '0' history: 7d value_type: FLOAT units: bps description: 'The network outbound traffic across the active connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.network_bytes_egress.total error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.0088' master_item: key: azure.db.mysql.data.get tags: - tag: component value: network - uuid: 1cc97817bda5470887e3d5d9f2d78650 name: 'Azure MySQL: Network in' type: DEPENDENT key: azure.db.mysql.network.ingress delay: '0' history: 7d value_type: FLOAT units: bps description: 'The network inbound traffic across the active connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.network_bytes_ingress.total error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.0088' master_item: key: azure.db.mysql.data.get tags: - tag: component value: network - uuid: 8e60794282ea42c7bad1573811b2e498 name: 'Azure MySQL: Replication lag' type: DEPENDENT key: azure.db.mysql.replication.lag delay: '0' history: 7d value_type: FLOAT units: s description: 'The replication lag, expressed in seconds.' preprocessing: - type: JSONPATH parameters: - $.metrics.seconds_behind_master.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.mysql.data.get tags: - tag: component value: replication - uuid: 1303a659d17a4e4fa9fa03cef35fef5a name: 'Azure MySQL: Backup storage used' type: DEPENDENT key: azure.db.mysql.storage.backup.used delay: '0' history: 7d value_type: FLOAT units: B description: 'Used backup storage, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.backup_storage_used.average master_item: key: azure.db.mysql.data.get tags: - tag: component value: storage - uuid: 4aed6d0c01d1458fbd1f7c7ea5386303 name: 'Azure MySQL: Storage limit' type: DEPENDENT key: azure.db.mysql.storage.limit delay: '0' history: 7d value_type: FLOAT units: B description: 'The storage limit, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_limit.maximum master_item: key: azure.db.mysql.data.get tags: - tag: component value: storage - uuid: 5b1b350be6f0409fb7ab842571c3f086 name: 'Azure MySQL: Storage percent' type: DEPENDENT key: azure.db.mysql.storage.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The storage utilization, expressed in %.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_percent.average master_item: key: azure.db.mysql.data.get tags: - tag: component value: storage triggers: - uuid: 3afcb840e8004822a2dada2a89971f69 expression: 'last(/Azure MySQL Single Server by HTTP/azure.db.mysql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.CRIT}' name: 'Azure MySQL: Storage space is critically low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: AVERAGE description: 'Critical utilization of the storage space.' tags: - tag: scope value: capacity - uuid: 2e605f906b284f769e7c880d4e642b43 expression: 'last(/Azure MySQL Single Server by HTTP/azure.db.mysql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.WARN}' name: 'Azure MySQL: Storage space is low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: WARNING description: 'High utilization of the storage space.' tags: - tag: scope value: capacity - uuid: 7f553d8a0898477b87a2828e51efcfcc name: 'Azure MySQL: Server log storage limit' type: DEPENDENT key: azure.db.mysql.storage.server.log.limit delay: '0' history: 7d value_type: FLOAT units: B description: 'The storage limit of a server log, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.serverlog_storage_limit.maximum master_item: key: azure.db.mysql.data.get tags: - tag: component value: storage - uuid: cf5a77306c554a24b3741ef065b6d27a name: 'Azure MySQL: Server log storage percent' type: DEPENDENT key: azure.db.mysql.storage.server.log.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The storage utilization by a server log, expressed in %.' preprocessing: - type: JSONPATH parameters: - $.metrics.serverlog_storage_percent.average master_item: key: azure.db.mysql.data.get tags: - tag: component value: storage - uuid: 8ed99a951e264185b1e0f343d7ea0aec name: 'Azure MySQL: Server log storage used' type: DEPENDENT key: azure.db.mysql.storage.server.log.used delay: '0' history: 7d value_type: FLOAT units: B description: 'The storage space used by a server log, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.serverlog_storage_usage.average master_item: key: azure.db.mysql.data.get tags: - tag: component value: storage - uuid: 0c9a5496d9884c8e9a434fb232b3208f name: 'Azure MySQL: Storage used' type: DEPENDENT key: azure.db.mysql.storage.used delay: '0' history: 7d value_type: FLOAT units: B description: 'Used storage space, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_used.average master_item: key: azure.db.mysql.data.get tags: - tag: component value: storage tags: - tag: class value: software - tag: target value: azure - tag: target value: mysql macros: - macro: '{$AZURE.APP.ID}' description: 'The App ID of Microsoft Azure.' - macro: '{$AZURE.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$AZURE.DB.CPU.UTIL.CRIT}' value: '90' description: 'The critical threshold of CPU utilization, expressed in %.' - macro: '{$AZURE.DB.FAILED.CONN.MAX.WARN}' value: '25' description: 'The number of failed attempts to connect to the MySQL server for trigger expression.' - macro: '{$AZURE.DB.MEMORY.UTIL.CRIT}' value: '90' description: 'The critical threshold of memory utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.CRIT}' value: '90' description: 'The critical threshold of storage utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.WARN}' value: '80' description: 'The warning threshold of storage utilization, expressed in %.' - macro: '{$AZURE.PASSWORD}' type: SECRET_TEXT description: 'Microsoft Azure password.' - macro: '{$AZURE.PROXY}' description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.' - macro: '{$AZURE.RESOURCE.ID}' description: 'Microsoft Azure MySQL server ID.' - macro: '{$AZURE.SUBSCRIPTION.ID}' description: 'Microsoft Azure subscription ID.' - macro: '{$AZURE.TENANT.ID}' description: 'Microsoft Azure tenant ID.' valuemaps: - uuid: 323a5259fb854724891515767f341540 name: 'Azure resource health state' mappings: - value: '0' newvalue: Available - value: '1' newvalue: Degraded - value: '2' newvalue: Unavailable - value: '3' newvalue: Unknown - uuid: 35ef29f24158444097272d2ea7fa6044 template: 'Azure PostgreSQL Flexible Server by HTTP' name: 'Azure PostgreSQL Flexible Server by HTTP' description: | This template is designed to monitor Microsoft Azure PostgreSQL flexible servers by HTTP. It works without any external scripts and uses the script item. Setup: 1. Create an Azure service principal via the Azure command-line interface (Azure CLI) for your subscription. `az ad sp create-for-rbac --name zabbix --role reader --scope /subscriptions/` See https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli for more details. 2. Link the template to a host. 3. Configure the macros: {$AZURE.APP.ID}, {$AZURE.PASSWORD}, {$AZURE.TENANT.ID}, {$AZURE.SUBSCRIPTION.ID}, and {$AZURE.RESOURCE.ID}. You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/ Generated by official Zabbix template tool "Templator" 2.0.0 vendor: name: Zabbix version: 7.0-0 groups: - name: Templates/Cloud items: - uuid: 7f7deae517e54cf582ae758a6988037b name: 'Azure PostgreSQL: Availability status detailed' type: DEPENDENT key: azure.db.pgsql.availability.details delay: '0' history: 7d trends: '0' value_type: CHAR description: 'The summary description of the availability status.' preprocessing: - type: JSONPATH parameters: - $.health.summary - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.pgsql.data.get tags: - tag: component value: health - uuid: cd9072a3895c42dab794707f3bcaf743 name: 'Azure PostgreSQL: Availability state' type: DEPENDENT key: azure.db.pgsql.availability.state delay: '0' history: 7d description: 'The availability status of the resource.' valuemap: name: 'Azure resource health state' preprocessing: - type: JSONPATH parameters: - $.health.availabilityState error_handler: CUSTOM_VALUE error_handler_params: '3' - type: STR_REPLACE parameters: - Available - '0' - type: STR_REPLACE parameters: - Degraded - '1' - type: STR_REPLACE parameters: - Unavailable - '2' - type: STR_REPLACE parameters: - Unknown - '3' - type: IN_RANGE parameters: - '0' - '3' error_handler: CUSTOM_VALUE error_handler_params: '3' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.pgsql.data.get tags: - tag: component value: health triggers: - uuid: 65b5c39b48e248c4866c511bbba91e1b expression: 'last(/Azure PostgreSQL Flexible Server by HTTP/azure.db.pgsql.availability.state)=1' name: 'Azure PostgreSQL: PostgreSQL server is degraded' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'The resource is in degraded state.' tags: - tag: scope value: availability - uuid: d8ce86c853064cba80c9883052ed1403 expression: 'last(/Azure PostgreSQL Flexible Server by HTTP/azure.db.pgsql.availability.state)=3' name: 'Azure PostgreSQL: PostgreSQL server is in unknown state' opdata: '{ITEM.LASTVALUE1}' priority: WARNING description: 'The resource state is unknown.' tags: - tag: scope value: availability - uuid: 9572c9e56a6b44368bcf2d8a17a220d8 expression: 'last(/Azure PostgreSQL Flexible Server by HTTP/azure.db.pgsql.availability.state)=2' name: 'Azure PostgreSQL: PostgreSQL server is unavailable' opdata: '{ITEM.LASTVALUE1}' priority: HIGH description: 'The resource state is unavailable.' tags: - tag: scope value: availability - uuid: 05ada75c666e45269c3c36159f9902cc name: 'Azure PostgreSQL: Connections active' type: DEPENDENT key: azure.db.pgsql.connections.active delay: '0' history: 7d value_type: FLOAT description: 'The count of active connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.active_connections.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: network - uuid: 00d1116141874dbfb204ebfe96c203f1 name: 'Azure PostgreSQL: Connections failed' type: DEPENDENT key: azure.db.pgsql.connections.failed delay: '0' history: 7d value_type: FLOAT description: 'The count of failed connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.connections_failed.total error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: network - uuid: f422f01bf1c9484e880581f31f70e120 name: 'Azure PostgreSQL: Connections succeeded' type: DEPENDENT key: azure.db.pgsql.connections.succeeded delay: '0' history: 7d value_type: FLOAT description: 'The count of succeeded connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.connections_succeeded.total master_item: key: azure.db.pgsql.data.get tags: - tag: component value: network - uuid: 1f1270c6981b4d08864572410fdeccde name: 'Azure PostgreSQL: CPU credits consumed' type: DEPENDENT key: azure.db.pgsql.cpu.credits.consumed delay: '0' history: 7d value_type: FLOAT description: 'The total number of credits consumed by the database server.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_credits_consumed.average error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: cpu - uuid: e55082c4a278435286335cebd2ae1cac name: 'Azure PostgreSQL: CPU credits remaining' type: DEPENDENT key: azure.db.pgsql.cpu.credits.remaining delay: '0' history: 7d value_type: FLOAT description: 'The total number of credits available to burst.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_credits_remaining.average error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: cpu - uuid: 8d85c5c73c894cdda6324832a703fea2 name: 'Azure PostgreSQL: Percentage CPU' type: DEPENDENT key: azure.db.pgsql.cpu.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The CPU percent of a host.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_percent.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: cpu triggers: - uuid: f8672e4488b740a9a17395689c3d853c expression: 'min(/Azure PostgreSQL Flexible Server by HTTP/azure.db.pgsql.cpu.percentage,5m)>{$AZURE.DB.CPU.UTIL.CRIT}' name: 'Azure PostgreSQL: High CPU utilization' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: HIGH description: 'The CPU utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: 06c4226667ec4c4489e6d3ad31c3135f name: 'Azure PostgreSQL: Get errors' type: DEPENDENT key: azure.db.pgsql.data.errors delay: '0' history: 7d trends: '0' value_type: TEXT description: 'A list of errors from API requests.' preprocessing: - type: JSONPATH parameters: - $.errors - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.pgsql.data.get tags: - tag: component value: raw triggers: - uuid: 55962f0d8a4c44c9a6b09da705e94c59 expression: 'length(last(/Azure PostgreSQL Flexible Server by HTTP/azure.db.pgsql.data.errors))>0' name: 'Azure PostgreSQL: There are errors in requests to API' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'Zabbix has received errors in response to API requests.' tags: - tag: scope value: availability - uuid: 1792c0566e8a438dad5e299d8f5b9094 name: 'Azure PostgreSQL: Get data' type: SCRIPT key: azure.db.pgsql.data.get history: '0' trends: '0' value_type: TEXT params: | var AzureDB = { params: {}, token: null, setParams: function (params) { ['app_id', 'password', 'tenant_id', 'subscription_id', 'resource_id'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); AzureDB.params = params; }, request: function (url, data) { if (typeof data === 'undefined' || data === null) { data = ''; } var response, request = new HttpRequest(); if (typeof AzureDB.params.proxy !== 'undefined' && AzureDB.params.proxy !== '') { request.setProxy(AzureDB.params.proxy); } if (AzureDB.token) { request.addHeader('Accept: application/json'); request.addHeader('Authorization: Bearer ' + AzureDB.token); } Zabbix.log(4, '[ Azure ] Sending request: ' + url); if (data !== '') { request.addHeader('Content-Type: application/x-www-form-urlencoded'); response = request.post(url, data); } else { response = request.get(url); } Zabbix.log(4, '[ Azure ] Received response with status code ' + request.getStatus() + ': ' + response); if (request.getStatus() !== 200 || response === null) { throw 'Request failed with status code ' + request.getStatus() + ': ' + response; } try { return JSON.parse(response); } catch (error) { throw 'Failed to parse response received from API.'; } } }; var metrics = [ 'cpu_percent', 'memory_percent', 'iops', 'disk_queue_depth', 'read_throughput', 'write_throughput', 'read_iops', 'write_iops', 'network_bytes_egress', 'network_bytes_ingress', 'active_connections', 'connections_failed', 'connections_succeeded', 'storage_percent', 'storage_used', 'storage_free', 'txlogs_storage_used', 'backup_storage_used', 'maximum_used_transactionIDs', 'cpu_credits_remaining', 'cpu_credits_consumed' ], prepared_metrics = [], data = {}; data['errors'] = {}; data['metrics'] = {}; try { AzureDB.setParams(JSON.parse(value)); try { result = AzureDB.request( 'https://login.microsoftonline.com/' + encodeURIComponent(AzureDB.params.tenant_id) + '/oauth2/token', 'grant_type=client_credentials&resource=' + encodeURIComponent('https://management.azure.com/') + '&client_id=' + encodeURIComponent(AzureDB.params.app_id) + '&client_secret=' + encodeURIComponent(AzureDB.params.password) ); if ('access_token' in result) { AzureDB.token = result['access_token']; } else { throw 'Auth response does not contain access token.'; } } catch (error) { data.errors.auth = error.toString(); } if (!('auth' in data.errors)) { try { health = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.ResourceHealth/availabilityStatuses?api-version=2020-05-01'); if ('value' in health && Array.isArray(health.value) && health.value.length > 0 && 'properties' in health.value[0] && typeof health.value[0].properties === 'object') { data.health = health.value[0].properties; } } catch (error) { data.errors.health = error.toString(); } for (var i = 0; i < metrics.length; i += 20) { var chunk = metrics.slice(i, i + 20); prepared_metrics.push( chunk.map(function (element) { return encodeURIComponent(element); }).join(',') ); } start_date = new Date((new Date().getTime()) - 600000).toISOString().replace(/\.\d+/, ''); end_date = new Date().toISOString().replace(/\.\d+/, ''); for (var j in prepared_metrics) { try { metrics_data = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.Insights/metrics?metricnames=' + prepared_metrics[j] + '×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date) + '&api-version=2021-05-01'); if ('value' in metrics_data && Array.isArray(metrics_data.value) && metrics_data.value.length > 0) { for (k in metrics_data.value) { if ('name' in metrics_data.value[k] && typeof metrics_data.value[k].name === 'object' && 'value' in metrics_data.value[k].name && typeof metrics_data.value[k].name.value === 'string' && 'timeseries' in metrics_data.value[k] && Array.isArray(metrics_data.value[k].timeseries) && metrics_data.value[k].timeseries.length > 0 && 'data' in metrics_data.value[k].timeseries[0] && Array.isArray(metrics_data.value[k].timeseries[0].data) && metrics_data.value[k].timeseries[0].data.length > 0) { if (metrics_data.value[k].name.value === 'disk_queue_depth' || metrics_data.value[k].name.value === 'read_throughput' || metrics_data.value[k].name.value === 'write_throughput' || metrics_data.value[k].name.value === 'read_iops' || metrics_data.value[k].name.value === 'write_iops') { data.metrics[metrics_data.value[k].name.value.replace(/(\s|\/)+/g, '')] = metrics_data.value[k].timeseries[0].data[metrics_data.value[k].timeseries[0].data.length - 6]; } else { data.metrics[metrics_data.value[k].name.value.replace(/(\s|\/)+/g, '')] = metrics_data.value[k].timeseries[0].data[metrics_data.value[k].timeseries[0].data.length - 1]; } } } } } catch (error) { data.errors[prepared_metrics[j]] = error.toString(); } } } } catch (error) { data.errors.params = error.toString(); } if (Object.keys(data.errors).length !== 0) { errors = 'Failed to receive data:'; for (var error in data.errors) { errors += '\n' + error + ' : ' + data.errors[error]; } data.errors = errors; } else { data.errors = ''; } return JSON.stringify(data); description: 'The result of API requests is expressed in the JSON.' timeout: '{$AZURE.DATA.TIMEOUT}' parameters: - name: app_id value: '{$AZURE.APP.ID}' - name: password value: '{$AZURE.PASSWORD}' - name: tenant_id value: '{$AZURE.TENANT.ID}' - name: subscription_id value: '{$AZURE.SUBSCRIPTION.ID}' - name: resource_id value: '{$AZURE.RESOURCE.ID}' - name: proxy value: '{$AZURE.PROXY}' tags: - tag: component value: raw - uuid: 9fc7a458995d4ac8a4c1d8550177471d name: 'Azure PostgreSQL: Data disk read Bps' type: DEPENDENT key: azure.db.pgsql.disk.bps.read delay: '0' history: 7d value_type: FLOAT units: Bps description: 'Bytes read per second from the data disk during the monitoring period.' preprocessing: - type: JSONPATH parameters: - $.metrics.read_throughput.average error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: 46c500b44164430c952be3a1b2008fb8 name: 'Azure PostgreSQL: Data disk write Bps' type: DEPENDENT key: azure.db.pgsql.disk.bps.write delay: '0' history: 7d value_type: FLOAT units: Bps description: 'Bytes written per second to the data disk during the monitoring period.' preprocessing: - type: JSONPATH parameters: - $.metrics.write_throughput.average error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: b8812461d49a4ff5a2177c2990969c38 name: 'Azure PostgreSQL: Data disk queue depth' type: DEPENDENT key: azure.db.pgsql.disk.queue.depth delay: '0' history: 7d value_type: FLOAT description: 'The number of outstanding I/O operations to the data disk.' preprocessing: - type: JSONPATH parameters: - $.metrics.disk_queue_depth.average error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: 10dd8ed658d8442ca39ac1decf9bc2f8 name: 'Azure PostgreSQL: Data disk IOPS' type: DEPENDENT key: azure.db.pgsql.iops delay: '0' history: 7d value_type: FLOAT units: '!ops' description: 'I/O operations per second.' preprocessing: - type: JSONPATH parameters: - $.metrics.iops.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: dee65b110a4842ccba8e74eefc097304 name: 'Azure PostgreSQL: Data disk read IOPS' type: DEPENDENT key: azure.db.pgsql.iops.read delay: '0' history: 7d value_type: FLOAT units: '!ops' description: 'The number of the data disk I/O read operations per second.' preprocessing: - type: JSONPATH parameters: - $.metrics.read_iops.average error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: 805dfa040c0a4700acac4b5b1f8a4d11 name: 'Azure PostgreSQL: Data disk write IOPS' type: DEPENDENT key: azure.db.pgsql.iops.write delay: '0' history: 7d value_type: FLOAT units: '!ops' description: 'The number of the data disk I/O write operations per second.' preprocessing: - type: JSONPATH parameters: - $.metrics.write_iops.average error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: d1d909c2dd0d42649094ec8339e08881 name: 'Azure PostgreSQL: Memory utilization' type: DEPENDENT key: azure.db.pgsql.memory.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The memory percent of a host.' preprocessing: - type: JSONPATH parameters: - $.metrics.memory_percent.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: memory triggers: - uuid: aac52a89709044ed987a365a1d5af17b expression: 'min(/Azure PostgreSQL Flexible Server by HTTP/azure.db.pgsql.memory.percentage,5m)>{$AZURE.DB.MEMORY.UTIL.CRIT}' name: 'Azure PostgreSQL: High memory utilization' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: AVERAGE description: 'The system is running out of free memory.' tags: - tag: scope value: performance - uuid: 040898e15a26455a9992c603ca2d45df name: 'Azure PostgreSQL: Network out' type: DEPENDENT key: azure.db.pgsql.network.egress delay: '0' history: 7d value_type: FLOAT units: bps description: 'The network outbound traffic across the active connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.network_bytes_egress.total - type: MULTIPLIER parameters: - '0.1333' master_item: key: azure.db.pgsql.data.get tags: - tag: component value: network - uuid: 8e398d8b33444a148760ec33622755a6 name: 'Azure PostgreSQL: Network in' type: DEPENDENT key: azure.db.pgsql.network.ingress delay: '0' history: 7d value_type: FLOAT units: bps description: 'The network inbound traffic across the active connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.network_bytes_ingress.total - type: MULTIPLIER parameters: - '0.1333' master_item: key: azure.db.pgsql.data.get tags: - tag: component value: network - uuid: ebebf8b3a2884576abb250fdc2385c6f name: 'Azure PostgreSQL: Backup storage used' type: DEPENDENT key: azure.db.pgsql.storage.backup.used delay: '0' history: 7d value_type: FLOAT units: B description: 'Used backup storage, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.backup_storage_used.average error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: 9bbfba89a1834798b71260536fedab55 name: 'Azure PostgreSQL: Storage free' type: DEPENDENT key: azure.db.pgsql.storage.free delay: '0' history: 7d value_type: FLOAT units: B description: 'Free storage space, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_free.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: d9d97e728d1741568fce925c0fca33a8 name: 'Azure PostgreSQL: Storage percent' type: DEPENDENT key: azure.db.pgsql.storage.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The storage utilization, expressed in %.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_percent.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage triggers: - uuid: de3142bed28340d9abe518cd3967b024 expression: 'last(/Azure PostgreSQL Flexible Server by HTTP/azure.db.pgsql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.CRIT}' name: 'Azure PostgreSQL: Storage space is critically low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: AVERAGE description: 'Critical utilization of the storage space.' tags: - tag: scope value: capacity - uuid: e948600affaa4ff4a0ab4e50f4858c0a expression: 'last(/Azure PostgreSQL Flexible Server by HTTP/azure.db.pgsql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.WARN}' name: 'Azure PostgreSQL: Storage space is low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: WARNING description: 'High utilization of the storage space.' tags: - tag: scope value: capacity - uuid: 4dae6c2c1dbf4492a73fd1834cae6aad name: 'Azure PostgreSQL: Transaction log storage used' type: DEPENDENT key: azure.db.pgsql.storage.txlogs.used delay: '0' history: 7d value_type: FLOAT units: B description: 'The storage space used by a transaction log, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.txlogs_storage_used.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: 7a85b5223ec44ff8bc996c9df1673611 name: 'Azure PostgreSQL: Storage used' type: DEPENDENT key: azure.db.pgsql.storage.used delay: '0' history: 7d value_type: FLOAT units: B description: 'Used storage space, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_used.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: 6df77ed1d4614ca793df56dbc70d821c name: 'Azure PostgreSQL: Maximum used transaction IDs' type: DEPENDENT key: azure.db.pgsql.txid.used.max delay: '0' history: 7d value_type: FLOAT description: 'The maximum number of used transaction IDs.' preprocessing: - type: JSONPATH parameters: - $.metrics.maximum_used_transactionIDs.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage tags: - tag: class value: software - tag: target value: azure - tag: target value: postgresql macros: - macro: '{$AZURE.APP.ID}' description: 'The App ID of Microsoft Azure.' - macro: '{$AZURE.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$AZURE.DB.CPU.UTIL.CRIT}' value: '90' description: 'The critical threshold of CPU utilization, expressed in %.' - macro: '{$AZURE.DB.MEMORY.UTIL.CRIT}' value: '90' description: 'The critical threshold of memory utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.CRIT}' value: '90' description: 'The critical threshold of storage utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.WARN}' value: '80' description: 'The warning threshold of storage utilization, expressed in %.' - macro: '{$AZURE.PASSWORD}' type: SECRET_TEXT description: 'Microsoft Azure password.' - macro: '{$AZURE.PROXY}' description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.' - macro: '{$AZURE.RESOURCE.ID}' description: 'Microsoft Azure PostgreSQL server ID.' - macro: '{$AZURE.SUBSCRIPTION.ID}' description: 'Microsoft Azure subscription ID.' - macro: '{$AZURE.TENANT.ID}' description: 'Microsoft Azure tenant ID.' valuemaps: - uuid: f208cf6141c44659a2c6904ec4cd7ac3 name: 'Azure resource health state' mappings: - value: '0' newvalue: Available - value: '1' newvalue: Degraded - value: '2' newvalue: Unavailable - value: '3' newvalue: Unknown - uuid: d023e2cd326c486f908e3e361d1fe157 template: 'Azure PostgreSQL Single Server by HTTP' name: 'Azure PostgreSQL Single Server by HTTP' description: | This template is designed to monitor Microsoft Azure PostgreSQL servers by HTTP. It works without any external scripts and uses the script item. Setup: 1. Create an Azure service principal via the Azure command-line interface (Azure CLI) for your subscription. `az ad sp create-for-rbac --name zabbix --role reader --scope /subscriptions/` See https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli for more details. 2. Link the template to a host. 3. Configure the macros: {$AZURE.APP.ID}, {$AZURE.PASSWORD}, {$AZURE.TENANT.ID}, {$AZURE.SUBSCRIPTION.ID}, and {$AZURE.RESOURCE.ID}. You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/ Generated by official Zabbix template tool "Templator" 2.0.0 vendor: name: Zabbix version: 7.0-0 groups: - name: Templates/Cloud items: - uuid: 9eb43a5ffb0d4e07be8d1fccfdecd2aa name: 'Azure PostgreSQL: Availability status detailed' type: DEPENDENT key: azure.db.pgsql.availability.details delay: '0' history: 7d trends: '0' value_type: CHAR description: 'The summary description of the availability status.' preprocessing: - type: JSONPATH parameters: - $.health.summary - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.pgsql.data.get tags: - tag: component value: health - uuid: df4c66646f864f79b5f5e9f71dbefe82 name: 'Azure PostgreSQL: Availability state' type: DEPENDENT key: azure.db.pgsql.availability.state delay: '0' history: 7d description: 'The availability status of the resource.' valuemap: name: 'Azure resource health state' preprocessing: - type: JSONPATH parameters: - $.health.availabilityState error_handler: CUSTOM_VALUE error_handler_params: '3' - type: STR_REPLACE parameters: - Available - '0' - type: STR_REPLACE parameters: - Degraded - '1' - type: STR_REPLACE parameters: - Unavailable - '2' - type: STR_REPLACE parameters: - Unknown - '3' - type: IN_RANGE parameters: - '0' - '3' error_handler: CUSTOM_VALUE error_handler_params: '3' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.pgsql.data.get tags: - tag: component value: health triggers: - uuid: 699ca12c916746b1bf1e121261771cc3 expression: 'last(/Azure PostgreSQL Single Server by HTTP/azure.db.pgsql.availability.state)=1' name: 'Azure PostgreSQL: PostgreSQL server is degraded' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'The resource is in degraded state.' tags: - tag: scope value: availability - uuid: 14e45ba0bc26409a89d92edfda152947 expression: 'last(/Azure PostgreSQL Single Server by HTTP/azure.db.pgsql.availability.state)=3' name: 'Azure PostgreSQL: PostgreSQL server is in unknown state' opdata: '{ITEM.LASTVALUE1}' priority: WARNING description: 'The resource state is unknown.' tags: - tag: scope value: availability - uuid: 4dc9113f8a914ac098d8736dba5aed4a expression: 'last(/Azure PostgreSQL Single Server by HTTP/azure.db.pgsql.availability.state)=2' name: 'Azure PostgreSQL: PostgreSQL server is unavailable' opdata: '{ITEM.LASTVALUE1}' priority: HIGH description: 'The resource state is unavailable.' tags: - tag: scope value: availability - uuid: 3d0d3e1fe77740e4bd7b720368707214 name: 'Azure PostgreSQL: Connections active' type: DEPENDENT key: azure.db.pgsql.connections.active delay: '0' history: 7d value_type: FLOAT description: 'The count of active connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.active_connections.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: network - uuid: 353a6ba543a84b32b16a5809ae63b4e1 name: 'Azure PostgreSQL: Connections failed' type: DEPENDENT key: azure.db.pgsql.connections.failed delay: '0' history: 7d value_type: FLOAT description: 'The count of failed connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.connections_failed.total error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: network - uuid: 537330b2372b434ebcea8a77a809c2f3 name: 'Azure PostgreSQL: Percentage CPU' type: DEPENDENT key: azure.db.pgsql.cpu.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The CPU percent of a host.' preprocessing: - type: JSONPATH parameters: - $.metrics.cpu_percent.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: cpu triggers: - uuid: 33bd2ef88ad3468b9f0b2b1358cc7448 expression: 'min(/Azure PostgreSQL Single Server by HTTP/azure.db.pgsql.cpu.percentage,5m)>{$AZURE.DB.CPU.UTIL.CRIT}' name: 'Azure PostgreSQL: High CPU utilization' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: HIGH description: 'The CPU utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: 5b132ff050c94daa92b252529a52c535 name: 'Azure PostgreSQL: Get errors' type: DEPENDENT key: azure.db.pgsql.data.errors delay: '0' history: 7d trends: '0' value_type: TEXT description: 'A list of errors from API requests.' preprocessing: - type: JSONPATH parameters: - $.errors - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.db.pgsql.data.get tags: - tag: component value: raw triggers: - uuid: dd3d0be997204f8b9968ef5839fb7a9b expression: 'length(last(/Azure PostgreSQL Single Server by HTTP/azure.db.pgsql.data.errors))>0' name: 'Azure PostgreSQL: There are errors in requests to API' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'Zabbix has received errors in response to API requests.' tags: - tag: scope value: availability - uuid: e47d863822e64e6292bfa3e684bc2839 name: 'Azure PostgreSQL: Get data' type: SCRIPT key: azure.db.pgsql.data.get history: '0' trends: '0' value_type: TEXT params: | var AzureDB = { params: {}, token: null, setParams: function (params) { ['app_id', 'password', 'tenant_id', 'subscription_id', 'resource_id'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); AzureDB.params = params; }, request: function (url, data) { if (typeof data === 'undefined' || data === null) { data = ''; } var response, request = new HttpRequest(); if (typeof AzureDB.params.proxy !== 'undefined' && AzureDB.params.proxy !== '') { request.setProxy(AzureDB.params.proxy); } if (AzureDB.token) { request.addHeader('Accept: application/json'); request.addHeader('Authorization: Bearer ' + AzureDB.token); } Zabbix.log(4, '[ Azure ] Sending request: ' + url); if (data !== '') { request.addHeader('Content-Type: application/x-www-form-urlencoded'); response = request.post(url, data); } else { response = request.get(url); } Zabbix.log(4, '[ Azure ] Received response with status code ' + request.getStatus() + ': ' + response); if (request.getStatus() !== 200 || response === null) { throw 'Request failed with status code ' + request.getStatus() + ': ' + response; } try { return JSON.parse(response); } catch (error) { throw 'Failed to parse response received from API.'; } } }; var metrics = [ 'cpu_percent', 'memory_percent', 'io_consumption_percent', 'storage_percent', 'storage_used', 'storage_limit', 'serverlog_storage_percent', 'serverlog_storage_usage', 'serverlog_storage_limit', 'active_connections', 'connections_failed', 'backup_storage_used', 'network_bytes_egress', 'network_bytes_ingress', 'pg_replica_log_delay_in_seconds', 'pg_replica_log_delay_in_bytes' ], prepared_metrics = [], data = {}; data['errors'] = {}; data['metrics'] = {}; try { AzureDB.setParams(JSON.parse(value)); try { result = AzureDB.request( 'https://login.microsoftonline.com/' + encodeURIComponent(AzureDB.params.tenant_id) + '/oauth2/token', 'grant_type=client_credentials&resource=' + encodeURIComponent('https://management.azure.com/') + '&client_id=' + encodeURIComponent(AzureDB.params.app_id) + '&client_secret=' + encodeURIComponent(AzureDB.params.password) ); if ('access_token' in result) { AzureDB.token = result['access_token']; } else { throw 'Auth response does not contain access token.'; } } catch (error) { data.errors.auth = error.toString(); } if (!('auth' in data.errors)) { try { health = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.ResourceHealth/availabilityStatuses?api-version=2020-05-01'); if ('value' in health && Array.isArray(health.value) && health.value.length > 0 && 'properties' in health.value[0] && typeof health.value[0].properties === 'object') { data.health = health.value[0].properties; } } catch (error) { data.errors.health = error.toString(); } for (var i = 0; i < metrics.length; i += 20) { var chunk = metrics.slice(i, i + 20); prepared_metrics.push( chunk.map(function (element) { return encodeURIComponent(element); }).join(',') ); } start_date = new Date((new Date().getTime()) - 300000).toISOString().replace(/\.\d+/, ''); end_date = new Date().toISOString().replace(/\.\d+/, ''); for (var j in prepared_metrics) { try { metrics_data = AzureDB.request('https://management.azure.com' + AzureDB.params.resource_id + '/providers/Microsoft.Insights/metrics?metricnames=' + prepared_metrics[j] + '×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date) + '&api-version=2021-05-01'); if ('value' in metrics_data && Array.isArray(metrics_data.value) && metrics_data.value.length > 0) { for (k in metrics_data.value) { if ('name' in metrics_data.value[k] && typeof metrics_data.value[k].name === 'object' && 'value' in metrics_data.value[k].name && typeof metrics_data.value[k].name.value === 'string' && 'timeseries' in metrics_data.value[k] && Array.isArray(metrics_data.value[k].timeseries) && metrics_data.value[k].timeseries.length > 0 && 'data' in metrics_data.value[k].timeseries[0] && Array.isArray(metrics_data.value[k].timeseries[0].data) && metrics_data.value[k].timeseries[0].data.length > 0) { data.metrics[metrics_data.value[k].name.value.replace(/(\s|\/)+/g, '')] = metrics_data.value[k].timeseries[0].data[metrics_data.value[k].timeseries[0].data.length - 1]; } } } } catch (error) { data.errors[prepared_metrics[j]] = error.toString(); } } } } catch (error) { data.errors.params = error.toString(); } if (Object.keys(data.errors).length !== 0) { errors = 'Failed to receive data:'; for (var error in data.errors) { errors += '\n' + error + ' : ' + data.errors[error]; } data.errors = errors; } else { data.errors = ''; } return JSON.stringify(data); description: 'The result of API requests is expressed in the JSON.' timeout: '{$AZURE.DATA.TIMEOUT}' parameters: - name: app_id value: '{$AZURE.APP.ID}' - name: password value: '{$AZURE.PASSWORD}' - name: tenant_id value: '{$AZURE.TENANT.ID}' - name: subscription_id value: '{$AZURE.SUBSCRIPTION.ID}' - name: resource_id value: '{$AZURE.RESOURCE.ID}' - name: proxy value: '{$AZURE.PROXY}' tags: - tag: component value: raw - uuid: 9eade85c49bc462aab33b03e37581d87 name: 'Azure PostgreSQL: IO consumption percent' type: DEPENDENT key: azure.db.pgsql.io.consumption.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The consumption percent of I/O.' preprocessing: - type: JSONPATH parameters: - $.metrics.io_consumption_percent.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: operations - uuid: e2ee4882b08f45788e6abb698265810e name: 'Azure PostgreSQL: Memory utilization' type: DEPENDENT key: azure.db.pgsql.memory.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The memory percent of a host.' preprocessing: - type: JSONPATH parameters: - $.metrics.memory_percent.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: memory triggers: - uuid: 3119f21167a546369c05d31cda2e0147 expression: 'min(/Azure PostgreSQL Single Server by HTTP/azure.db.pgsql.memory.percentage,5m)>{$AZURE.DB.MEMORY.UTIL.CRIT}' name: 'Azure PostgreSQL: High memory utilization' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: AVERAGE description: 'The system is running out of free memory.' tags: - tag: scope value: performance - uuid: f81eeb98d5e942f296c360ff71e8bf8d name: 'Azure PostgreSQL: Network out' type: DEPENDENT key: azure.db.pgsql.network.egress delay: '0' history: 7d value_type: FLOAT units: bps description: 'The network outbound traffic across the active connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.network_bytes_egress.total error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.1333' master_item: key: azure.db.pgsql.data.get tags: - tag: component value: network - uuid: 51f7e35042d04ddb88c7703d1b015d3b name: 'Azure PostgreSQL: Network in' type: DEPENDENT key: azure.db.pgsql.network.ingress delay: '0' history: 7d value_type: FLOAT units: bps description: 'The network inbound traffic across the active connections.' preprocessing: - type: JSONPATH parameters: - $.metrics.network_bytes_ingress.total error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.1333' master_item: key: azure.db.pgsql.data.get tags: - tag: component value: network - uuid: 1db9e470b527476fae1d26d4b67f855b name: 'Azure PostgreSQL: Replication lag' type: DEPENDENT key: azure.db.pgsql.replica.log.delay delay: '0' history: 7d value_type: FLOAT units: s description: 'The replication lag, expressed in seconds.' preprocessing: - type: JSONPATH parameters: - $.metrics.pg_replica_log_delay_in_seconds.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: replication - uuid: 6cdfda8f9e6640f8a8536f88729d75d6 name: 'Azure PostgreSQL: Max lag across replicas in bytes' type: DEPENDENT key: azure.db.pgsql.replica.log.delay.bytes delay: '0' history: 7d value_type: FLOAT units: B description: 'Lag for the most lagging replica, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.pg_replica_log_delay_in_bytes.maximum error_handler: DISCARD_VALUE master_item: key: azure.db.pgsql.data.get tags: - tag: component value: replication - uuid: 6b06fb0e008640839dc3cda5bcc3f91a name: 'Azure PostgreSQL: Backup storage used' type: DEPENDENT key: azure.db.pgsql.storage.backup.used delay: '0' history: 7d value_type: FLOAT units: B description: 'Used backup storage, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.backup_storage_used.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: b8d5ac0b049a4d73b2f35f59c7e7609c name: 'Azure PostgreSQL: Storage limit' type: DEPENDENT key: azure.db.pgsql.storage.limit delay: '0' history: 7d value_type: FLOAT units: B description: 'The storage limit, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_limit.maximum master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: 750b4d3438614cc992694136d309c3cb name: 'Azure PostgreSQL: Storage percent' type: DEPENDENT key: azure.db.pgsql.storage.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The storage utilization, expressed in %.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_percent.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage triggers: - uuid: 6538d2c8ed774feb951204308f1458ce expression: 'last(/Azure PostgreSQL Single Server by HTTP/azure.db.pgsql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.CRIT}' name: 'Azure PostgreSQL: Storage space is critically low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: AVERAGE description: 'Critical utilization of the storage space.' tags: - tag: scope value: capacity - uuid: 7f7a004cfc2a492092dd74c475888e8b expression: 'last(/Azure PostgreSQL Single Server by HTTP/azure.db.pgsql.storage.percent)>{$AZURE.DB.STORAGE.PUSED.WARN}' name: 'Azure PostgreSQL: Storage space is low' opdata: 'Current utilization: {ITEM.LASTVALUE1}' priority: WARNING description: 'High utilization of the storage space.' tags: - tag: scope value: capacity - uuid: 399ef67426494a5cb7a820d056dfd4d5 name: 'Azure PostgreSQL: Server log storage limit' type: DEPENDENT key: azure.db.pgsql.storage.server.log.limit delay: '0' history: 7d value_type: FLOAT units: B description: 'The storage limit of a server log, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.serverlog_storage_limit.maximum master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: ef6890330ebe4fe09f46b0d2f6d3f827 name: 'Azure PostgreSQL: Server log storage percent' type: DEPENDENT key: azure.db.pgsql.storage.server.log.percent delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The storage utilization by a server log, expressed in %.' preprocessing: - type: JSONPATH parameters: - $.metrics.serverlog_storage_percent.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: 36bd10a959964083ae47349dd83ec695 name: 'Azure PostgreSQL: Server log storage used' type: DEPENDENT key: azure.db.pgsql.storage.server.log.used delay: '0' history: 7d value_type: FLOAT units: B description: 'The storage space used by a server log, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.serverlog_storage_usage.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage - uuid: dcbb87d442a04938b23e68f739f1e36f name: 'Azure PostgreSQL: Storage used' type: DEPENDENT key: azure.db.pgsql.storage.used delay: '0' history: 7d value_type: FLOAT units: B description: 'Used storage space, expressed in bytes.' preprocessing: - type: JSONPATH parameters: - $.metrics.storage_used.average master_item: key: azure.db.pgsql.data.get tags: - tag: component value: storage tags: - tag: class value: software - tag: target value: azure - tag: target value: postgresql macros: - macro: '{$AZURE.APP.ID}' description: 'The App ID of Microsoft Azure.' - macro: '{$AZURE.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$AZURE.DB.CPU.UTIL.CRIT}' value: '90' description: 'The critical threshold of CPU utilization, expressed in %.' - macro: '{$AZURE.DB.MEMORY.UTIL.CRIT}' value: '90' description: 'The critical threshold of memory utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.CRIT}' value: '90' description: 'The critical threshold of storage utilization, expressed in %.' - macro: '{$AZURE.DB.STORAGE.PUSED.WARN}' value: '80' description: 'The warning threshold of storage utilization, expressed in %.' - macro: '{$AZURE.PASSWORD}' type: SECRET_TEXT description: 'Microsoft Azure password.' - macro: '{$AZURE.PROXY}' description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.' - macro: '{$AZURE.RESOURCE.ID}' description: 'Microsoft Azure PostgreSQL server ID.' - macro: '{$AZURE.SUBSCRIPTION.ID}' description: 'Microsoft Azure subscription ID.' - macro: '{$AZURE.TENANT.ID}' description: 'Microsoft Azure tenant ID.' valuemaps: - uuid: 61fc206aaae04abda4012e031f0e27ac name: 'Azure resource health state' mappings: - value: '0' newvalue: Available - value: '1' newvalue: Degraded - value: '2' newvalue: Unavailable - value: '3' newvalue: Unknown - uuid: 820fa4a1565c43e4aac07a691a5bface template: 'Azure Virtual Machine by HTTP' name: 'Azure Virtual Machine by HTTP' description: | This template is designed to monitor Microsoft Azure Virtual Machines (VMs) by HTTP. It works without any external scripts and uses the script item. Setup: 1. Create an Azure service principal via the Azure command-line interface (Azure CLI) for your subscription. `az ad sp create-for-rbac --name zabbix --role reader --scope /subscriptions/` See https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli for more details. 2. Link the template to a host. 3. Configure the macros: {$AZURE.APP.ID}, {$AZURE.PASSWORD}, {$AZURE.TENANT.ID}, {$AZURE.SUBSCRIPTION.ID}, and {$AZURE.RESOURCE.ID}. You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/ Generated by official Zabbix template tool "Templator" 2.0.0 vendor: name: Zabbix version: 7.0-0 groups: - name: Templates/Cloud items: - uuid: c299999d69904340acd44fead6c7672c name: 'Azure: Availability status detailed' type: DEPENDENT key: azure.vm.availability.details delay: '0' history: 7d trends: '0' value_type: CHAR description: 'The summary description of availability status.' preprocessing: - type: JSONPATH parameters: - $.health.summary - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.vm.data.get tags: - tag: component value: health - uuid: 25e2af44bfbf4e9083ce493d85232088 name: 'Azure: Availability state' type: DEPENDENT key: azure.vm.availability.state delay: '0' history: 7d description: 'The availability status of the resource.' valuemap: name: 'Azure resource health state' preprocessing: - type: JSONPATH parameters: - $.health.availabilityState error_handler: CUSTOM_VALUE error_handler_params: '3' - type: STR_REPLACE parameters: - Available - '0' - type: STR_REPLACE parameters: - Degraded - '1' - type: STR_REPLACE parameters: - Unavailable - '2' - type: STR_REPLACE parameters: - Unknown - '3' - type: IN_RANGE parameters: - '0' - '3' error_handler: CUSTOM_VALUE error_handler_params: '3' - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.vm.data.get tags: - tag: component value: health triggers: - uuid: c0170d8a09ae460da923fe773b2b0bd0 expression: 'last(/Azure Virtual Machine by HTTP/azure.vm.availability.state)=1' name: 'Azure: Virtual machine is degraded' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'The resource is in degraded state.' tags: - tag: scope value: availability - uuid: e1b85765b83445ebbf15f02d782b9858 expression: 'last(/Azure Virtual Machine by HTTP/azure.vm.availability.state)=3' name: 'Azure: Virtual machine is in unknown state' opdata: '{ITEM.LASTVALUE1}' priority: WARNING description: 'The resource state is unknown.' tags: - tag: scope value: availability - uuid: b3d764ff735e44f8806cc4d29090719e expression: 'last(/Azure Virtual Machine by HTTP/azure.vm.availability.state)=2' name: 'Azure: Virtual machine is unavailable' opdata: '{ITEM.LASTVALUE1}' priority: HIGH description: 'The resource state is unavailable.' tags: - tag: scope value: availability - uuid: a93308573303437487d151de340fcaed name: 'Azure: VM cached bandwidth consumed percentage' type: DEPENDENT key: azure.vm.cached.bandwidth.consumed.percentage delay: '0' history: 7d units: '%' description: 'The percentage of the cached disk bandwidth consumed by the VM.' preprocessing: - type: JSONPATH parameters: - $.metrics.VMCachedBandwidthConsumedPercentage.average master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 989dec26d97d44b6bd4a84fdbd37dec5 name: 'Azure: VM cached IOPS consumed percentage' type: DEPENDENT key: azure.vm.cached.iops.consumed.percentage delay: '0' history: 7d units: '%' description: 'The percentage of the cached disk IOPS consumed by the VM.' preprocessing: - type: JSONPATH parameters: - $.metrics.VMCachedIOPSConsumedPercentage.average master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: fb0641ca8f104cf1bebdced63cd6af16 name: 'Azure: CPU credits consumed' type: DEPENDENT key: azure.vm.cpu.credits.consumed delay: '0' history: 7d value_type: FLOAT description: 'The total number of credits consumed by the Virtual Machine. Only available on B-series burstable VMs.' preprocessing: - type: JSONPATH parameters: - $.metrics.CPUCreditsConsumed.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: cpu - uuid: 963752cbaba046cab1f05b0cbcff3137 name: 'Azure: CPU credits remaining' type: DEPENDENT key: azure.vm.cpu.credits.remaining delay: '0' history: 7d value_type: FLOAT description: 'The total number of credits available to burst. Available only on B-series burstable VMs.' preprocessing: - type: JSONPATH parameters: - $.metrics.CPUCreditsRemaining.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: cpu - uuid: 492edacf92544a95a5aa7b034efa7931 name: 'Azure: Percentage CPU' type: DEPENDENT key: azure.vm.cpu.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of allocated computing units that are currently in use by VMs.' preprocessing: - type: JSONPATH parameters: - $.metrics.PercentageCPU.average master_item: key: azure.vm.data.get tags: - tag: component value: cpu triggers: - uuid: 9e6d9394570641418b4291befb1e38e5 expression: 'min(/Azure Virtual Machine by HTTP/azure.vm.cpu.percentage,5m)>{$AZURE.VM.CPU.UTIL.CRIT}' name: 'Azure: High CPU utilization' opdata: '{ITEM.LASTVALUE1}' priority: HIGH description: 'The CPU utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: 47cda13c203e4f1e9918eb73fd8afa20 name: 'Azure: Data disk bandwidth consumed percentage' type: DEPENDENT key: azure.vm.data.disk.bandwidth.consumed.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of the data disk''s bandwidth consumed per minute.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskBandwidthConsumedPercentage.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 3121980d3319431691ed9e98d176430b name: 'Azure: Data disk IOPS consumed percentage' type: DEPENDENT key: azure.vm.data.disk.iops.consumed.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of the data disk input/output (I/O) consumed per minute.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskIOPSConsumedPercentage.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: d0fb23206d564e1da746bff3369056c1 name: 'Azure: Data disk max burst bandwidth' type: DEPENDENT key: azure.vm.data.disk.max.bandwidth delay: '0' history: 7d value_type: FLOAT units: Bps description: 'The maximum bytes per second throughput that the data disk can achieve with bursting.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskMaxBurstBandwidth.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 6afcbb02c53243faa341670f155678e4 name: 'Azure: Data disk max burst IOPS' type: DEPENDENT key: azure.vm.data.disk.max.iops delay: '0' history: 7d value_type: FLOAT units: '!iops' description: 'The maximum IOPS that the data disk can achieve with bursting.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskMaxBurstIOPS.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: b81f304bbc2a42df9b0550ecdc1ec6b7 name: 'Azure: Data disk queue depth' type: DEPENDENT key: azure.vm.data.disk.queue.depth delay: '0' history: 7d value_type: FLOAT description: 'The number of outstanding IO requests that are waiting to be performed on a disk.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskQueueDepth.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 021d92f3075544319191d6f85a701222 name: 'Azure: Data disk read rate' type: DEPENDENT key: azure.vm.data.disk.read.bps delay: '0' history: 7d value_type: FLOAT units: Bps description: 'Bytes per second read from a single disk during the monitoring period.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskReadBytessec.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: cc31283ab96548b7bdcc88e89dfae53c name: 'Azure: Data disk read operations/sec' type: DEPENDENT key: azure.vm.data.disk.read.ops delay: '0' history: 7d value_type: FLOAT units: '!iops' description: 'The read IOPS from a single disk during the monitoring period.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskReadOperationsSec.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: c61ad4af97c243cca75bbece40eea795 name: 'Azure: Data disk target bandwidth' type: DEPENDENT key: azure.vm.data.disk.target.bandwidth delay: '0' history: 7d value_type: FLOAT units: Bps description: 'Baseline bytes per second throughput that the data disk can achieve without bursting.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskTargetBandwidth.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 9370988456e74b889700ea5798d17092 name: 'Azure: Data disk target IOPS' type: DEPENDENT key: azure.vm.data.disk.target.iops delay: '0' history: 7d value_type: FLOAT units: '!iops' description: 'The baseline IOPS that the data disk can achieve without bursting.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskTargetIOPS.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 68c730e4904f402cb12fb71b45fede02 name: 'Azure: Data disk used burst BPS credits percentage' type: DEPENDENT key: azure.vm.data.disk.used.burst.bandwidth delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of the data disk burst bandwidth credits used so far.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskUsedBurstBPSCreditsPercentage.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 731a82833bdd42c59c453adf8625e3b4 name: 'Azure: Data disk used burst IO credits percentage' type: DEPENDENT key: azure.vm.data.disk.used.burst.iops delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of the data disk burst I/O credits used so far.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskUsedBurstIOCreditsPercentage.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: b8712f8fd60a43f6b099d9eafed19945 name: 'Azure: Data disk write rate' type: DEPENDENT key: azure.vm.data.disk.write.bps delay: '0' history: 7d value_type: FLOAT units: Bps description: 'Bytes per second written to a single disk during the monitoring period.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskWriteBytessec.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 87794f5a502b4e2db91f820483e38fb3 name: 'Azure: Data disk write operations/sec' type: DEPENDENT key: azure.vm.data.disk.write.ops delay: '0' history: 7d value_type: FLOAT units: '!iops' description: 'The write IOPS from a single disk during the monitoring period.' preprocessing: - type: JSONPATH parameters: - $.metrics.DataDiskWriteOperationsSec.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: e253c2a908944be1a033fc3df550d979 name: 'Azure: Get errors' type: DEPENDENT key: azure.vm.data.errors delay: '0' history: 7d trends: '0' value_type: TEXT description: 'A list of errors from API requests.' preprocessing: - type: JSONPATH parameters: - $.errors - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 1h master_item: key: azure.vm.data.get tags: - tag: component value: raw triggers: - uuid: 87236c99652643ba800601a461d66d94 expression: 'length(last(/Azure Virtual Machine by HTTP/azure.vm.data.errors))>0' name: 'Azure: There are errors in requests to API' opdata: '{ITEM.LASTVALUE1}' priority: AVERAGE description: 'Zabbix has received errors in response to API requests.' tags: - tag: scope value: availability - uuid: cff54514d795495da8bc1152e02631aa name: 'Azure: Get data' type: SCRIPT key: azure.vm.data.get history: '0' trends: '0' value_type: TEXT params: | var AzureVM = { params: {}, token: null, setParams: function (params) { ['app_id', 'password', 'tenant_id', 'subscription_id', 'resource_id'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); AzureVM.params = params; }, request: function (url, data) { if (typeof data === 'undefined' || data === null) { data = ''; } var response, request = new HttpRequest(); if (typeof AzureVM.params.proxy !== 'undefined' && AzureVM.params.proxy !== '') { request.setProxy(AzureVM.params.proxy); } if (AzureVM.token) { request.addHeader('Accept: application/json'); request.addHeader('Authorization: Bearer ' + AzureVM.token); } Zabbix.log(4, '[ Azure ] Sending request: ' + url); if (data !== '') { request.addHeader('Content-Type: application/x-www-form-urlencoded'); response = request.post(url, data); } else { response = request.get(url); } Zabbix.log(4, '[ Azure ] Received response with status code ' + request.getStatus() + ': ' + response); if (request.getStatus() !== 200 || response === null) { throw 'Request failed with status code ' + request.getStatus() + ': ' + response; } try { return JSON.parse(response); } catch (error) { throw 'Failed to parse response received from API.'; } } }; var metrics = [ 'Percentage CPU', 'Network In', 'Network Out', 'Disk Read Bytes', 'Disk Write Bytes', 'Disk Read Operations/Sec', 'Disk Write Operations/Sec', 'CPU Credits Remaining', 'CPU Credits Consumed', 'Data Disk Read Bytes/sec', 'Data Disk Write Bytes/sec', 'Data Disk Read Operations/Sec', 'Data Disk Write Operations/Sec', 'Data Disk Queue Depth', 'Data Disk Bandwidth Consumed Percentage', 'Data Disk IOPS Consumed Percentage', 'Data Disk Target Bandwidth', 'Data Disk Target IOPS', 'Data Disk Max Burst Bandwidth', 'Data Disk Max Burst IOPS', 'Data Disk Used Burst BPS Credits Percentage', 'Data Disk Used Burst IO Credits Percentage', 'OS Disk Read Bytes/sec', 'OS Disk Write Bytes/sec', 'OS Disk Read Operations/Sec', 'OS Disk Write Operations/Sec', 'OS Disk Queue Depth', 'OS Disk Bandwidth Consumed Percentage', 'OS Disk IOPS Consumed Percentage', 'OS Disk Target Bandwidth', 'OS Disk Target IOPS', 'OS Disk Max Burst Bandwidth', 'OS Disk Max Burst IOPS', 'OS Disk Used Burst BPS Credits Percentage', 'OS Disk Used Burst IO Credits Percentage', 'Inbound Flows', 'Outbound Flows', 'Inbound Flows Maximum Creation Rate', 'Outbound Flows Maximum Creation Rate', 'Premium Data Disk Cache Read Hit', 'Premium Data Disk Cache Read Miss', 'Premium OS Disk Cache Read Hit', 'Premium OS Disk Cache Read Miss', 'VM Cached Bandwidth Consumed Percentage', 'VM Cached IOPS Consumed Percentage', 'VM Uncached Bandwidth Consumed Percentage', 'VM Uncached IOPS Consumed Percentage', 'Network In Total', 'Network Out Total', 'Available Memory Bytes' ], prepared_metrics = [], data = {}; data['errors'] = {}; data['metrics'] = {}; try { AzureVM.setParams(JSON.parse(value)); try { result = AzureVM.request( 'https://login.microsoftonline.com/' + encodeURIComponent(AzureVM.params.tenant_id) + '/oauth2/token', 'grant_type=client_credentials&resource=' + encodeURIComponent('https://management.azure.com/') + '&client_id=' + encodeURIComponent(AzureVM.params.app_id) + '&client_secret=' + encodeURIComponent(AzureVM.params.password) ); if ('access_token' in result) { AzureVM.token = result['access_token']; } else { throw 'Auth response does not contain access token.'; } } catch (error) { data.errors.auth = error.toString(); } if (!('auth' in data.errors)) { try { health = AzureVM.request('https://management.azure.com' + AzureVM.params.resource_id + '/providers/Microsoft.ResourceHealth/availabilityStatuses?api-version=2020-05-01'); if ('value' in health && Array.isArray(health.value) && health.value.length > 0 && 'properties' in health.value[0] && typeof health.value[0].properties === 'object') { data.health = health.value[0].properties; } } catch (error) { data.errors.health = error.toString(); } for (var i = 0; i < metrics.length; i += 20) { var chunk = metrics.slice(i, i + 20); prepared_metrics.push( chunk.map(function (element) { return encodeURIComponent(element); }).join(',') ); } start_date = new Date((new Date().getTime()) - 300000).toISOString().replace(/\.\d+/, ''); end_date = new Date().toISOString().replace(/\.\d+/, ''); for (var j in prepared_metrics) { try { metrics_data = AzureVM.request('https://management.azure.com' + AzureVM.params.resource_id + '/providers/Microsoft.Insights/metrics?metricnames=' + prepared_metrics[j] + '×pan=' + encodeURIComponent(start_date) + '/' + encodeURIComponent(end_date) + '&api-version=2021-05-01'); if ('value' in metrics_data && Array.isArray(metrics_data.value) && metrics_data.value.length > 0) { for (k in metrics_data.value) { if ('name' in metrics_data.value[k] && typeof metrics_data.value[k].name === 'object' && 'value' in metrics_data.value[k].name && typeof metrics_data.value[k].name.value === 'string' && 'timeseries' in metrics_data.value[k] && Array.isArray(metrics_data.value[k].timeseries) && metrics_data.value[k].timeseries.length > 0 && 'data' in metrics_data.value[k].timeseries[0] && Array.isArray(metrics_data.value[k].timeseries[0].data) && metrics_data.value[k].timeseries[0].data.length > 2) { data.metrics[metrics_data.value[k].name.value.replace(/(\s|\/)+/g, '')] = metrics_data.value[k].timeseries[0].data[metrics_data.value[k].timeseries[0].data.length - 3]; } } } } catch (error) { data.errors[prepared_metrics[j]] = error.toString(); } } } } catch (error) { data.errors.params = error.toString(); } if (Object.keys(data.errors).length !== 0) { errors = 'Failed to receive data:'; for (var error in data.errors) { errors += '\n' + error + ' : ' + data.errors[error]; } data.errors = errors; } else { data.errors = ''; } return JSON.stringify(data); description: 'The result of API requests is expressed in the JSON.' timeout: '{$AZURE.DATA.TIMEOUT}' parameters: - name: app_id value: '{$AZURE.APP.ID}' - name: password value: '{$AZURE.PASSWORD}' - name: tenant_id value: '{$AZURE.TENANT.ID}' - name: subscription_id value: '{$AZURE.SUBSCRIPTION.ID}' - name: resource_id value: '{$AZURE.RESOURCE.ID}' - name: proxy value: '{$AZURE.PROXY}' tags: - tag: component value: raw - uuid: 1dc9f8d45b6f48a38f701f089cbcb279 name: 'Azure: Disk read rate' type: DEPENDENT key: azure.vm.disk.read.bytes delay: '0' history: 7d value_type: FLOAT units: Bps description: 'Bytes read from the disk during the monitoring period (1 minute).' preprocessing: - type: JSONPATH parameters: - $.metrics.DiskReadBytes.total - type: MULTIPLIER parameters: - '0.0167' master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: cd3240d31a4f42a89b5c9817ea288b5a name: 'Azure: Disk read Operations/Sec' type: DEPENDENT key: azure.vm.disk.read.ops delay: '0' history: 7d value_type: FLOAT units: '!iops' description: 'The count of read operations from the disk per second.' preprocessing: - type: JSONPATH parameters: - $.metrics.DiskReadOperationsSec.average master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: b5e2070bde1444ea809ba4e0a29b05d9 name: 'Azure: Disk write rate' type: DEPENDENT key: azure.vm.disk.write.bytes delay: '0' history: 7d value_type: FLOAT units: Bps description: 'Bytes written to the disk during the monitoring period (1 minute).' preprocessing: - type: JSONPATH parameters: - $.metrics.DiskWriteBytes.total - type: MULTIPLIER parameters: - '0.0167' master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 0d93d1b510614c1f83418bd481f1e7cb name: 'Azure: Disk write Operations/Sec' type: DEPENDENT key: azure.vm.disk.write.ops delay: '0' history: 7d value_type: FLOAT units: '!iops' description: 'The count of write operations to the disk per second.' preprocessing: - type: JSONPATH parameters: - $.metrics.DiskWriteOperationsSec.average master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 3a30a59aabd54c8b8feb1f4a8ba06db5 name: 'Azure: Inbound flows' type: DEPENDENT key: azure.vm.flows.inbound delay: '0' history: 7d value_type: FLOAT description: 'The number of current flows in the inbound direction (the traffic going into the VM).' preprocessing: - type: JSONPATH parameters: - $.metrics.InboundFlows.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: network - uuid: 3964ffbb7ea949f69863edcf91f5c555 name: 'Azure: Inbound flows max creation rate' type: DEPENDENT key: azure.vm.flows.inbound.max delay: '0' history: 7d value_type: FLOAT description: 'The maximum creation rate of the inbound flows (the traffic going into the VM).' preprocessing: - type: JSONPATH parameters: - $.metrics.InboundFlowsMaximumCreationRate.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: network - uuid: 2084cb1d010a4ab494c0826c458d922a name: 'Azure: Outbound flows' type: DEPENDENT key: azure.vm.flows.outbound delay: '0' history: 7d value_type: FLOAT description: 'The number of current flows in the outbound direction (the traffic going out of the VM).' preprocessing: - type: JSONPATH parameters: - $.metrics.OutboundFlows.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: network - uuid: eac3e6b53d394e3289fc03bf5772799c name: 'Azure: Outbound flows max creation rate' type: DEPENDENT key: azure.vm.flows.outbound.max delay: '0' history: 7d value_type: FLOAT description: 'The maximum creation rate of the outbound flows (the traffic going out of the VM).' preprocessing: - type: JSONPATH parameters: - $.metrics.OutboundFlowsMaximumCreationRate.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: network - uuid: 0a354c9b104b468d9749adfd28d1373e name: 'Azure: Available memory' type: DEPENDENT key: azure.vm.memory.available delay: '0' history: 7d units: B description: 'The amount of physical memory (in bytes) immediately available for the allocation to a process or for a system use in the VM.' preprocessing: - type: JSONPATH parameters: - $.metrics.AvailableMemoryBytes.average master_item: key: azure.vm.data.get tags: - tag: component value: memory - uuid: 411c5f6fcb374c4c90e2951a546c0c08 name: 'Azure: Network in total' type: DEPENDENT key: azure.vm.network.in.total delay: '0' history: 7d value_type: FLOAT units: bps description: 'The number of bytes received by the VMs via all network interfaces (incoming traffic).' preprocessing: - type: JSONPATH parameters: - $.metrics.NetworkInTotal.total error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.1333' master_item: key: azure.vm.data.get tags: - tag: component value: network - uuid: ee2ef1d1e2844ae8be2a5f04c86631ba name: 'Azure: Network out total' type: DEPENDENT key: azure.vm.network.out.total delay: '0' history: 7d value_type: FLOAT units: bps description: 'The number of bytes sent by the VMs via all network interfaces (outgoing traffic).' preprocessing: - type: JSONPATH parameters: - $.metrics.NetworkOutTotal.total error_handler: DISCARD_VALUE - type: MULTIPLIER parameters: - '0.1333' master_item: key: azure.vm.data.get tags: - tag: component value: network - uuid: 24c58e473c5c4b8388a0e78ae38378fc name: 'Azure: OS disk bandwidth consumed percentage' type: DEPENDENT key: azure.vm.os.disk.bandwidth.consumed.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of the operating system''s disk bandwidth consumed per minute.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskBandwidthConsumedPercentage.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 33a7fff9758046e3be07dad6c0a710ca name: 'Azure: OS disk IOPS consumed percentage' type: DEPENDENT key: azure.vm.os.disk.iops.consumed.percentage delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of the operating system''s disk I/Os consumed per minute.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskIOPSConsumedPercentage.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 7d0ca132bc264ac08e3c55809bdc40d1 name: 'Azure: OS disk max burst bandwidth' type: DEPENDENT key: azure.vm.os.disk.max.bandwidth delay: '0' history: 7d value_type: FLOAT units: Bps description: 'Maximum bytes per second throughput that the OS Disk can achieve with bursting.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskMaxBurstBandwidth.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 8374282688dc4fabb770c07eb335c666 name: 'Azure: OS disk max burst IOPS' type: DEPENDENT key: azure.vm.os.disk.max.iops delay: '0' history: 7d value_type: FLOAT units: '!iops' description: 'Maximum IOPS that the OS Disk can achieve with bursting.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskMaxBurstIOPS.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: ca8fe9d0ea58482c9bb8b83a716362a2 name: 'Azure: OS disk queue depth' type: DEPENDENT key: azure.vm.os.disk.queue.depth delay: '0' history: 7d value_type: FLOAT description: 'The OS disk queue depth (or queue length).' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskQueueDepth.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 30265aac759d45769769eae081f570ac name: 'Azure: OS disk read rate' type: DEPENDENT key: azure.vm.os.disk.read.bps delay: '0' history: 7d value_type: FLOAT units: Bps description: 'Bytes per second read from a single disk during the monitoring period for OS disk.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskReadBytessec.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: f11fcbbd63234993a9c301dc8bac3e80 name: 'Azure: OS disk read operations/sec' type: DEPENDENT key: azure.vm.os.disk.read.ops delay: '0' history: 7d value_type: FLOAT units: '!iops' description: 'The read IOPS from a single disk during the monitoring period for OS disk.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskReadOperationsSec.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 5cc422b7da3145fa885a88bb6165e3b9 name: 'Azure: OS disk target bandwidth' type: DEPENDENT key: azure.vm.os.disk.target.bandwidth delay: '0' history: 7d value_type: FLOAT units: Bps description: 'Baseline bytes per second throughput that the OS Disk can achieve without bursting.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskTargetBandwidth.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 556941b1df5d470f8de628230b085623 name: 'Azure: OS disk target IOPS' type: DEPENDENT key: azure.vm.os.disk.target.iops delay: '0' history: 7d value_type: FLOAT units: '!iops' description: 'Baseline IOPS that the OS disk can achieve without bursting.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskTargetIOPS.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 9d42609950864c899a0d63b94f1d2235 name: 'Azure: OS disk used burst BPS credits percentage' type: DEPENDENT key: azure.vm.os.disk.used.burst.bandwidth delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of the OS Disk burst bandwidth credits used so far.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskUsedBurstBPSCreditsPercentage.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: c08f45df2e594e1fab01ba63df7da05b name: 'Azure: OS disk used burst IO credits percentage' type: DEPENDENT key: azure.vm.os.disk.used.burst.iops delay: '0' history: 7d value_type: FLOAT units: '%' description: 'The percentage of the OS disk burst I/O credits used so far.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskUsedBurstIOCreditsPercentage.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 7645519a786b42908f1ec693128899c2 name: 'Azure: OS disk write rate' type: DEPENDENT key: azure.vm.os.disk.write.bps delay: '0' history: 7d value_type: FLOAT units: Bps description: 'Bytes per second written to a single disk during the monitoring period for OS disk.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskWriteBytessec.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 1e9392bc0c934e7d93f743c86e36e23e name: 'Azure: OS disk write operations/sec' type: DEPENDENT key: azure.vm.os.disk.write.ops delay: '0' history: 7d value_type: FLOAT units: '!iops' description: 'The write IOPS from a single disk during the monitoring period for OS disk.' preprocessing: - type: JSONPATH parameters: - $.metrics.OSDiskWriteOperationsSec.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: d6fcff826cfa486d945f33708be2f630 name: 'Azure: Premium data disk cache read hit' type: DEPENDENT key: azure.vm.premium.data.disk.cache.read.hit delay: '0' history: 7d units: '%' description: 'Premium data disk cache read hit.' preprocessing: - type: JSONPATH parameters: - $.metrics.PremiumDataDiskCacheReadHit.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 288853ee5d08442fa43f8df1dfcc7823 name: 'Azure: Premium data disk cache read miss' type: DEPENDENT key: azure.vm.premium.data.disk.cache.read.miss delay: '0' history: 7d units: '%' description: 'Premium data disk cache read miss.' preprocessing: - type: JSONPATH parameters: - $.metrics.PremiumDataDiskCacheReadMiss.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 66b629ae3d7e4abeaf0282414c91876f name: 'Azure: Premium OS disk cache read hit' type: DEPENDENT key: azure.vm.premium.os.disk.cache.read.hit delay: '0' history: 7d units: '%' description: 'Premium OS disk cache read hit.' preprocessing: - type: JSONPATH parameters: - $.metrics.PremiumOSDiskCacheReadHit.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 3927f34d5d0649d7ac29703f64054dbf name: 'Azure: Premium OS disk cache read miss' type: DEPENDENT key: azure.vm.premium.os.disk.cache.read.miss delay: '0' history: 7d units: '%' description: 'Premium OS disk cache read miss.' preprocessing: - type: JSONPATH parameters: - $.metrics.PremiumOSDiskCacheReadMiss.average error_handler: DISCARD_VALUE master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: d6e85395e34b4288988a5287d287f182 name: 'Azure: VM uncached bandwidth consumed percentage' type: DEPENDENT key: azure.vm.uncached.bandwidth.consumed.percentage delay: '0' history: 7d units: '%' description: 'The percentage of the uncached disk bandwidth consumed by the VM.' preprocessing: - type: JSONPATH parameters: - $.metrics.VMUncachedBandwidthConsumedPercentage.average master_item: key: azure.vm.data.get tags: - tag: component value: storage - uuid: 124203560922429bb32b76c45f24b2b9 name: 'Azure: VM uncached IOPS consumed percentage' type: DEPENDENT key: azure.vm.uncached.iops.consumed.percentage delay: '0' history: 7d units: '%' description: 'The percentage of the uncached disk IOPS consumed by the VM.' preprocessing: - type: JSONPATH parameters: - $.metrics.VMUncachedIOPSConsumedPercentage.average master_item: key: azure.vm.data.get tags: - tag: component value: storage tags: - tag: class value: software - tag: target value: azure macros: - macro: '{$AZURE.APP.ID}' description: 'The App ID of Microsoft Azure.' - macro: '{$AZURE.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$AZURE.PASSWORD}' type: SECRET_TEXT description: 'Microsoft Azure password.' - macro: '{$AZURE.PROXY}' description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.' - macro: '{$AZURE.RESOURCE.ID}' description: 'Microsoft Azure Virtual Machine ID.' - macro: '{$AZURE.SUBSCRIPTION.ID}' description: 'Microsoft Azure subscription ID.' - macro: '{$AZURE.TENANT.ID}' description: 'Microsoft Azure tenant ID.' - macro: '{$AZURE.VM.CPU.UTIL.CRIT}' value: '90' description: 'The critical threshold of CPU utilization, expressed in %.' valuemaps: - uuid: 38c8ce1516704ec2a6f1ea9686db56b9 name: 'Azure resource health state' mappings: - value: '0' newvalue: Available - value: '1' newvalue: Degraded - value: '2' newvalue: Unavailable - value: '3' newvalue: Unknown graphs: - uuid: 781dd83ed494465bbf2c16efbc753a51 name: 'Azure: Data disk read/write bytes' graph_items: - color: 199C0D item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.data.disk.read.bps - sortorder: '1' color: F63100 item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.data.disk.write.bps - uuid: 7d198b2f6186498ab39ece80f3f7b30e name: 'Azure: Data disk read/write rates' graph_items: - color: 199C0D item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.data.disk.read.ops - sortorder: '1' color: F63100 item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.data.disk.write.ops - uuid: a2d0eb282276486896067f8a30f8ea51 name: 'Azure: Disk read/write bytes' graph_items: - color: 199C0D item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.disk.read.bytes - sortorder: '1' color: F63100 item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.disk.write.bytes - uuid: 58a8c6942314408ab0e88b15d53f67e5 name: 'Azure: Disk read/write rates' graph_items: - color: 199C0D item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.disk.read.ops - sortorder: '1' color: F63100 item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.disk.write.ops - uuid: b427ad3dbb8d4f8caf1edfb0cab04733 name: 'Azure: Flows' graph_items: - color: 199C0D item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.flows.inbound - sortorder: '1' color: F63100 item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.flows.outbound - sortorder: '2' color: 00611C item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.flows.inbound.max - sortorder: '3' color: F7941D item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.flows.outbound.max - uuid: f0f37dc8840a45ba8e8cb62f5fea6804 name: 'Azure: Network traffic' graph_items: - color: 199C0D item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.network.in.total - sortorder: '1' color: F63100 item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.network.out.total - uuid: 41bd1642704c4d3fbe4fb34c8c389320 name: 'Azure: OS disk read/write bytes' graph_items: - color: 199C0D item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.os.disk.read.bps - sortorder: '1' color: F63100 item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.os.disk.write.bps - uuid: df77fe1de4ae46f98744ff73ed427b3b name: 'Azure: OS disk read/write rates' graph_items: - color: 199C0D item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.os.disk.read.ops - sortorder: '1' color: F63100 item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.os.disk.write.ops - uuid: 3051d683b44b48ee94030465254abc7f name: 'Azure: Premium data disk cache read' graph_items: - color: 199C0D item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.premium.data.disk.cache.read.hit - sortorder: '1' color: F63100 item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.premium.data.disk.cache.read.miss - uuid: d727dc11deaa46b282892552c9b03752 name: 'Azure: Premium OS disk cache read' graph_items: - color: 199C0D item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.premium.os.disk.cache.read.hit - sortorder: '1' color: F63100 item: host: 'Azure Virtual Machine by HTTP' key: azure.vm.premium.os.disk.cache.read.miss - uuid: 3b278de1b81a4be7acc865568962c323 name: 'Azure Microsoft SQL: Connections' graph_items: - color: 199C0D item: host: 'Azure Microsoft SQL Database by HTTP' key: azure.db.mssql.connections.successful - sortorder: '1' color: F63100 item: host: 'Azure Microsoft SQL Database by HTTP' key: azure.db.mssql.connections.failed.system - sortorder: '2' color: 00611C item: host: 'Azure Microsoft SQL Database by HTTP' key: azure.db.mssql.firewall.blocked - uuid: 62a9a5e1fb044a52a0b534bd4eeea914 name: 'Azure Microsoft SQL: Connections' graph_items: - color: 199C0D item: host: 'Azure Microsoft SQL Serverless Database by HTTP' key: azure.db.mssql.connections.successful - sortorder: '1' color: F63100 item: host: 'Azure Microsoft SQL Serverless Database by HTTP' key: azure.db.mssql.connections.failed.system - sortorder: '2' color: 00611C item: host: 'Azure Microsoft SQL Serverless Database by HTTP' key: azure.db.mssql.firewall.blocked - uuid: fe250a5f509d45babea9fcd12accbcac name: 'Azure Microsoft SQL: CPU usage' graph_items: - color: 199C0D item: host: 'Azure Microsoft SQL Database by HTTP' key: azure.db.mssql.cpu.limit - sortorder: '1' color: F63100 item: host: 'Azure Microsoft SQL Database by HTTP' key: azure.db.mssql.cpu.used - uuid: 083d307db8954fc59e8e5cfccefc16c1 name: 'Azure Microsoft SQL: CPU usage' graph_items: - color: 199C0D item: host: 'Azure Microsoft SQL Serverless Database by HTTP' key: azure.db.mssql.cpu.limit - sortorder: '1' color: F63100 item: host: 'Azure Microsoft SQL Serverless Database by HTTP' key: azure.db.mssql.cpu.used - uuid: ec5714017c744484be8c264d24a0e694 name: 'Azure Microsoft SQL: Storage utilization' graph_items: - color: 199C0D item: host: 'Azure Microsoft SQL Database by HTTP' key: azure.db.mssql.storage.used - sortorder: '1' color: F63100 item: host: 'Azure Microsoft SQL Database by HTTP' key: azure.db.mssql.storage.allocated - uuid: f541b6591683433aba4b3e58a8ad1e5c name: 'Azure Microsoft SQL: Storage utilization' graph_items: - color: 199C0D item: host: 'Azure Microsoft SQL Serverless Database by HTTP' key: azure.db.mssql.storage.used - sortorder: '1' color: F63100 item: host: 'Azure Microsoft SQL Serverless Database by HTTP' key: azure.db.mssql.storage.allocated - uuid: 89256a1eba8c49d2b7469a68ff050ac5 name: 'Azure MongoDB: Latency' graph_items: - color: 199C0D item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.server.side.latency.gateway - sortorder: '1' color: F63100 item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.server.side.latency - sortorder: '2' color: 00611C item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.server.side.latency.direct - sortorder: '3' color: F7941D item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.replication.latency - uuid: a1225fc27d334c5bbb5043e3d468bf02 name: 'Azure MongoDB: Requests' graph_items: - color: 199C0D item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.total.requests - sortorder: '1' color: F63100 item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.total.request.units - sortorder: '2' color: 00611C item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.metadata.requests - sortorder: '3' color: F7941D item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.mongo.requests - sortorder: '4' color: FC6EA3 item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.mongo.requests.charge - uuid: 07168aaf3abb42f6b61746cc6e2d2910 name: 'Azure MongoDB: Usage' graph_items: - color: 199C0D item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.data.usage - sortorder: '1' color: F63100 item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.index.usage - sortorder: '2' color: 00611C item: host: 'Azure Cosmos DB for MongoDB by HTTP' key: azure.cosmosdb.document.quota - uuid: 750ae48e6ef749c19a06f4bbe716f92f name: 'Azure MySQL: Connections' graph_items: - color: 199C0D item: host: 'Azure MySQL Flexible Server by HTTP' key: azure.db.mysql.connections.active - sortorder: '1' color: F63100 item: host: 'Azure MySQL Flexible Server by HTTP' key: azure.db.mysql.connections.total - sortorder: '2' color: 00611C item: host: 'Azure MySQL Flexible Server by HTTP' key: azure.db.mysql.connections.aborted - uuid: 360a24b56be74cf48df3135008437824 name: 'Azure MySQL: Connections' graph_items: - color: 199C0D item: host: 'Azure MySQL Single Server by HTTP' key: azure.db.mysql.connections.active - sortorder: '1' color: F63100 item: host: 'Azure MySQL Single Server by HTTP' key: azure.db.mysql.connections.failed - uuid: f929f47602734f82a79f22a5f4446f61 name: 'Azure MySQL: Network traffic' graph_items: - color: 199C0D item: host: 'Azure MySQL Flexible Server by HTTP' key: azure.db.mysql.network.egress - sortorder: '1' color: F63100 item: host: 'Azure MySQL Flexible Server by HTTP' key: azure.db.mysql.network.ingress - uuid: dc6840162405481ebc1c3c98fdfcaef1 name: 'Azure MySQL: Network traffic' graph_items: - color: 199C0D item: host: 'Azure MySQL Single Server by HTTP' key: azure.db.mysql.network.egress - sortorder: '1' color: F63100 item: host: 'Azure MySQL Single Server by HTTP' key: azure.db.mysql.network.ingress - uuid: 3fcf43fd338e4902874d940fc0bec8b9 name: 'Azure MySQL: Server log storage utilization' graph_items: - color: 199C0D item: host: 'Azure MySQL Single Server by HTTP' key: azure.db.mysql.storage.server.log.used - sortorder: '1' color: F63100 item: host: 'Azure MySQL Single Server by HTTP' key: azure.db.mysql.storage.server.log.limit - uuid: 4210e6b4ed8744589dce88217e961a56 name: 'Azure MySQL: Storage utilization' graph_items: - color: 199C0D item: host: 'Azure MySQL Flexible Server by HTTP' key: azure.db.mysql.storage.used - sortorder: '1' color: F63100 item: host: 'Azure MySQL Flexible Server by HTTP' key: azure.db.mysql.storage.limit - uuid: bdc178e6faaa4850badc0c60c7c80d40 name: 'Azure MySQL: Storage utilization' graph_items: - color: 199C0D item: host: 'Azure MySQL Single Server by HTTP' key: azure.db.mysql.storage.used - sortorder: '1' color: F63100 item: host: 'Azure MySQL Single Server by HTTP' key: azure.db.mysql.storage.limit - uuid: 2b60e8b1fd7c43f4ac61812e43c0e1ca name: 'Azure PostgreSQL: Connections' graph_items: - color: 199C0D item: host: 'Azure PostgreSQL Flexible Server by HTTP' key: azure.db.pgsql.connections.active - sortorder: '1' color: F63100 item: host: 'Azure PostgreSQL Flexible Server by HTTP' key: azure.db.pgsql.connections.succeeded - sortorder: '2' color: 00611C item: host: 'Azure PostgreSQL Flexible Server by HTTP' key: azure.db.pgsql.connections.failed - uuid: c76cf8ec6a584af6be815ec4a9257a8c name: 'Azure PostgreSQL: Connections' graph_items: - color: 199C0D item: host: 'Azure PostgreSQL Single Server by HTTP' key: azure.db.pgsql.connections.active - sortorder: '1' color: F63100 item: host: 'Azure PostgreSQL Single Server by HTTP' key: azure.db.pgsql.connections.failed - uuid: a4679d243b574bea84397c980723c68b name: 'Azure PostgreSQL: Network traffic' graph_items: - color: 199C0D item: host: 'Azure PostgreSQL Flexible Server by HTTP' key: azure.db.pgsql.network.egress - sortorder: '1' color: F63100 item: host: 'Azure PostgreSQL Flexible Server by HTTP' key: azure.db.pgsql.network.ingress - uuid: 8bc17d843775414ea971e640e1fe5ec0 name: 'Azure PostgreSQL: Network traffic' graph_items: - color: 199C0D item: host: 'Azure PostgreSQL Single Server by HTTP' key: azure.db.pgsql.network.egress - sortorder: '1' color: F63100 item: host: 'Azure PostgreSQL Single Server by HTTP' key: azure.db.pgsql.network.ingress - uuid: 9e750a5a462b4429ac5a36a72bd60c66 name: 'Azure PostgreSQL: Server log storage utilization' graph_items: - color: 199C0D item: host: 'Azure PostgreSQL Single Server by HTTP' key: azure.db.pgsql.storage.server.log.used - sortorder: '1' color: F63100 item: host: 'Azure PostgreSQL Single Server by HTTP' key: azure.db.pgsql.storage.server.log.limit - uuid: 5fa13cfbdd784475818fae06ff94f879 name: 'Azure PostgreSQL: Storage utilization' graph_items: - color: 199C0D item: host: 'Azure PostgreSQL Flexible Server by HTTP' key: azure.db.pgsql.storage.used - sortorder: '1' color: F63100 item: host: 'Azure PostgreSQL Flexible Server by HTTP' key: azure.db.pgsql.storage.free - uuid: 9ecd071a77364c4486fa5f63125cd985 name: 'Azure PostgreSQL: Storage utilization' graph_items: - color: 199C0D item: host: 'Azure PostgreSQL Single Server by HTTP' key: azure.db.pgsql.storage.used - sortorder: '1' color: F63100 item: host: 'Azure PostgreSQL Single Server by HTTP' key: azure.db.pgsql.storage.limit