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: 4e1e9372a5fe4297936210bc4fc4b1c0 template: 'GCP by HTTP' name: 'GCP by HTTP' description: | Discover GCP Compute Engine/Cloud SQL Instances and Compute Engine project quota metrics. Don't forget to read the README.md for the correct setup of the template. 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: b003e61fbede488a957b6c866ffaa9ba name: 'GCP: Authorization errors check' type: DEPENDENT key: gcp.auth.err.check 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 master_item: key: gcp.authorization tags: - tag: component value: status triggers: - uuid: 74c0e16244314ab4a920e32faca50444 expression: 'length(last(/GCP by HTTP/gcp.auth.err.check)) > 0' name: 'GCP: Authorization has failed' priority: AVERAGE description: | GCP: Authorization has failed. Check the authorization parameters and GCP API availability from a network segment, where Zabbix-server/proxy is located. tags: - tag: scope value: availability - uuid: 5cc3faa82f404b38b513958f323f3d7d name: 'GCP: Authorization' type: SCRIPT key: gcp.authorization delay: '{$GCP.AUTH.FREQUENCY}' history: '0' trends: '0' value_type: TEXT params: | var auth_url = 'https://oauth2.googleapis.com/token', issued = Math.floor(new Date().getTime() / 1000), expires = issued + 3600, endpoint = 'https://www.googleapis.com/auth/', scopes = ['cloud-platform.read-only', 'monitoring', 'compute.readonly', 'sqlservice.admin'], scope = scopes.map(function (path) { return endpoint + path; }).join(' '); function base64url(source) { encodedSource = btoa(source); encodedSource = encodedSource.replace(/=+$/, ''); encodedSource = encodedSource.replace(/\+/g, '-'); encodedSource = encodedSource.replace(/\//g, '_'); return encodedSource; } function fromHex(hex) { var utf8array = []; if (hex.length % 2) throw 'Invalid length of a hex string!'; for (var i = 0; i < hex.length; i += 2) { utf8array.push(parseInt(hex.substr(i, 2), 16)); } return new Uint8Array(utf8array); } function encodeJWT(headers, payload, secret) { unsignedToken = base64url(JSON.stringify(headers)) + '.' + base64url(JSON.stringify(payload)); jwt = unsignedToken + '.' + base64url(fromHex(sign('sha256', secret, unsignedToken))); return jwt; } function exchangeJwtForAccessToken(signed_jwt) { var request = new HttpRequest(), params = { grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer', assertion: signed_jwt }, response = request.post(auth_url, JSON.stringify(params)); Zabbix.log(4, '[ GCP API ] [ ' + auth_url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } if (typeof response.access_token !== 'undefined') { return response.access_token; } else { throw 'No access token in the JWT exchange request.'; } } function checkParams(params) { ['pkey_id', 'private_key', 'email'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); return params; } var script_params = checkParams(JSON.parse(value)), headers = { alg: 'RS256', kid: script_params.pkey_id, typ: 'JWT' }, payload = { iss: script_params.email, sub: script_params.email, aud: auth_url, iat: issued, exp: expires, scope: scope }; try { jwt = encodeJWT(headers, payload, script_params.private_key); token = exchangeJwtForAccessToken(jwt); return token; } catch (err) { return JSON.stringify({ error: err }); } description: | Google Cloud Platform REST authorization with service account authentication parameters and temporary-generated RSA-based JWT-token usage. The necessary scopes are pre-defined. Returns a signed authorization token with 1 hour lifetime; it is required only once, and is used for all the dependent script items. Check the template documentation for the details. timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: pkey_id value: '{$GCP.PRIVATE.KEY.ID}' - name: email value: '{$GCP.CLIENT.EMAIL}' - name: private_key value: '{$GCP.PRIVATE.KEY}' tags: - tag: component value: raw - uuid: 3ac5c859692140c0b686e772efa05032 name: 'GCP Cloud SQL: Instances get' type: DEPENDENT key: gcp.cloudsql.instances.get delay: '0' history: '0' trends: '0' value_type: TEXT description: 'GCP Cloud SQL: Instances get.' preprocessing: - type: JAVASCRIPT parameters: - | var token = value; function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function getFieldBool(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') { return false; } data = data[step]; } return true; } function getHttpData(url, token) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.get(url); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; var project = '{$GCP.PROJECT.ID}'; if (!project || project === '{' + '$GCP.PROJECT.ID}') { throw 'Error. Set the \{$GCP.PROJECT.ID\} macro value.'; } var inst_raw = getHttpData('https://sqladmin.googleapis.com/sql/v1beta4/projects/' + project + '/instances', token); if (Object.keys(inst_raw).length === 0) { return '[]'; } return JSON.stringify(getField(inst_raw, 'items').map(function (sql_inst) { obj = { name: getField(sql_inst, 'name'), token: value, zone: getField(sql_inst, 'settings.locationPreference.zone'), inst_type: getField(sql_inst, 'instanceType'), tier: getField(sql_inst, 'settings.tier'), project_id: getField(sql_inst, 'project'), db_type: getField(sql_inst, 'databaseInstalledVersion') }; obj.high_availability = (sql_inst.failoverReplica) ? true : false; if (obj.db_type.match(/SQLSERVER*/)) { var mssql_audit = getField(sql_inst, 'settings.sqlServerAuditConfig'); obj.audited = (mssql_audit.bucket) ? true : false; } if (obj.inst_type === 'READ_REPLICA_INSTANCE') { obj.master = getField(sql_inst, 'masterInstanceName'); } if (Array.isArray(sql_inst.ipAddresses)) { var int_addresses = sql_inst.ipAddresses.filter(function (addr) { return addr.type === 'PRIVATE'; }); var ext_addresses = sql_inst.ipAddresses.filter(function (addr) { return addr.type === 'PRIMARY'; }); obj.ip = getFieldBool(int_addresses,'0.ipAddress') ? int_addresses[0].ipAddress : '0.0.0.0'; obj.ext_ip = getFieldBool(ext_addresses, '0.ipAddress') ? ext_addresses[0].ipAddress : '0.0.0.0'; } else { obj.ip = '0.0.0.0'; obj.ext_ip = '0.0.0.0'; } return obj; })); master_item: key: gcp.authorization tags: - tag: component value: raw - uuid: b926ba1901c5413396c1c071e6e76072 name: 'GCP Cloud SQL: Instances total' type: DEPENDENT key: gcp.cloudsql.instances.total delay: '0' history: 7d trends: 90d description: 'GCP Cloud SQL instances total count.' preprocessing: - type: JSONPATH parameters: - '$.[*].length()' master_item: key: gcp.cloudsql.instances.get tags: - tag: component value: environment - uuid: 58329c9a5b124b1990c94f15266e6edf name: 'GCP Compute Engine: Container-Optimized instances count' type: DEPENDENT key: gcp.gce.instances.cos_count delay: '0' history: 7d trends: 90d description: 'GCP Compute Engine: count of instances with Container-Optimized OS used.' preprocessing: - type: JSONPATH parameters: - '$[?(@.i_type == ''container-optimized'')].length()' error_handler: DISCARD_VALUE master_item: key: gcp.gce.instances.get tags: - tag: component value: environment - uuid: 461e72fb7e104261831455ae3cc87358 name: 'GCP Compute Engine: Instances get' type: DEPENDENT key: gcp.gce.instances.get delay: '0' history: '0' trends: '0' value_type: TEXT description: 'Get GCP Compute Engine instances.' preprocessing: - type: JAVASCRIPT parameters: - | var token = value; function checkMacro(macro) { if (!macro || macro.match(/^\{\$.*\}$/)) { throw 'The GCP project id is not defined. Please, set the value for the \{$GCP.PROJECT.ID\} macro.'; } return macro; } function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function getFieldBool(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') { return false; } data = data[step]; } return true; } function getHttpData(url, token) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.get(url); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; var project = '{$GCP.PROJECT.ID}'; if (!project || project === '{' + '$GCP.PROJECT.ID}') { throw 'Error. Set the \{$GCP.PROJECT.ID\} macro value.'; } var result = getHttpData('https://compute.googleapis.com/compute/v1/projects/' + project + '/aggregated/instances', token), vms_raw = getField(result, 'items'), keys = Object.keys(vms_raw), arr = []; for (var i in keys) { if (typeof vms_raw[keys[i]].instances !== 'undefined') { var vm_prop = vms_raw[keys[i]].instances.map(function setProp(inst) { obj = { id: getField(inst, 'id'), name: getField(inst, 'name'), token: value, zone: keys[i].replace(/zones\//, ''), m_type: getField(inst, 'machineType').replace(/.*machineTypes\//g, ''), state: getField(inst, 'status'), project_id: '{$GCP.PROJECT.ID}', ip: getField(inst, 'networkInterfaces.0.networkIP'), integrity: getField(inst, 'shieldedInstanceConfig.enableIntegrityMonitoring') }; obj.ext_ip = getFieldBool(inst, 'networkInterfaces.0.accessConfigs.0.natIP') ? inst.networkInterfaces[0].accessConfigs[0].natIP : '0.0.0.0'; obj.i_type = getFieldBool(inst, 'labels.container-vm') ? 'container-optimized' : 'regular'; return obj; }); arr = arr.concat(vm_prop); } } return JSON.stringify(arr); master_item: key: gcp.authorization tags: - tag: component value: raw - uuid: 80687b35246b45ffa1be9d171f686e94 name: 'GCP Cloud SQL MSSQL: Instances count' type: DEPENDENT key: gcp.gce.instances.mssql_count delay: '0' history: 7d trends: 90d description: 'GCP Cloud SQL MSSQL instances count.' preprocessing: - type: JSONPATH parameters: - '$[?(@.db_type =~ ''SQLSERVER'')].length()' error_handler: DISCARD_VALUE master_item: key: gcp.cloudsql.instances.get tags: - tag: component value: environment - uuid: 8ec94dff7a3b47998242d97a18cf0821 name: 'GCP Cloud SQL MySQL: Instances count' type: DEPENDENT key: gcp.gce.instances.mysql_count delay: '0' history: 7d trends: 90d description: 'GCP Cloud SQL MySQL instances count.' preprocessing: - type: JSONPATH parameters: - '$[?(@.db_type =~ ''MYSQL'')].length()' error_handler: DISCARD_VALUE master_item: key: gcp.cloudsql.instances.get tags: - tag: component value: environment - uuid: de284dd30b2d4ecb9f7d0cf3ca80a094 name: 'GCP Cloud SQL PostgreSQL: Instances count' type: DEPENDENT key: gcp.gce.instances.pgsql_count delay: '0' history: 7d trends: 90d description: 'GCP Cloud SQL PostgreSQL instances count.' preprocessing: - type: JSONPATH parameters: - '$[?(@.db_type =~ ''POSTGRES'')].length()' error_handler: DISCARD_VALUE master_item: key: gcp.cloudsql.instances.get tags: - tag: component value: environment - uuid: a936207f9d914955b2e2140e953f22f2 name: 'GCP Compute Engine: Regular instances count' type: DEPENDENT key: gcp.gce.instances.regular_count delay: '0' history: 7d trends: 90d description: 'GCP Compute Engine: Regular instances count.' preprocessing: - type: JSONPATH parameters: - '$[?(@.i_type == ''regular'')].length()' error_handler: DISCARD_VALUE master_item: key: gcp.gce.instances.get tags: - tag: component value: environment - uuid: 46eaeccd1f43466caadd44440da88568 name: 'GCP Compute Engine: Instances total' type: DEPENDENT key: gcp.gce.instances.total delay: '0' history: 7d trends: 90d description: 'GCP Compute Engine instances total count.' preprocessing: - type: JSONPATH parameters: - '$.[*].length()' error_handler: DISCARD_VALUE master_item: key: gcp.gce.instances.get tags: - tag: component value: environment - uuid: c4f17331815345bcb0ac6ea98413b2b5 name: 'GCP Compute Engine: Project quotas get' type: DEPENDENT key: gcp.gce.quotas.get delay: '0' history: '0' trends: '0' value_type: TEXT description: 'GCP Compute Engine resource quotas available for the particular project.' preprocessing: - type: JAVASCRIPT parameters: - | var token = value; function checkMacro(macro) { if (!macro || macro.match(/^\{\$.*\}$/)) { throw 'The GCP project id is not defined. Please, set the value for the \{$GCP.PROJECT.ID\} macro.'; } return macro; } function getField(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 "' + path + '" is not present in data received.' } data = data[step]; } return data; } function getHttpData(url, token) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.get(url); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } if (typeof response.quotas !== 'undefined') { return response; } else { throw 'No quotas array in API response'; } }; var project = checkMacro('{$GCP.PROJECT.ID}'), qts_raw = getHttpData('https://www.googleapis.com/compute/v1/projects/' + project, token), qts_lst = getField(qts_raw, 'quotas').map(function (qt) { obj = { metric: getField(qt, 'metric'), limit: getField(qt, 'limit'), usage: getField(qt, 'usage'), p_used: (qt.usage / qt.limit) * 100 }; return obj; }); return JSON.stringify(qts_lst); master_item: key: gcp.authorization tags: - tag: component value: raw discovery_rules: - uuid: f210e8e38c194c65b30e74610ec2b86f name: 'GCP Cloud SQL: MSSQL instances discovery' type: DEPENDENT key: gcp.cloudsql.mssql.inst.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#CLOUD_SQL.INSTANCE.DB.TYPE}' value: 'SQLSERVER.*' formulaid: A - macro: '{#CLOUD_SQL.INSTANCE.NAME}' value: '{$GCP.MSSQL.INST.NAME.MATCHES}' formulaid: B - macro: '{#CLOUD_SQL.INSTANCE.NAME}' value: '{$GCP.MSSQL.INST.NAME.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: C - macro: '{#CLOUD_SQL.INSTANCE.ZONE}' value: '{$GCP.MSSQL.ZONE.MATCHES}' formulaid: F - macro: '{#CLOUD_SQL.INSTANCE.ZONE}' value: '{$GCP.MSSQL.ZONE.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: G - macro: '{#CLOUD_SQL.INSTANCE.TYPE}' value: '{$GCP.MSSQL.INST.TYPE.MATCHES}' formulaid: D - macro: '{#CLOUD_SQL.INSTANCE.TYPE}' value: '{$GCP.MSSQL.INST.TYPE.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: E lifetime: 7d description: 'GCP Cloud SQL: MSSQL instances discovery.' host_prototypes: - uuid: edc6ab9314ed410b8a3cf6bfedff51ab host: '{#GCP.PROJECT.ID}-{#CLOUD_SQL.INSTANCE.NAME}' name: '{#CLOUD_SQL.INSTANCE.NAME}' group_links: - group: name: Databases templates: - name: 'GCP Cloud SQL MSSQL by HTTP' macros: - macro: '{$CLOUD_SQL.HIGH.AVAILABILITY}' value: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}' description: 'GCP Cloud SQL instance high availability definition. Required for metrics filtration.' - macro: '{$CLOUD_SQL.MSSQL.AUDITED}' value: '{#MSSQL.AUDITED}' description: 'GCP Cloud SQL MSSQL audit enabled definition. Required for metrics filtration.' - macro: '{$GCP.AUTH.TOKEN}' value: '{#GCP.AUTH.TOKEN}' description: 'Google Cloud Platform authorization token.' - macro: '{$GCP.PROJECT.ID}' value: '{#GCP.PROJECT.ID}' description: 'GCP Project Id.' tags: - tag: audit value: '{#MSSQL.AUDITED}' - tag: db-version value: '{#CLOUD_SQL.INSTANCE.DB.TYPE}' - tag: high-availability value: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}' - tag: instance-type value: '{#CLOUD_SQL.INSTANCE.TYPE}' - tag: project value: '{#GCP.PROJECT.ID}' - tag: service value: cloudsql - tag: service value: gcp - tag: service value: mssql - tag: tier value: '{#CLOUD_SQL.INSTANCE.TIER}' - tag: zone value: '{#CLOUD_SQL.INSTANCE.ZONE}' custom_interfaces: 'YES' interfaces: - default: 'NO' ip: '{#CLOUD_SQL.INSTANCE.EXT.IP}' dns: external.ip - ip: '{#CLOUD_SQL.INSTANCE.IP}' dns: internal.ip master_item: key: gcp.cloudsql.instances.get lld_macro_paths: - lld_macro: '{#MSSQL.AUDITED}' path: $.audited - lld_macro: '{#CLOUD_SQL.INSTANCE.NAME}' path: $.name - lld_macro: '{#CLOUD_SQL.INSTANCE.ZONE}' path: $.zone - lld_macro: '{#CLOUD_SQL.INSTANCE.IP}' path: $.ip - lld_macro: '{#CLOUD_SQL.INSTANCE.EXT.IP}' path: $.ext_ip - lld_macro: '{#CLOUD_SQL.INSTANCE.TYPE}' path: $.inst_type - lld_macro: '{#CLOUD_SQL.INSTANCE.DB.TYPE}' path: $.db_type - lld_macro: '{#CLOUD_SQL.INSTANCE.TIER}' path: $.tier - lld_macro: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}' path: $.high_availability - lld_macro: '{#CLOUD_SQL.MASTER}' path: $.master - lld_macro: '{#GCP.AUTH.TOKEN}' path: $.token - lld_macro: '{#GCP.PROJECT.ID}' path: $.project_id preprocessing: - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h overrides: - name: 'MSSQL replica' step: '1' filter: conditions: - macro: '{#CLOUD_SQL.INSTANCE.TYPE}' value: READ_REPLICA_INSTANCE formulaid: A - macro: '{#CLOUD_SQL.MASTER}' operator: EXISTS formulaid: B operations: - operationobject: HOST_PROTOTYPE operator: REGEXP tags: - tag: master_instance value: '{#CLOUD_SQL.MASTER}' templates: - name: 'GCP Cloud SQL MSSQL Replica by HTTP' - uuid: 3fdd2543936a4587b1bfb5dabb30c1f6 name: 'GCP Cloud SQL: MySQL instances discovery' type: DEPENDENT key: gcp.cloudsql.mysql.inst.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#CLOUD_SQL.INSTANCE.DB.TYPE}' value: 'MYSQL.*' formulaid: A - macro: '{#CLOUD_SQL.INSTANCE.NAME}' value: '{$GCP.MYSQL.INST.NAME.MATCHES}' formulaid: B - macro: '{#CLOUD_SQL.INSTANCE.NAME}' value: '{$GCP.MYSQL.INST.NAME.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: C - macro: '{#CLOUD_SQL.INSTANCE.ZONE}' value: '{$GCP.MYSQL.ZONE.MATCHES}' formulaid: F - macro: '{#CLOUD_SQL.INSTANCE.ZONE}' value: '{$GCP.MYSQL.ZONE.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: G - macro: '{#CLOUD_SQL.INSTANCE.TYPE}' value: '{$GCP.MYSQL.INST.TYPE.MATCHES}' formulaid: D - macro: '{#CLOUD_SQL.INSTANCE.TYPE}' value: '{$GCP.MYSQL.INST.TYPE.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: E lifetime: 7d description: 'GCP Cloud SQL: MySQL instances discovery.' host_prototypes: - uuid: 8b2556b881b14b86a98f90a447ae9734 host: '{#GCP.PROJECT.ID}-{#CLOUD_SQL.INSTANCE.NAME}' name: '{#CLOUD_SQL.INSTANCE.NAME}' group_links: - group: name: Databases templates: - name: 'GCP Cloud SQL MySQL by HTTP' macros: - macro: '{$CLOUD_SQL.HIGH.AVAILABILITY}' value: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}' description: 'GCP Cloud SQL instance high availability definition.' - macro: '{$GCP.AUTH.TOKEN}' value: '{#GCP.AUTH.TOKEN}' description: 'Google Cloud Platform authorization token.' - macro: '{$GCP.PROJECT.ID}' value: '{#GCP.PROJECT.ID}' description: 'GCP Project Id.' tags: - tag: db-version value: '{#CLOUD_SQL.INSTANCE.DB.TYPE}' - tag: high-availability value: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}' - tag: instance-type value: '{#CLOUD_SQL.INSTANCE.TYPE}' - tag: project value: '{#GCP.PROJECT.ID}' - tag: service value: cloudsql - tag: service value: gcp - tag: service value: mysql - tag: tier value: '{#CLOUD_SQL.INSTANCE.TIER}' - tag: zone value: '{#CLOUD_SQL.INSTANCE.ZONE}' custom_interfaces: 'YES' interfaces: - default: 'NO' ip: '{#CLOUD_SQL.INSTANCE.EXT.IP}' dns: external.ip - ip: '{#CLOUD_SQL.INSTANCE.IP}' dns: internal.ip master_item: key: gcp.cloudsql.instances.get lld_macro_paths: - lld_macro: '{#CLOUD_SQL.INSTANCE.NAME}' path: $.name - lld_macro: '{#CLOUD_SQL.INSTANCE.ZONE}' path: $.zone - lld_macro: '{#CLOUD_SQL.INSTANCE.IP}' path: $.ip - lld_macro: '{#CLOUD_SQL.INSTANCE.EXT.IP}' path: $.ext_ip - lld_macro: '{#CLOUD_SQL.INSTANCE.TYPE}' path: $.inst_type - lld_macro: '{#CLOUD_SQL.INSTANCE.DB.TYPE}' path: $.db_type - lld_macro: '{#CLOUD_SQL.INSTANCE.TIER}' path: $.tier - lld_macro: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}' path: $.high_availability - lld_macro: '{#CLOUD_SQL.MASTER}' path: $.master - lld_macro: '{#GCP.AUTH.TOKEN}' path: $.token - lld_macro: '{#GCP.PROJECT.ID}' path: $.project_id preprocessing: - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h overrides: - name: 'MySQL replica' step: '1' filter: conditions: - macro: '{#CLOUD_SQL.INSTANCE.TYPE}' value: READ_REPLICA_INSTANCE formulaid: A - macro: '{#CLOUD_SQL.MASTER}' operator: EXISTS formulaid: B operations: - operationobject: HOST_PROTOTYPE operator: REGEXP tags: - tag: master_instance value: '{#CLOUD_SQL.MASTER}' templates: - name: 'GCP Cloud SQL MySQL Replica by HTTP' - uuid: 606ba15087894f268f4b626590b7a9d0 name: 'GCP Cloud SQL: PostgreSQL instances discovery' type: DEPENDENT key: gcp.cloudsql.pgsql.inst.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#CLOUD_SQL.INSTANCE.DB.TYPE}' value: 'POSTGRES.*' formulaid: A - macro: '{#CLOUD_SQL.INSTANCE.NAME}' value: '{$GCP.PGSQL.INST.NAME.MATCHES}' formulaid: B - macro: '{#CLOUD_SQL.INSTANCE.NAME}' value: '{$GCP.PGSQL.INST.NAME.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: C - macro: '{#CLOUD_SQL.INSTANCE.ZONE}' value: '{$GCP.PGSQL.ZONE.MATCHES}' formulaid: F - macro: '{#CLOUD_SQL.INSTANCE.ZONE}' value: '{$GCP.PGSQL.ZONE.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: G - macro: '{#CLOUD_SQL.INSTANCE.TYPE}' value: '{$GCP.PGSQL.INST.TYPE.MATCHES}' formulaid: D - macro: '{#CLOUD_SQL.INSTANCE.TYPE}' value: '{$GCP.PGSQL.TYPE.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: E lifetime: 7d description: 'GCP Cloud SQL: PostgreSQL instances discovery.' host_prototypes: - uuid: 0fbbc550fda448d39aad6d0710f28b6a host: '{#GCP.PROJECT.ID}-{#CLOUD_SQL.INSTANCE.NAME}' name: '{#CLOUD_SQL.INSTANCE.NAME}' group_links: - group: name: Databases templates: - name: 'GCP Cloud SQL PostgreSQL by HTTP' macros: - macro: '{$CLOUD_SQL.HIGH.AVAILABILITY}' value: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}' description: 'GCP Cloud SQL instance high availability definition.' - macro: '{$GCP.AUTH.TOKEN}' value: '{#GCP.AUTH.TOKEN}' description: 'Google Cloud Platform authorization token.' - macro: '{$GCP.PROJECT.ID}' value: '{#GCP.PROJECT.ID}' description: 'GCP project id.' tags: - tag: db-version value: '{#CLOUD_SQL.INSTANCE.DB.TYPE}' - tag: high-availability value: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}' - tag: instance-type value: '{#CLOUD_SQL.INSTANCE.TYPE}' - tag: project value: '{#GCP.PROJECT.ID}' - tag: service value: cloudsql - tag: service value: gcp - tag: service value: pgsql - tag: tier value: '{#CLOUD_SQL.INSTANCE.TIER}' - tag: zone value: '{#CLOUD_SQL.INSTANCE.ZONE}' custom_interfaces: 'YES' interfaces: - default: 'NO' ip: '{#CLOUD_SQL.INSTANCE.EXT.IP}' dns: external.ip - ip: '{#CLOUD_SQL.INSTANCE.IP}' dns: internal.ip master_item: key: gcp.cloudsql.instances.get lld_macro_paths: - lld_macro: '{#CLOUD_SQL.INSTANCE.NAME}' path: $.name - lld_macro: '{#CLOUD_SQL.INSTANCE.ZONE}' path: $.zone - lld_macro: '{#CLOUD_SQL.INSTANCE.IP}' path: $.ip - lld_macro: '{#CLOUD_SQL.INSTANCE.EXT.IP}' path: $.ext_ip - lld_macro: '{#CLOUD_SQL.INSTANCE.TYPE}' path: $.inst_type - lld_macro: '{#CLOUD_SQL.INSTANCE.DB.TYPE}' path: $.db_type - lld_macro: '{#CLOUD_SQL.INSTANCE.TIER}' path: $.tier - lld_macro: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}' path: $.high_availability - lld_macro: '{#CLOUD_SQL.MASTER}' path: $.master - lld_macro: '{#GCP.AUTH.TOKEN}' path: $.token - lld_macro: '{#GCP.PROJECT.ID}' path: $.project_id preprocessing: - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h overrides: - name: 'PostgreSQL replica' step: '1' filter: conditions: - macro: '{#CLOUD_SQL.INSTANCE.TYPE}' value: READ_REPLICA_INSTANCE formulaid: A - macro: '{#CLOUD_SQL.MASTER}' operator: EXISTS formulaid: B operations: - operationobject: HOST_PROTOTYPE operator: REGEXP tags: - tag: master_instance value: '{#CLOUD_SQL.MASTER}' templates: - name: 'GCP Cloud SQL PostgreSQL Replica by HTTP' - uuid: 7d0226eccc5644c89fff10f7ece1c8b4 name: 'GCP Compute Engine: Instances discovery' type: DEPENDENT key: gcp.gce.inst.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#GCE.INSTANCE.NAME}' value: '{$GCP.GCE.INST.NAME.MATCHES}' formulaid: A - macro: '{#GCE.INSTANCE.NAME}' value: '{$GCP.GCE.INST.NAME.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B - macro: '{#GCE.INSTANCE.ZONE}' value: '{$GCP.GCE.ZONE.MATCHES}' formulaid: C - macro: '{#GCE.INSTANCE.ZONE}' value: '{$GCP.GCE.ZONE.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: D lifetime: 7d description: 'GCP Compute Engine: Instances discovery.' host_prototypes: - uuid: cb22d82a12814afb8ba833c649d575c4 host: '{#GCE.INSTANCE.ID}' name: '{#GCE.INSTANCE.NAME}' group_links: - group: name: 'Virtual machines' templates: - name: 'GCP Compute Engine Instance by HTTP' macros: - macro: '{$GCE.INSTANCE.ZONE}' value: '{#GCE.INSTANCE.ZONE}' description: 'Instance zone (location).' - macro: '{$GCE.INTEGRITY.STATE}' value: '{#GCE.INTEGRITY.STATE}' description: 'Instance integrity metrics status.' - macro: '{$GCE.MACHINE.TYPE}' value: '{#GCE.MACHINE.TYPE}' description: 'Instance machine type.' - macro: '{$GCP.AUTH.TOKEN}' value: '{#GCP.AUTH.TOKEN}' description: 'Google Cloud Platform authorization token.' - macro: '{$GCP.PROJECT.ID}' value: '{#GCP.PROJECT.ID}' description: 'GCP project id.' tags: - tag: instance-type value: '{#GCE.INSTANCE.TYPE}' - tag: machine-type value: '{#GCE.MACHINE.TYPE}' - tag: project value: '{#GCP.PROJECT.ID}' - tag: service value: gce - tag: service value: gcp - tag: zone value: '{#GCE.INSTANCE.ZONE}' custom_interfaces: 'YES' interfaces: - default: 'NO' ip: '{#GCE.INSTANCE.EXT.IP}' dns: external.ip - ip: '{#GCE.INSTANCE.IP}' dns: internal.ip master_item: key: gcp.gce.instances.get lld_macro_paths: - lld_macro: '{#GCE.INSTANCE.ID}' path: $.id - lld_macro: '{#GCE.INSTANCE.NAME}' path: $.name - lld_macro: '{#GCE.INSTANCE.ZONE}' path: $.zone - lld_macro: '{#GCE.MACHINE.TYPE}' path: $.m_type - lld_macro: '{#GCE.INSTANCE.TYPE}' path: $.i_type - lld_macro: '{#GCE.INTEGRITY.STATE}' path: $.integrity - lld_macro: '{#GCE.INSTANCE.IP}' path: $.ip - lld_macro: '{#GCE.INSTANCE.EXT.IP}' path: $.ext_ip - lld_macro: '{#GCP.AUTH.TOKEN}' path: $.token - lld_macro: '{#GCP.PROJECT.ID}' path: $.project_id preprocessing: - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h - uuid: 1a0dc88bc40d45af90ca761dcb611bf0 name: 'GCP Compute Engine: Project quotas discovery' type: DEPENDENT key: gcp.gce.quotas.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#GCE.QUOTA.NAME}' value: '{$GCP.GCE.QUOTA.MATCHES}' formulaid: A - macro: '{#GCE.QUOTA.NAME}' value: '{$GCP.GCE.QUOTA.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B lifetime: 7d description: 'GCP Compute Engine: Quotas discovery.' item_prototypes: - uuid: 1e9a772b9a89497ba695079fc480bd0a name: 'GCP Compute Engine: Quota [{#GCE.QUOTA.NAME}]: Limit' type: DEPENDENT key: 'gcp.gce.quota.limit[{#GCE.QUOTA.NAME}]' delay: '0' history: 7d trends: 90d description: 'GCP Compute Engine: The current limit value for [{#GCE.QUOTA.NAME}] quota.' preprocessing: - type: JSONPATH parameters: - $.limit master_item: key: 'gcp.gce.quota.single.raw[{#GCE.QUOTA.NAME}]' tags: - tag: component value: quota - tag: quota value: '{#GCE.QUOTA.NAME}' trigger_prototypes: - uuid: ac0d8842f0934dcead56d41f328c10d2 expression: 'change(/GCP by HTTP/gcp.gce.quota.limit[{#GCE.QUOTA.NAME}]) <> 0' name: 'GCP Compute Engine: Quota [{#GCE.QUOTA.NAME}] limit has been changed' opdata: 'Current limit: {ITEM.VALUE}' priority: INFO description: 'GCP Compute Engine: The limit for the `{#GCE.QUOTA.NAME}` quota has been changed.' manual_close: 'YES' tags: - tag: scope value: capacity - uuid: 6bb3700f7c5c4c51b6a435f5c7d0e315 name: 'GCP Compute Engine: Quota [{#GCE.QUOTA.NAME}]: Percentage used' type: DEPENDENT key: 'gcp.gce.quota.pused[{#GCE.QUOTA.NAME}]' delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: 'GCP Compute Engine: Percentage usage for [{#GCE.QUOTA.NAME}] quota.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' - type: JSONPATH parameters: - $.p_used master_item: key: 'gcp.gce.quota.single.raw[{#GCE.QUOTA.NAME}]' tags: - tag: component value: quota - tag: quota value: '{#GCE.QUOTA.NAME}' trigger_prototypes: - uuid: ecce0204198d4edda88f84d4f25ba75c expression: 'last(/GCP by HTTP/gcp.gce.quota.pused[{#GCE.QUOTA.NAME}]) >= {$GCP.GCE.QUOTA.PUSED.MIN.WARN:"{#GCE.QUOTA.NAME}"}' name: 'GCP Compute Engine: Quota [{#GCE.QUOTA.NAME}] usage is close to reaching the limit' opdata: 'Usage: {#GCE.QUOTA.USAGE} | Limit: {#GCE.QUOTA.LIMIT} | Percentage {ITEM.VALUE}%' priority: WARNING description: 'GCP Compute Engine: The usage percentage for the `{#GCE.QUOTA.NAME}` quota is close to reaching the limit.' manual_close: 'YES' dependencies: - name: 'GCP Compute Engine: Quota [{#GCE.QUOTA.NAME}] usage is critically close to reaching the limit' expression: 'last(/GCP by HTTP/gcp.gce.quota.pused[{#GCE.QUOTA.NAME}]) >= {$GCP.GCE.QUOTA.PUSED.MIN.CRIT:"{#GCE.QUOTA.NAME}"}' tags: - tag: scope value: capacity - uuid: bc894d5e4f694e428fcb32babe87c204 expression: 'last(/GCP by HTTP/gcp.gce.quota.pused[{#GCE.QUOTA.NAME}]) >= {$GCP.GCE.QUOTA.PUSED.MIN.CRIT:"{#GCE.QUOTA.NAME}"}' name: 'GCP Compute Engine: Quota [{#GCE.QUOTA.NAME}] usage is critically close to reaching the limit' opdata: 'Usage: {#GCE.QUOTA.USAGE} | Limit: {#GCE.QUOTA.LIMIT} | Percentage {ITEM.VALUE}%' priority: AVERAGE description: 'GCP Compute Engine: The usage percentage for the `{#GCE.QUOTA.NAME}` quota is critically close to reaching the limit.' manual_close: 'YES' tags: - tag: scope value: capacity - tag: scope value: notice - uuid: a439501636fd49f0aaf3902300d943b8 name: 'GCP Compute Engine: Quota [{#GCE.QUOTA.NAME}]: Raw data' type: DEPENDENT key: 'gcp.gce.quota.single.raw[{#GCE.QUOTA.NAME}]' delay: '0' history: '0' trends: '0' value_type: TEXT description: 'GCP Compute Engine: Get metrics for [{#GCE.QUOTA.NAME}] quota.' preprocessing: - type: JSONPATH parameters: - '$[?(@.metric == "{#GCE.QUOTA.NAME}")].first()' master_item: key: gcp.gce.quotas.get tags: - tag: component value: raw - tag: quota value: '{#GCE.QUOTA.NAME}' - uuid: 936c66cc59a240858f67922dcba2cbec name: 'GCP Compute Engine: Quota [{#GCE.QUOTA.NAME}]: Usage' type: DEPENDENT key: 'gcp.gce.quota.usage[{#GCE.QUOTA.NAME}]' delay: '0' history: 7d trends: 90d description: 'GCP Compute Engine: The current usage value for [{#GCE.QUOTA.NAME}] quota.' preprocessing: - type: JSONPATH parameters: - $.usage master_item: key: 'gcp.gce.quota.single.raw[{#GCE.QUOTA.NAME}]' tags: - tag: component value: quota - tag: quota value: '{#GCE.QUOTA.NAME}' graph_prototypes: - uuid: 45de6eacbed84c82bfe9175fcf84e0c3 name: 'GCP Compute Engine: Quota [{#GCE.QUOTA.NAME}]: Usage' graph_items: - drawtype: GRADIENT_LINE color: 199C0D item: host: 'GCP by HTTP' key: 'gcp.gce.quota.usage[{#GCE.QUOTA.NAME}]' - sortorder: '1' drawtype: BOLD_LINE color: F63100 calc_fnc: MIN item: host: 'GCP by HTTP' key: 'gcp.gce.quota.limit[{#GCE.QUOTA.NAME}]' master_item: key: gcp.gce.quotas.get lld_macro_paths: - lld_macro: '{#GCE.QUOTA.NAME}' path: $.metric - lld_macro: '{#GCE.QUOTA.USAGE}' path: $.usage - lld_macro: '{#GCE.QUOTA.LIMIT}' path: $.limit preprocessing: - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h tags: - tag: class value: cloud - tag: target value: gcp - tag: target value: google-cloud-platform macros: - macro: '{$GCP.AUTH.FREQUENCY}' value: 45m description: | The update interval for the GCP Authorization item, which also equals to the access token regeneration request frequency. Check the template documentation notes carefully for more details. - macro: '{$GCP.CLIENT.EMAIL}' description: 'Service account client e-mail.' - macro: '{$GCP.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$GCP.GCE.INST.NAME.MATCHES}' value: '.*' description: 'The filter to include GCP Compute Engine instances by namespace.' - macro: '{$GCP.GCE.INST.NAME.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Compute Engine instances by namespace.' - macro: '{$GCP.GCE.QUOTA.MATCHES}' value: '.*' description: 'The filter to include GCP Compute Engine project quotas by namespace.' - macro: '{$GCP.GCE.QUOTA.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Compute Engine project quotas by namespace.' - macro: '{$GCP.GCE.QUOTA.PUSED.MIN.CRIT}' value: '95' description: 'GCP Compute Engine project quota critical quota utilization threshold.' - macro: '{$GCP.GCE.QUOTA.PUSED.MIN.WARN}' value: '80' description: 'GCP Compute Engine project quota warning utilization threshold.' - macro: '{$GCP.GCE.ZONE.MATCHES}' value: '.*' description: 'The filter to include GCP Compute Engine instances by zone.' - macro: '{$GCP.GCE.ZONE.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Compute Engine instances by zone.' - macro: '{$GCP.MSSQL.INST.NAME.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL MSSQL instances by namespace.' - macro: '{$GCP.MSSQL.INST.NAME.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Cloud SQL MSSQL instances by namespace.' - macro: '{$GCP.MSSQL.INST.TYPE.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL MSSQL instances by type (standalone/replica).' - macro: '{$GCP.MSSQL.INST.TYPE.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: | The filter to exclude GCP Cloud SQL MSSQL instances by type (standalone/replica). Set a macro value 'CLOUD_SQL_INSTANCE' to exclude standalone Instances or 'READ_REPLICA_INSTANCE' to exclude read-only Replicas. - macro: '{$GCP.MSSQL.ZONE.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL MSSQL instances by zone.' - macro: '{$GCP.MSSQL.ZONE.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Cloud SQL MSSQL instances by zone.' - macro: '{$GCP.MYSQL.INST.NAME.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL MySQL instances by namespace.' - macro: '{$GCP.MYSQL.INST.NAME.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Cloud SQL MySQL instances by namespace.' - macro: '{$GCP.MYSQL.INST.TYPE.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL MySQL instances by type (standalone/replica).' - macro: '{$GCP.MYSQL.INST.TYPE.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: | The filter to exclude GCP Cloud SQL MySQL instances by type (standalone/replica). Set a macro value 'CLOUD_SQL_INSTANCE' to exclude standalone Instances or 'READ_REPLICA_INSTANCE' to exclude read-only Replicas. - macro: '{$GCP.MYSQL.ZONE.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL MySQL instances by zone.' - macro: '{$GCP.MYSQL.ZONE.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Cloud SQL MySQL instances by zone.' - macro: '{$GCP.PGSQL.INST.NAME.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL PostgreSQL instances by namespace.' - macro: '{$GCP.PGSQL.INST.NAME.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Cloud SQL PostgreSQL instances by namespace.' - macro: '{$GCP.PGSQL.INST.TYPE.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL PostgreSQL instances by type (standalone/replica).' - macro: '{$GCP.PGSQL.INST.TYPE.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: | The filter to exclude GCP Cloud SQL PostgreSQL instances by type (standalone/replica). Set a macro value 'CLOUD_SQL_INSTANCE' to exclude standalone Instances or 'READ_REPLICA_INSTANCE' to exclude read-only Replicas. - macro: '{$GCP.PGSQL.ZONE.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL PostgreSQL instances by zone.' - macro: '{$GCP.PGSQL.ZONE.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Cloud SQL PostgreSQL instances by zone.' - macro: '{$GCP.PRIVATE.KEY}' type: SECRET_TEXT description: 'Service account private key data.' - macro: '{$GCP.PRIVATE.KEY.ID}' type: SECRET_TEXT description: 'Service account private key id.' - macro: '{$GCP.PROJECT.ID}' description: 'GCP project ID.' dashboards: - uuid: 71df4601171e471ea74a291242028394 name: 'Project resources' pages: - name: 'Project resources' widgets: - type: graphprototype 'y': '10' width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: GRAPH_PROTOTYPE name: graphid value: host: 'GCP by HTTP' name: 'GCP Compute Engine: Quota [{#GCE.QUOTA.NAME}]: Usage' - type: graphprototype x: '12' 'y': '10' width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: INTEGER name: source_type value: '3' - type: ITEM_PROTOTYPE name: itemid value: host: 'GCP by HTTP' key: 'gcp.gce.quota.pused[{#GCE.QUOTA.NAME}]' - type: item name: 'Cloud SQL MSSQL' x: '18' 'y': '5' width: '6' height: '5' 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: ITEM name: itemid value: host: 'GCP by HTTP' key: gcp.gce.instances.mssql_count - type: item name: 'Cloud SQL MySQL' x: '6' 'y': '5' width: '6' height: '5' 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: ITEM name: itemid value: host: 'GCP by HTTP' key: gcp.gce.instances.mysql_count - type: item name: 'Cloud SQL PostgreSQL' x: '12' 'y': '5' width: '6' height: '5' 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: ITEM name: itemid value: host: 'GCP by HTTP' key: gcp.gce.instances.pgsql_count - type: item name: 'Cloud SQL total' 'y': '5' width: '6' height: '5' 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: ITEM name: itemid value: host: 'GCP by HTTP' key: gcp.cloudsql.instances.total - type: item name: 'GCE COS instances' x: '16' width: '8' height: '5' 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: ITEM name: itemid value: host: 'GCP by HTTP' key: gcp.gce.instances.cos_count - type: item name: 'GCE instances total' width: '8' height: '5' 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: ITEM name: itemid value: host: 'GCP by HTTP' key: gcp.gce.instances.total - type: item name: 'GCE regular instances' x: '8' width: '8' height: '5' 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: ITEM name: itemid value: host: 'GCP by HTTP' key: gcp.gce.instances.regular_count - uuid: 507d70db18554a4e9ee5e09bb29bc85f template: 'GCP Cloud SQL MSSQL by HTTP' name: 'GCP Cloud SQL MSSQL by HTTP' description: | Get GCP Cloud SQL MSSQL instances monitoring with script item usage to perform HTTP requests to Google Cloud Platform Monitoring API. This template will be automatically connected to discovered entities with all their required parameters pre-defined. 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: a8d79cab89864c03a7614bd59f734942 name: 'GCP Cloud SQL MSSQL: Audits size' type: DEPENDENT key: gcp.cloudsql.mssql.audits_size delay: '0' history: 7d trends: 90d units: B description: | Tracks the size in bytes of stored SQLServer audit files on an instance. Empty value if there are no audits enabled. preprocessing: - type: JSONPATH parameters: - $.base_audits_size error_handler: DISCARD_VALUE master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: security - uuid: 3026bc61670c496a942a94ab50b614df name: 'GCP Cloud SQL MSSQL: Audits successfully uploaded' type: DEPENDENT key: gcp.cloudsql.mssql.audits_upload_count delay: '0' history: 7d trends: 90d description: | Tracks the size in bytes of stored SQLServer audit files on an instance. Empty value if there are no audits enabled. preprocessing: - type: JSONPATH parameters: - $.mssql_success error_handler: DISCARD_VALUE master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: security - uuid: d512c542f5514681acbb11431a0a6f5a name: 'GCP Cloud SQL MSSQL: Connection resets' type: DEPENDENT key: gcp.cloudsql.mssql.conn.connection_reset_count delay: '0' history: 7d trends: 90d description: 'Total number of login operations started from the connection pool since the last restart of SQL Server service.' preprocessing: - type: JSONPATH parameters: - $.mssql_connection_reset_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: connections - tag: component value: network - uuid: 300a6cb53fb44176bdf99eba86a976bd name: 'GCP Cloud SQL MSSQL: Login attempts' type: DEPENDENT key: gcp.cloudsql.mssql.conn.login_attempt_count delay: '0' history: 7d trends: 90d description: | Total number of login attempts since the last restart of SQL Server service. This does not include pooled connections. preprocessing: - type: JSONPATH parameters: - $.mssql_login_attempt_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: connections - tag: component value: network - uuid: 622c237ed12e44c7b2415676ec23bd2d name: 'GCP Cloud SQL MSSQL: Logouts' type: DEPENDENT key: gcp.cloudsql.mssql.conn.logout_count delay: '0' history: 7d trends: 90d description: 'Total number of logout operations since the last restart of SQL Server service.' preprocessing: - type: JSONPATH parameters: - $.mssql_logout_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: connections - tag: component value: network - uuid: 6ba672cbf4c242eb8e6fb80eba4c90d8 name: 'GCP Cloud SQL MSSQL: Processes blocked' type: DEPENDENT key: gcp.cloudsql.mssql.conn.processes_blocked delay: '0' history: 7d trends: 90d description: 'Current number of blocked processes.' preprocessing: - type: JSONPATH parameters: - $.mssql_processes_blocked master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: connections - tag: component value: network - uuid: 38de8ae591854d5fbc4ee4946a2e189a name: 'GCP Cloud SQL MSSQL: Reserved CPU cores' type: DEPENDENT key: gcp.cloudsql.mssql.cpu.reserved_cores delay: '0' history: 7d trends: 90d value_type: FLOAT description: 'Number of cores reserved for the database.' preprocessing: - type: JSONPATH parameters: - $.base_reserved_cores master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: cpu - uuid: cd1f9ab326ac4694b3aeea6cb4ec56ab name: 'GCP Cloud SQL MSSQL: CPU usage time' type: DEPENDENT key: gcp.cloudsql.mssql.cpu.usage_time delay: '0' history: 7d trends: 90d value_type: FLOAT units: s description: 'Cumulative CPU usage time in seconds.' preprocessing: - type: JSONPATH parameters: - $.base_usage_time master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: cpu - uuid: 42d51e38b96f472996eff1e0f9d7b931 name: 'GCP Cloud SQL MSSQL: CPU utilization' type: DEPENDENT key: gcp.cloudsql.mssql.cpu.utilization delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: 'Current CPU utilization represented as a percentage of the reserved CPU that is currently in use.' preprocessing: - type: JSONPATH parameters: - $.base_utilization - type: MULTIPLIER parameters: - '100' master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: cpu triggers: - uuid: b8280e45fea8470e9f36f7f08e4a77e1 expression: 'min(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.cpu.utilization,5m) >= {$CLOUD_SQL.MSSQL.CPU.UTIL.MAX}' name: 'GCP Cloud SQL MSSQL: High CPU utilization' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: AVERAGE description: 'The CPU utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: ecdd1774ef744bcb93e8e4094e29772f name: 'GCP Cloud SQL MSSQL: Databases get' type: SCRIPT key: gcp.cloudsql.mssql.db.get delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'cloudsql.googleapis.com/database/sqlserver/transactions/', arr = [], base_paths = [ 'log_bytes_flushed_count', 'transaction_count' ]; function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function checkParams(params) { ['project_id', 'time_window', 'database_id', 'token'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } return params; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; var params = checkParams(JSON.parse(value)), time_window = params.time_window, project = params.project_id, filter = ' | within ' + time_window + " | filter database_id = '" + params.database_id + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query'; var raw = getHttpData(url, params.token, { query: '{' + base_paths.map(function (path) { return base_path + path; }).join(';') + '}' + j_filter }), metrics = getField(raw, 'timeSeriesDescriptor.pointDescriptors'), time_series = getField(raw, 'timeSeriesData'); for (t in time_series) { data = { database: getField(time_series[t], 'labelValues.3.stringValue'), metrics: {} }; for (i in metrics) { re = /(^t_\d+\.value(_|\.))/g; data['metrics'][getField(metrics[i], 'key').replace(re, '')] = getField(time_series[t], 'pointData.0.values.' + i + '.int64Value'); } arr.push(data); } return JSON.stringify(arr); description: 'MSSQL databases data in raw format.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: database_id value: '{$GCP.PROJECT.ID}:{HOST.NAME}' - name: token value: '{$GCP.AUTH.TOKEN}' tags: - tag: component value: raw - uuid: 9806c645a10a4e1d8fbb39eb1d3ac993 name: 'GCP Cloud SQL MSSQL: DB engine state' type: HTTP_AGENT key: gcp.cloudsql.mssql.db.state history: 7d description: 'GCP Cloud SQL MSSQL DB Engine State.' valuemap: name: 'Database availability' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' - type: JSONPATH parameters: - '$.timeSeriesData[0].pointData[0].values[0].int64Value' error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 10m timeout: '{$GCP.DATA.TIMEOUT}' url: 'https://monitoring.googleapis.com/v3/projects/{$GCP.PROJECT.ID}/timeSeries:query' posts: '{"query":"cloudsql.googleapis.com/database/up | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}' status_codes: '' headers: - name: Content-Type value: application/json - name: Authorization value: 'Bearer {$GCP.AUTH.TOKEN}' request_method: POST tags: - tag: component value: status triggers: - uuid: b3c7b8e2e38a42fe9d2ae3c84b637e53 expression: | last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.db.state)=0 name: 'GCP Cloud SQL MSSQL: Database engine is down' priority: AVERAGE description: | Database engine is down. If an instance experiences unplanned (non-maintenance) downtime, the instance state will still be RUNNING, but the database engine state metric will report 0. dependencies: - name: 'GCP Cloud SQL MSSQL: Failed to get the instance state' expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 10' - name: 'GCP Cloud SQL MSSQL: Instance is in failed state' expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 5' - name: 'GCP Cloud SQL MSSQL: Instance is in maintenance' expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 4' - name: 'GCP Cloud SQL MSSQL: Instance is in suspended state' expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 1' - name: 'GCP Cloud SQL MSSQL: Instance is in unknown state' expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 6' - name: 'GCP Cloud SQL MSSQL: Instance is stopped by the owner' expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 2' tags: - tag: scope value: availability - uuid: cd6cf3870a514ff59bd1f40987764642 name: 'GCP Cloud SQL MSSQL: Disk bytes used' type: DEPENDENT key: gcp.cloudsql.mssql.disk.bytes_used delay: '0' history: 7d trends: 90d units: B description: 'Data utilization in bytes.' preprocessing: - type: JSONPATH parameters: - $.mssql_bytes_used master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: storage - uuid: 86bdbf20c9b4466c9ea00e26cb0f0652 name: 'GCP Cloud SQL MSSQL: Disk size' type: DEPENDENT key: gcp.cloudsql.mssql.disk.quota delay: '0' history: 7d trends: 90d units: B description: 'Maximum data disk size in bytes.' preprocessing: - type: JSONPATH parameters: - $.mssql_quota master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: storage - uuid: 400a7318203f40928ebf0b023da65848 name: 'GCP Cloud SQL MSSQL: Disk read I/O' type: DEPENDENT key: gcp.cloudsql.mssql.disk.read_ops_count delay: '0' history: 7d trends: 90d description: 'Delta count of data disk read I/O operations.' preprocessing: - type: JSONPATH parameters: - $.base_read_ops_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: storage - uuid: 1d0c09441d9d4333b7be32c3d69bad47 name: 'GCP Cloud SQL MSSQL: Disk utilization' type: DEPENDENT key: gcp.cloudsql.mssql.disk.utilization delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: | The fraction of the disk quota that is currently in use. Shown as percentage. preprocessing: - type: JSONPATH parameters: - $.mssql_utilization - type: MULTIPLIER parameters: - '100' master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: storage triggers: - uuid: 2cbc7e3008f24197963df4ea920ab5a8 expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.disk.utilization) >= {$CLOUD_SQL.MSSQL.DISK.UTIL.CRIT}' name: 'GCP Cloud SQL MSSQL: Disk space is critically low' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: AVERAGE description: 'Critical utilization of the disk space.' tags: - tag: scope value: capacity - uuid: 2569abbb94ca4df38cdd4f9d5a5df9fc expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.disk.utilization) >= {$CLOUD_SQL.MSSQL.DISK.UTIL.WARN}' name: 'GCP Cloud SQL MSSQL: Disk space is low' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: WARNING description: 'High utilization of the storage space.' dependencies: - name: 'GCP Cloud SQL MSSQL: Disk space is critically low' expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.disk.utilization) >= {$CLOUD_SQL.MSSQL.DISK.UTIL.CRIT}' tags: - tag: scope value: capacity - uuid: 819078cd99af46368eb33d76dadf4861 name: 'GCP Cloud SQL MSSQL: Disk write I/O' type: DEPENDENT key: gcp.cloudsql.mssql.disk.write_ops_count delay: '0' history: 7d trends: 90d description: 'Delta count of data disk write I/O operations.' preprocessing: - type: JSONPATH parameters: - $.base_write_ops_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: storage - uuid: 556c96cf1bf342f99c69dc47813f221e name: 'GCP Cloud SQL MSSQL: Instance state' type: HTTP_AGENT key: gcp.cloudsql.mssql.inst.state history: 7d description: 'GCP Cloud SQL MSSQL Current instance state.' valuemap: name: 'Instance state' preprocessing: - type: JSONPATH parameters: - '$.timeSeriesData[0].pointData[0].values[0].stringValue' error_handler: CUSTOM_VALUE error_handler_params: '10' - type: JAVASCRIPT parameters: - | const idx = [ 'RUNNING', 'SUSPENDED', 'RUNNABLE', 'PENDING_CREATE', 'MAINTENANCE', 'FAILED', 'UNKNOWN_STATE' ].indexOf(value); return idx !== -1 ? idx : 10; - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 10m timeout: '{$GCP.DATA.TIMEOUT}' url: 'https://monitoring.googleapis.com/v3/projects/{$GCP.PROJECT.ID}/timeSeries:query' posts: '{"query":"cloudsql.googleapis.com/database/state | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}' status_codes: '' headers: - name: Content-Type value: application/json - name: Authorization value: 'Bearer {$GCP.AUTH.TOKEN}' request_method: POST tags: - tag: component value: status triggers: - uuid: dff9067ad7de4ab1a4f83c9d482e6b71 expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 10' name: 'GCP Cloud SQL MSSQL: Failed to get the instance state' priority: AVERAGE description: | Failed to get the instance state. Check access permissions to GCP API or service account. tags: - tag: scope value: availability - uuid: 3d7e054340e94b09b085e508b9b76841 expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 5' name: 'GCP Cloud SQL MSSQL: Instance is in failed state' priority: AVERAGE description: | The instance creation failed, or an operation left the instance in an own bad state. tags: - tag: scope value: availability - uuid: dd395fd3003f4fce847cd72309cdf7ec expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 4' name: 'GCP Cloud SQL MSSQL: Instance is in maintenance' priority: INFO description: 'The instance is down for maintenance.' tags: - tag: scope value: availability - uuid: 3c080bba511e44aab1139b66f00451ee expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 1' name: 'GCP Cloud SQL MSSQL: Instance is in suspended state' priority: WARNING description: | The instance is in suspended state. It is not available, for example, due to problems with billing. tags: - tag: scope value: availability - uuid: 378b4d62582d416db7cb7fd6ed099ac9 expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 6' name: 'GCP Cloud SQL MSSQL: Instance is in unknown state' priority: AVERAGE description: | The state of the instance is unknown. tags: - tag: scope value: availability - uuid: 72ecba08f6424573a36b816da9695b89 expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 2' name: 'GCP Cloud SQL MSSQL: Instance is stopped by the owner' priority: INFO description: | The instance has been stopped by the owner. It is not currently running, but it's ready to be restarted. tags: - tag: scope value: availability - uuid: a29584de7ab142309f0bb6f57b52af85 name: 'GCP Cloud SQL MSSQL: Buffer cache hit ratio' type: DEPENDENT key: gcp.cloudsql.mssql.memory.buffer_cache_hit_ratio delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: | Current percentage of pages found in the buffer cache without having to read from disk. The ratio is the total number of cache hits divided by the total number of cache lookups. preprocessing: - type: JSONPATH parameters: - $.mssql_buffer_cache_hit_ratio master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory - uuid: f8460bbac21c44a98a31a49daf7f692f name: 'GCP Cloud SQL MSSQL: Checkpoint pages' type: DEPENDENT key: gcp.cloudsql.mssql.memory.checkpoint_page_count delay: '0' history: 7d trends: 90d description: 'Total number of pages flushed to disk by a checkpoint or other operation that requires all dirty pages to be flushed.' preprocessing: - type: JSONPATH parameters: - $.mssql_checkpoint_page_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory - uuid: cc6a5230c7a2447e8038cdbe52105da4 name: 'GCP Cloud SQL MSSQL: Free list stalls' type: DEPENDENT key: gcp.cloudsql.mssql.memory.free_list_stall_count delay: '0' history: 7d trends: 90d description: 'Total number of requests that had to wait for a free page.' preprocessing: - type: JSONPATH parameters: - $.mssql_free_list_stall_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory - uuid: d86e328fc5fa4c3d938a4959075299b5 name: 'GCP Cloud SQL MSSQL: Lazy writes' type: DEPENDENT key: gcp.cloudsql.mssql.memory.lazy_write_count delay: '0' history: 7d trends: 90d description: | Total number of buffers written by the buffer manager's lazy writer. The lazy writer is a system process that flushes out batches of dirty, aged buffers (buffers that contain changes that must be written back to disk before the buffer can be reused for a different page) and makes them available to user processes. preprocessing: - type: JSONPATH parameters: - $.mssql_lazy_write_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory - uuid: 2fa0744221884109951ce62d3bb9aaaf name: 'GCP Cloud SQL MSSQL: Memory grants pending' type: DEPENDENT key: gcp.cloudsql.mssql.memory.memory_grants_pending delay: '0' history: 7d trends: 90d description: 'Current number of processes waiting for a workspace memory grant.' preprocessing: - type: JSONPATH parameters: - $.mssql_memory_grants_pending master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory - uuid: 3dcad151d0c04f8eb0e8e81c00de23c8 name: 'GCP Cloud SQL MSSQL: Page life expectancy' type: DEPENDENT key: gcp.cloudsql.mssql.memory.page_life_expectancy delay: '0' history: 7d trends: 90d units: s description: 'Current number of seconds a page will stay in the buffer pool without references.' preprocessing: - type: JSONPATH parameters: - $.mssql_page_life_expectancy master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory - uuid: 4d87a50d490348afbaf751857beb5b61 name: 'GCP Cloud SQL MSSQL: Read page operations' type: DEPENDENT key: gcp.cloudsql.mssql.memory.page_ops.read delay: '0' history: 7d trends: 90d description: | Total number of physical database page reads. This metric counts physical page reads across all databases. preprocessing: - type: JSONPATH parameters: - $.mssql_read master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory - uuid: 41654bd730b744acbc0ea6de07c992f3 name: 'GCP Cloud SQL MSSQL: Write age operations' type: DEPENDENT key: gcp.cloudsql.mssql.memory.page_ops.write delay: '0' history: 7d trends: 90d description: | Total number of physical database page writes. This metric counts physical page writes across all databases. preprocessing: - type: JSONPATH parameters: - $.mssql_write master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory - uuid: db943300803847718c52d0d33988d81e name: 'GCP Cloud SQL MSSQL: Memory size' type: DEPENDENT key: gcp.cloudsql.mssql.memory.quota delay: '0' history: 7d trends: 90d units: B description: 'Maximum RAM size in bytes.' preprocessing: - type: JSONPATH parameters: - $.base_quota master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory - uuid: 21b075a5f95d4c93888b7a0766fdcea5 name: 'GCP Cloud SQL MSSQL: Memory used by DB engine' type: DEPENDENT key: gcp.cloudsql.mssql.memory.total_usage delay: '0' history: 7d trends: 90d units: B description: | Total RAM usage in bytes. This metric reports the RAM usage of the database process, including the buffer/cache. preprocessing: - type: JSONPATH parameters: - $.base_total_usage master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory - uuid: 05d1ff573371416dad9ee028247b1cf3 name: 'GCP Cloud SQL MSSQL: Memory usage' type: DEPENDENT key: gcp.cloudsql.mssql.memory.usage delay: '0' history: 7d trends: 90d units: B description: | The RAM usage in bytes. This metric reports the RAM usage of the server, excluding the buffer/cache. preprocessing: - type: JSONPATH parameters: - $.base_usage master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory - uuid: 4e11944fb7624ffdb02b5d1bb5bedf7a name: 'GCP Cloud SQL MSSQL: Memory utilization' type: DEPENDENT key: gcp.cloudsql.mssql.memory.utilization delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: | The fraction of the memory quota that is currently in use. Shown as percentage. preprocessing: - type: JSONPATH parameters: - $.base_ram_pused master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: memory triggers: - uuid: c5003533f3524b8b868a0c2f86b1fa9b expression: 'min(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.memory.utilization,5m) >= {$CLOUD_SQL.MSSQL.RAM.UTIL.MAX}' name: 'GCP Cloud SQL MSSQL: High memory utilization' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: HIGH description: 'RAM utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: 6de08b07cecc47a88bde22de5d1b4e5a name: 'GCP Cloud SQL MSSQL: Metrics get' type: SCRIPT key: gcp.cloudsql.mssql.metrics.get delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'cloudsql.googleapis.com/database/', mssql_path = 'cloudsql.googleapis.com/database/sqlserver/', obj = {}, base_paths = [ 'cpu/reserved_cores', 'cpu/usage_time', 'cpu/utilization', 'disk/read_ops_count', 'disk/write_ops_count', 'memory/quota', 'memory/total_usage', 'memory/usage', 'network/connections', 'network/received_bytes_count', 'network/sent_bytes_count | map ignore [destination]' ].map(function (path) { return base_path + path; }), mssql_paths = [ 'connections/connection_reset_count', 'connections/login_attempt_count', 'connections/logout_count', 'connections/processes_blocked', 'memory/buffer_cache_hit_ratio', 'memory/checkpoint_page_count', 'memory/lazy_write_count', 'memory/memory_grants_pending', 'memory/page_life_expectancy', 'memory/free_list_stall_count', 'transactions/batch_request_count', 'transactions/forwarded_record_count', 'transactions/full_scan_count', 'transactions/page_split_count', 'transactions/probe_scan_count', 'transactions/sql_compilation_count', 'transactions/sql_recompilation_count' ].map(function (path) { return mssql_path + path; }).concat( ['disk/bytes_used', 'disk/utilization', 'disk/quota'].map(function (path) { return base_path + path; })), value_types = ['int64Value', 'doubleValue', 'stringValue', 'boolValue']; function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function getFieldBool(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') { return false; } data = data[step]; } return true; } function checkParams(params) { ['project_id', 'time_window', 'database_id', 'token', 'audited'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } if (params.audited !== 'true' && params.audited !== 'false') { throw 'Incorrect audit definition type. Valid definitions: true/false'; } return params; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; function rawMap(raw, prefix) { var keys = getField(raw, 'timeSeriesDescriptor.pointDescriptors'), values = getField(raw, 'timeSeriesData.0.pointData.0.values'), re = /(^t_\d+\.value\.)/g; for (i in keys) { var key = getField(keys[i], 'key').replace(re, ''); for (v in value_types) { if (typeof values[i][value_types[v]] !== 'undefined') { if (prefix) { obj[prefix + key] = values[i][value_types[v]]; } else { obj[key] = values[i][value_types[v]]; } } } } return obj; } function singleMetrics(tsd) { var result = {}; for (t in tsd) { for (v in value_types) { if (getFieldBool(tsd[t], 'pointData.0.values.0.' + [value_types[v]])) { result['mssql_' + getField(tsd[t], 'labelValues.3.stringValue').toLowerCase()] = tsd[t].pointData[0].values[0][value_types[v]]; break; } } } return result; } var params = checkParams(JSON.parse(value)); if (params.audited === 'true') { base_paths.push(mssql_path + 'audits_size'); }; var time_window = params.time_window, project = params.project_id, filter = ' | within ' + time_window + " | filter database_id = '" + params.database_id + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query', queries = [ { name: 'base_', data: { query: '{' + base_paths.join(';') + '}' + j_filter } }, { name: 'mssql_', data: { query: '{' + mssql_paths.join(';') + '}' + j_filter } } ]; for (q in queries) { raw = getHttpData(url, params.token, queries[q].data); obj = Object.assign(obj, rawMap(raw, queries[q].name)); } obj.base_ram_pused = Math.floor(getField(obj, 'base_usage') / getField(obj, 'base_quota') * 100); var single_queries = [ { query: mssql_path + 'memory/page_operation_count' + filter } ]; if (params.audited === 'true') { single_queries.push({ query: mssql_path + 'audits_upload_count' + filter }); } for (q in single_queries) { raw = getHttpData(url, params.token, single_queries[q]); Object.assign(obj, singleMetrics(getField(raw, 'timeSeriesData'))); } return JSON.stringify(obj); description: 'MSSQL metrics data in raw format.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: database_id value: '{$GCP.PROJECT.ID}:{HOST.NAME}' - name: token value: '{$GCP.AUTH.TOKEN}' - name: audited value: '{$CLOUD_SQL.MSSQL.AUDITED}' tags: - tag: component value: raw - uuid: 393b6117008d4925be9474afc9c7cdf9 name: 'GCP Cloud SQL MSSQL: Connections' type: DEPENDENT key: gcp.cloudsql.mssql.network.connections delay: '0' history: 7d trends: 90d description: 'Number of connections to the databases on the Cloud SQL instance.' preprocessing: - type: JSONPATH parameters: - $.base_connections master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: connections - tag: component value: network - uuid: 297744bfcdd84565b828e1c6912beb46 name: 'GCP Cloud SQL MSSQL: Network: Received bytes' type: DEPENDENT key: gcp.cloudsql.mssql.network.received_bytes_count delay: '0' history: 7d trends: 90d units: B description: 'Delta count of bytes received through the network.' preprocessing: - type: JSONPATH parameters: - $.base_received_bytes_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: b362d14169b34f00ab3fa94b89a1b362 name: 'GCP Cloud SQL MSSQL: Network: Sent bytes' type: DEPENDENT key: gcp.cloudsql.mssql.network.sent_bytes_count delay: '0' history: 7d trends: 90d units: B description: 'Delta count of bytes sent through the network.' preprocessing: - type: JSONPATH parameters: - $.base_sent_bytes_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 7ee117702e1f40faadd901faa9d333ff name: 'GCP Cloud SQL MSSQL: Resources get' type: SCRIPT key: gcp.cloudsql.mssql.resources.get delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'cloudsql.googleapis.com/database/sqlserver/transactions/', arr = [], base_paths = [ 'deadlock_count', 'lock_wait_count', 'lock_wait_time' ]; function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function checkParams(params) { ['project_id', 'time_window', 'database_id', 'token'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } return params; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; var params = checkParams(JSON.parse(value)), time_window = params.time_window, project = params.project_id, filter = ' | within ' + time_window + " | filter database_id = '" + params.database_id + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query'; var raw = getHttpData(url, params.token, { query: '{' + base_paths.map(function (path) { return base_path + path; }).join(';') + '}' + j_filter }), metrics = getField(raw, 'timeSeriesDescriptor.pointDescriptors'), time_series = getField(raw, 'timeSeriesData'); for (t in time_series) { data = { resource: getField(time_series[t], 'labelValues.3.stringValue'), metrics: {} }; for (i in metrics) { re = /(^t_\d+\.value(_|\.))/g; data['metrics'][getField(metrics[i], 'key').replace(re, '')] = getField(time_series[t], 'pointData.0.values.' + i + '.int64Value'); } arr.push(data); } return JSON.stringify(arr); description: 'MSSQL resources data in raw format.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: database_id value: '{$GCP.PROJECT.ID}:{HOST.NAME}' - name: token value: '{$GCP.AUTH.TOKEN}' tags: - tag: component value: raw - uuid: 3c14882329b94b8e88ca5d85e21bb7c8 name: 'GCP Cloud SQL MSSQL: Schedulers get' type: SCRIPT key: gcp.cloudsql.mssql.schedulers.get delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'cloudsql.googleapis.com/database/sqlserver/schedulers/', arr = [], base_paths = ['active_workers', 'current_tasks', 'current_workers', 'pending_disk_io', 'runnable_tasks', 'work_queue']; function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function checkParams(params) { ['project_id', 'time_window', 'database_id', 'token'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } return params; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; var params = checkParams(JSON.parse(value)), time_window = params.time_window, project = params.project_id, filter = ' | within ' + time_window + " | filter database_id = '" + params.database_id + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query'; var raw = getHttpData(url, params.token, { query: '{' + base_paths.map(function (path) { return base_path + path; }).join(';') + '}' + j_filter }), metrics = getField(raw, 'timeSeriesDescriptor.pointDescriptors'), time_series = getField(raw, 'timeSeriesData'); for (t in time_series) { data = { scheduler: getField(time_series[t], 'labelValues.3.stringValue'), metrics: {} }; for (i in metrics) { re = /(^t_\d+\.value(_|\.))/g; data['metrics'][getField(metrics[i], 'key').replace(re, '')] = getField(time_series[t], 'pointData.0.values.' + i + '.int64Value'); } arr.push(data); } return JSON.stringify(arr); description: 'MSSQL schedulers data in raw format.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: database_id value: '{$GCP.PROJECT.ID}:{HOST.NAME}' - name: token value: '{$GCP.AUTH.TOKEN}' tags: - tag: component value: raw - uuid: 7d2c28a537e44ee284e4b5d186b935d6 name: 'GCP Cloud SQL MSSQL: Batch requests' type: DEPENDENT key: gcp.cloudsql.mssql.trans.batch_request_count delay: '0' history: 7d trends: 90d description: 'Total number of Transact-SQL command batches received.' preprocessing: - type: JSONPATH parameters: - $.mssql_batch_request_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: transactions - uuid: 774cffa1a1f24d778f346bea24926690 name: 'GCP Cloud SQL MSSQL: Forwarded records' type: DEPENDENT key: gcp.cloudsql.mssql.trans.forwarded_record_count delay: '0' history: 7d trends: 90d description: 'Total number of records fetched through forwarded record pointers.' preprocessing: - type: JSONPATH parameters: - $.mssql_forwarded_record_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: transactions - uuid: f80a924d20c4470496202d3e32261e7d name: 'GCP Cloud SQL MSSQL: Full scans' type: DEPENDENT key: gcp.cloudsql.mssql.trans.full_scan_count delay: '0' history: 7d trends: 90d description: | Total number of unrestricted full scans. These can be either base-table or full-index scans. preprocessing: - type: JSONPATH parameters: - $.mssql_full_scan_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: transactions - uuid: cd6f91964b7041bb929c6f6f3430cc75 name: 'GCP Cloud SQL MSSQL: Page splits' type: DEPENDENT key: gcp.cloudsql.mssql.trans.page_split_count delay: '0' history: 7d trends: 90d description: 'Total number of page splits that occur as the result of overflowing index pages.' preprocessing: - type: JSONPATH parameters: - $.mssql_page_split_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: transactions - uuid: 0b431016ca8245dea8e33c252a9a7c9b name: 'GCP Cloud SQL MSSQL: Probe scans' type: DEPENDENT key: gcp.cloudsql.mssql.trans.probe_scan_count delay: '0' history: 7d trends: 90d description: 'Total number of probe scans that are used to find at least one single qualified row in an index or base table directly.' preprocessing: - type: JSONPATH parameters: - $.mssql_probe_scan_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: transactions - uuid: bf4eb81de038452cb3af16b4efcdb4c5 name: 'GCP Cloud SQL MSSQL: SQL compilations' type: DEPENDENT key: gcp.cloudsql.mssql.trans.sql_compilation_count delay: '0' history: 7d trends: 90d description: 'Total number of SQL compilations.' preprocessing: - type: JSONPATH parameters: - $.mssql_sql_compilation_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: transactions - uuid: 39c350f5d1f94726b03c435e9e5e3110 name: 'GCP Cloud SQL MSSQL: SQL recompilations' type: DEPENDENT key: gcp.cloudsql.mssql.trans.sql_recompilation_count delay: '0' history: 7d trends: 90d description: 'Total number of SQL recompilations.' preprocessing: - type: JSONPATH parameters: - $.mssql_sql_recompilation_count master_item: key: gcp.cloudsql.mssql.metrics.get tags: - tag: component value: transactions discovery_rules: - uuid: 2dad3e63931942f8937b8720c9477a66 name: 'Databases discovery' type: DEPENDENT key: gcp.cloudsql.db.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#DB.NAME}' value: '{$CLOUD_SQL.MSSQL.DB.NAME.MATCHES}' formulaid: A - macro: '{#DB.NAME}' value: '{$CLOUD_SQL.MSSQL.DB.NAME.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B lifetime: 7d description: 'Databases discovery.' item_prototypes: - uuid: 8f6deafa9efd416797ea58d1fce41c29 name: 'GCP Cloud SQL MSSQL: Database [{#DB.NAME}]: Log bytes flushed' type: DEPENDENT key: 'gcp.cloudsql.mssql.db.log_bytes_flushed_count[{#DB.NAME}]' delay: '0' history: 7d trends: 90d units: B description: 'Total number of log bytes flushed for the [{#DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - $.log_bytes_flushed_count master_item: key: 'gcp.cloudsql.mssql.db.raw[{#DB.NAME}]' tags: - tag: component value: database - tag: database value: '{#DB.NAME}' - uuid: b52f757bc2b341e891f60e15795088ca name: 'GCP Cloud SQL MSSQL: Database [{#DB.NAME}]: Raw data' type: DEPENDENT key: 'gcp.cloudsql.mssql.db.raw[{#DB.NAME}]' delay: '0' history: '0' trends: '0' value_type: TEXT description: 'Data in raw format for the [{#DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - '$[?(@.database == "{#DB.NAME}")].metrics.first()' master_item: key: gcp.cloudsql.mssql.db.get tags: - tag: component value: raw - tag: database value: '{#DB.NAME}' - uuid: 9f8d37a25e1041c087bbea8d670cce46 name: 'GCP Cloud SQL MSSQL: Database [{#DB.NAME}]: Transactions started' type: DEPENDENT key: 'gcp.cloudsql.mssql.db.transaction_count[{#DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Total number of transactions started for the [{#DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - $.transaction_count master_item: key: 'gcp.cloudsql.mssql.db.raw[{#DB.NAME}]' tags: - tag: component value: database - tag: database value: '{#DB.NAME}' master_item: key: gcp.cloudsql.mssql.db.get lld_macro_paths: - lld_macro: '{#DB.NAME}' path: $.database preprocessing: - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h - uuid: d47a9164fdf54309ab96f48f6dc3c037 name: 'Resources discovery' type: DEPENDENT key: gcp.cloudsql.resources.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#RESOURCE.NAME}' value: '{$CLOUD_SQL.MSSQL.RES.NAME.MATCHES}' formulaid: A - macro: '{#RESOURCE.NAME}' value: '{$CLOUD_SQL.MSSQL.RES.NAME.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B lifetime: 7d description: 'Resources discovery.' item_prototypes: - uuid: 55bb12000dca46e096045da83a46edea name: 'GCP Cloud SQL MSSQL: Resource [{#RESOURCE.NAME}]: Deadlocks' type: DEPENDENT key: 'gcp.cloudsql.mssql.resource.deadlock_count[{#RESOURCE.NAME}]' delay: '0' history: 7d trends: 90d description: 'Total number of lock requests that resulted in a deadlock for the [{#RESOURCE.NAME}] resource.' preprocessing: - type: JSONPATH parameters: - $.deadlock_count master_item: key: 'gcp.cloudsql.mssql.resource.raw[{#RESOURCE.NAME}]' tags: - tag: component value: resource - tag: resource value: '{#RESOURCE.NAME}' - uuid: 0117dba440f34461959490efaff059e2 name: 'GCP Cloud SQL MSSQL: Resource [{#RESOURCE.NAME}]: Lock waits' type: DEPENDENT key: 'gcp.cloudsql.mssql.resource.lock_wait_count[{#RESOURCE.NAME}]' delay: '0' history: 7d trends: 90d description: 'Total number of lock requests that required the caller to wait for the [{#RESOURCE.NAME}] resource.' preprocessing: - type: JSONPATH parameters: - $.lock_wait_count master_item: key: 'gcp.cloudsql.mssql.resource.raw[{#RESOURCE.NAME}]' tags: - tag: component value: resource - tag: resource value: '{#RESOURCE.NAME}' - uuid: 6e8b5646d70b470fa18960c7b43a9aff name: 'GCP Cloud SQL MSSQL: Resource [{#RESOURCE.NAME}]: Lock wait time' type: DEPENDENT key: 'gcp.cloudsql.mssql.resource.lock_wait_time[{#RESOURCE.NAME}]' delay: '0' history: 7d trends: 90d units: s description: 'Total time lock requests were waiting for locks for the [{#RESOURCE.NAME}] resource.' preprocessing: - type: JSONPATH parameters: - $.lock_wait_time master_item: key: 'gcp.cloudsql.mssql.resource.raw[{#RESOURCE.NAME}]' tags: - tag: component value: resource - tag: resource value: '{#RESOURCE.NAME}' - uuid: 0cc16595d1e044db947084a44786aaaa name: 'GCP Cloud SQL MSSQL: Resource [{#RESOURCE.NAME}]: Raw data' type: DEPENDENT key: 'gcp.cloudsql.mssql.resource.raw[{#RESOURCE.NAME}]' delay: '0' history: '0' trends: '0' value_type: TEXT description: 'Data in raw format for the [{#RESOURCE.NAME}] resource.' preprocessing: - type: JSONPATH parameters: - '$[?(@.resource == "{#RESOURCE.NAME}")].metrics.first()' master_item: key: gcp.cloudsql.mssql.resources.get tags: - tag: component value: raw - tag: resource value: '{#RESOURCE.NAME}' master_item: key: gcp.cloudsql.mssql.resources.get lld_macro_paths: - lld_macro: '{#RESOURCE.NAME}' path: $.resource preprocessing: - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h - uuid: 31667d0e9c32458d9c895367b3ca7042 name: 'Schedulers discovery' type: DEPENDENT key: gcp.cloudsql.schedulers.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#SCHEDULER.ID}' value: '{$CLOUD_SQL.MSSQL.SCHEDULER.ID.MATCHES}' formulaid: A - macro: '{#SCHEDULER.ID}' value: '{$CLOUD_SQL.MSSQL.SCHEDULER.ID.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B lifetime: 7d description: 'Schedulers discovery.' item_prototypes: - uuid: 67bde61c128e4dfe9e47d8a3a6e3ceec name: 'GCP Cloud SQL MSSQL: Scheduler [{#SCHEDULER.ID}]: Active workers' type: DEPENDENT key: 'gcp.cloudsql.mssql.scheduler.active_workers[{#SCHEDULER.ID}]' delay: '0' history: 7d trends: 90d description: | Current number of active workers associated with the scheduler that goes by its ID [{#SCHEDULER.ID}]. An active worker is never preemptive, must have an associated task, and is either running, runnable, or suspended. preprocessing: - type: JSONPATH parameters: - $.active_workers master_item: key: 'gcp.cloudsql.mssql.scheduler.raw[{#SCHEDULER.ID}]' tags: - tag: component value: scheduler - tag: scheduler value: '{#SCHEDULER.ID}' - uuid: fc5113b2b5f64205ad9d100bd480adea name: 'GCP Cloud SQL MSSQL: Scheduler [{#SCHEDULER.ID}]: Current tasks' type: DEPENDENT key: 'gcp.cloudsql.mssql.scheduler.current_tasks[{#SCHEDULER.ID}]' delay: '0' history: 7d trends: 90d description: | Current number of present tasks associated with the scheduler that goes by its ID [{#SCHEDULER.ID}]. This count includes tasks that are waiting for a worker to execute them and tasks that are currently waiting or running (in SUSPENDED or RUNNABLE state). preprocessing: - type: JSONPATH parameters: - $.current_tasks master_item: key: 'gcp.cloudsql.mssql.scheduler.raw[{#SCHEDULER.ID}]' tags: - tag: component value: scheduler - tag: scheduler value: '{#SCHEDULER.ID}' - uuid: 6602f8d26a9a46fb8ed74a40d10f36e4 name: 'GCP Cloud SQL MSSQL: Scheduler [{#SCHEDULER.ID}]: Current workers' type: DEPENDENT key: 'gcp.cloudsql.mssql.scheduler.current_workers[{#SCHEDULER.ID}]' delay: '0' history: 7d trends: 90d description: | Current number of workers associated with the scheduler that goes by its ID [{#SCHEDULER.ID}]. It includes workers that are not assigned any task. preprocessing: - type: JSONPATH parameters: - $.current_workers master_item: key: 'gcp.cloudsql.mssql.scheduler.raw[{#SCHEDULER.ID}]' tags: - tag: component value: scheduler - tag: scheduler value: '{#SCHEDULER.ID}' - uuid: 2022a85bb7c04e73a75136e55162084a name: 'GCP Cloud SQL MSSQL: Scheduler [{#SCHEDULER.ID}]: Pending I/O operations' type: DEPENDENT key: 'gcp.cloudsql.mssql.scheduler.pending_disk_io[{#SCHEDULER.ID}]' delay: '0' history: 7d trends: 90d description: | Current number of pending I/Os waiting to be completed that are associated with the scheduler that goes by its ID [{#SCHEDULER.ID}]. Each scheduler has a list of pending I/Os that are checked to determine whether they have been completed every time there is a context switch. The count is incremented when the request is inserted. This count is decremented when the request is completed. This number does not indicate the state of the I/Os. preprocessing: - type: JSONPATH parameters: - $.pending_disk_io master_item: key: 'gcp.cloudsql.mssql.scheduler.raw[{#SCHEDULER.ID}]' tags: - tag: component value: scheduler - tag: scheduler value: '{#SCHEDULER.ID}' - uuid: c3e337845c344f4cb0d14a5e7d22cbb7 name: 'GCP Cloud SQL MSSQL: Scheduler [{#SCHEDULER.ID}]: Raw data' type: DEPENDENT key: 'gcp.cloudsql.mssql.scheduler.raw[{#SCHEDULER.ID}]' delay: '0' history: '0' trends: '0' value_type: TEXT description: 'Data in raw format associated with the scheduler that goes by its ID [{#SCHEDULER.ID}].' preprocessing: - type: JSONPATH parameters: - '$[?(@.scheduler == "{#SCHEDULER.ID}")].metrics.first()' master_item: key: gcp.cloudsql.mssql.schedulers.get tags: - tag: component value: raw - tag: scheduler value: '{#SCHEDULER.ID}' - uuid: a9852ac0cdcc423fad6b305eb57eedf1 name: 'GCP Cloud SQL MSSQL: Scheduler [{#SCHEDULER.ID}]: Runnable tasks' type: DEPENDENT key: 'gcp.cloudsql.mssql.scheduler.runnable_tasks[{#SCHEDULER.ID}]' delay: '0' history: 7d trends: 90d description: 'Current number of workers that are associated with the scheduler that goes by its ID [{#SCHEDULER.ID}] and have assigned tasks waiting to be scheduled on the runnable queue.' preprocessing: - type: JSONPATH parameters: - $.runnable_tasks master_item: key: 'gcp.cloudsql.mssql.scheduler.raw[{#SCHEDULER.ID}]' tags: - tag: component value: scheduler - tag: scheduler value: '{#SCHEDULER.ID}' - uuid: eaae59fb97124471b1c7c30c601dba1f name: 'GCP Cloud SQL MSSQL: Scheduler [{#SCHEDULER.ID}]: Work queue' type: DEPENDENT key: 'gcp.cloudsql.mssql.scheduler.work_queue[{#SCHEDULER.ID}]' delay: '0' history: 7d trends: 90d description: | Current number of tasks in the pending queue associated with the scheduler that goes by its ID [{#SCHEDULER.ID}]. These tasks are waiting for a worker to pick them up. preprocessing: - type: JSONPATH parameters: - $.work_queue master_item: key: 'gcp.cloudsql.mssql.scheduler.raw[{#SCHEDULER.ID}]' tags: - tag: component value: scheduler - tag: scheduler value: '{#SCHEDULER.ID}' master_item: key: gcp.cloudsql.mssql.schedulers.get lld_macro_paths: - lld_macro: '{#SCHEDULER.ID}' path: $.scheduler preprocessing: - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h tags: - tag: class value: cloud - tag: target value: cloudsql - tag: target value: gcp - tag: target value: google-cloud-platform - tag: target value: mssql macros: - macro: '{$CLOUD_SQL.MSSQL.CPU.UTIL.MAX}' value: '95' description: 'GCP Cloud SQL MSSQL instance CPU usage threshold.' - macro: '{$CLOUD_SQL.MSSQL.DB.NAME.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL MSSQL databases by namespace.' - macro: '{$CLOUD_SQL.MSSQL.DB.NAME.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Cloud SQL MSSQL databases by namespace.' - macro: '{$CLOUD_SQL.MSSQL.DISK.UTIL.CRIT}' value: '90' description: 'GCP Cloud SQL MSSQL instance critical disk usage threshold.' - macro: '{$CLOUD_SQL.MSSQL.DISK.UTIL.WARN}' value: '80' description: 'GCP Cloud SQL MSSQL instance warning disk usage threshold.' - macro: '{$CLOUD_SQL.MSSQL.RAM.UTIL.MAX}' value: '90' description: 'GCP Cloud SQL MSSQL instance RAM usage threshold.' - macro: '{$CLOUD_SQL.MSSQL.RES.NAME.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL MSSQL resources by namespace.' - macro: '{$CLOUD_SQL.MSSQL.RES.NAME.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Cloud SQL MSSQL resources by namespace.' - macro: '{$CLOUD_SQL.MSSQL.SCHEDULER.ID.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL MSSQL schedulers by namespace.' - macro: '{$CLOUD_SQL.MSSQL.SCHEDULER.ID.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Cloud SQL MSSQL schedulers by namespace.' - macro: '{$GCP.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$GCP.TIME.WINDOW}' value: 5m description: | Time interval for the data requests. Supported usage type: 1. The default update interval for most of the items. 2. The minimal time window for the data requested in the Monitoring Query Language REST API request. dashboards: - uuid: 4233430037fc4570b3a5eb3f23ef02e6 name: 'MSSQL instance' pages: - name: 'MSSQL instance' widgets: - type: graph width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.cpu.usage_time - type: graph x: '12' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.cpu.utilization - type: graph 'y': '5' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MSSQL by HTTP' name: 'GCP Cloud SQL MSSQL: Memory usage' - type: graph x: '12' 'y': '5' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.memory.utilization - type: graph 'y': '10' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.disk.utilization - type: graph x: '12' 'y': '10' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MSSQL by HTTP' name: 'GCP Cloud SQL MSSQL: Disk read/write operations' - type: graph 'y': '15' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MSSQL by HTTP' name: 'GCP Cloud SQL MSSQL: Network traffic' - type: graph x: '12' 'y': '15' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.network.connections - type: graph 'y': '20' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MSSQL by HTTP' name: 'GCP Cloud SQL MSSQL: Transactions' - type: graph x: '12' 'y': '20' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.memory.buffer_cache_hit_ratio - type: graph 'y': '25' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MSSQL by HTTP' name: 'GCP Cloud SQL MSSQL: Memory workflow' - type: graph x: '12' 'y': '25' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MSSQL by HTTP' name: 'GCP Cloud SQL MSSQL: Memory Read/Writes' valuemaps: - uuid: d2aa57a09cbb43e8b53b11316193f013 name: 'Database availability' mappings: - value: '0' newvalue: Down - value: '1' newvalue: Up - uuid: 1c26d58d111b4689a2e7acd23a38f1ca name: 'Instance state' mappings: - value: '0' newvalue: Running - value: '1' newvalue: Suspended - value: '2' newvalue: Runnable - value: '3' newvalue: 'Pending create' - value: '4' newvalue: Maintenance - value: '5' newvalue: Failed - value: '6' newvalue: 'Unknown state' - value: '10' newvalue: 'Data retrievement error' - uuid: 54f0ffb538d94a9bb8062df3e63c4cb6 template: 'GCP Cloud SQL MSSQL Replica by HTTP' name: 'GCP Cloud SQL MSSQL Replica by HTTP' description: | Get GCP Cloud SQL MSSQL monitoring for read-only replicas with script item usage to perform HTTP requests to Google Cloud Platform Monitoring API. This template will be automatically connected to discovered entities with all their required parameters pre-defined. 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: e66fe8bb6f924cb088ec57b215fe21d7 name: 'GCP Cloud SQL MSSQL: Bytes sent to replica' type: DEPENDENT key: gcp.cloudsql.mssql.repl.bytes_sent_to_replica_count delay: '0' history: 7d trends: 90d units: B description: | Total number of bytes sent to the remote availability replica. For an async replica, returns the number of bytes before compression. For a sync replica without compression, returns the actual number of bytes. preprocessing: - type: JSONPATH parameters: - $.bytes_sent_to_replica_count master_item: key: gcp.cloudsql.mssql.repl.metrics.get tags: - tag: component value: replication - uuid: 4100432768354e1ca7349a901bccbe85 name: 'GCP Cloud SQL MSSQL: Log apply pending queue' type: DEPENDENT key: gcp.cloudsql.mssql.repl.log_apply_pending_queue delay: '0' history: 7d trends: 90d description: 'Current number of log blocks that are waiting to be applied to replica.' preprocessing: - type: JSONPATH parameters: - $.log_apply_pending_queue master_item: key: gcp.cloudsql.mssql.repl.metrics.get tags: - tag: component value: replication - uuid: d060637548af434e926ed833083d9fa0 name: 'GCP Cloud SQL MSSQL: Log bytes received' type: DEPENDENT key: gcp.cloudsql.mssql.repl.log_bytes_received_count delay: '0' history: 7d trends: 90d units: B description: 'Total size of log records received by the replica.' preprocessing: - type: JSONPATH parameters: - $.log_bytes_received_count master_item: key: gcp.cloudsql.mssql.repl.metrics.get tags: - tag: component value: replication - uuid: f0d4c711863f4ca9ad76b0099a66a86d name: 'GCP Cloud SQL MSSQL: Replica metrics get' type: SCRIPT key: gcp.cloudsql.mssql.repl.metrics.get delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'cloudsql.googleapis.com/database/sqlserver/replication/', obj = {}, base_paths = [ 'bytes_sent_to_replica_count | map ignore [replica_name]', 'resent_message_count | map ignore [replica_name]', 'log_apply_pending_queue', 'log_bytes_received_count', 'recovery_queue', 'redone_bytes_count' ]; function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function checkParams(params) { ['project_id', 'time_window', 'database_id', 'token'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } return params; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; var params = checkParams(JSON.parse(value)), time_window = params.time_window, project = params.project_id, filter = ' | within ' + time_window + " | filter database_id = '" + params.database_id + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query'; var base_raw = getHttpData(url, params.token, { query: '{' + base_paths.map(function (path) { return base_path + path; }).join(';') + '}' + j_filter }), keys = getField(base_raw, 'timeSeriesDescriptor.pointDescriptors'), values = getField(base_raw, 'timeSeriesData.0.pointData.0.values'), re = /(^t_\d+\.value\.)/g; for (i in keys) { var value_types = ['int64Value', 'doubleValue', 'stringValue', 'boolValue']; for (v in value_types) { if (typeof values[i][value_types[v]] !== 'undefined') { obj[getField(keys[i], 'key').replace(re, '')] = values[i][value_types[v]]; } } } return JSON.stringify(obj); description: 'MSSQL replica metrics data in raw format.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: database_id value: '{$GCP.PROJECT.ID}:{HOST.NAME}' - name: token value: '{$GCP.AUTH.TOKEN}' tags: - tag: component value: raw - uuid: 4ec364fea7894df29813b65c2d170367 name: 'GCP Cloud SQL MSSQL: Recovery queue' type: DEPENDENT key: gcp.cloudsql.mssql.repl.recovery_queue delay: '0' history: 7d trends: 90d units: B description: 'Current size of log records in bytes in the replica''s log files that have not been redone.' preprocessing: - type: JSONPATH parameters: - $.recovery_queue - type: MULTIPLIER parameters: - '1024' master_item: key: gcp.cloudsql.mssql.repl.metrics.get tags: - tag: component value: replication - uuid: 37c145777926471482ecffd1b6cca792 name: 'GCP Cloud SQL MSSQL: Redone bytes' type: DEPENDENT key: gcp.cloudsql.mssql.repl.redone_bytes_count delay: '0' history: 7d trends: 90d units: B description: 'Total size in bytes of redone log records.' preprocessing: - type: JSONPATH parameters: - $.redone_bytes_count master_item: key: gcp.cloudsql.mssql.repl.metrics.get tags: - tag: component value: replication - uuid: 23911902d27e4fa68435935aeeec28e1 name: 'GCP Cloud SQL MSSQL: Resent messages' type: DEPENDENT key: gcp.cloudsql.mssql.repl.resent_message_count delay: '0' history: 7d trends: 90d description: | Total count of Always On messages to resend. This includes messages that were attempted to be sent but failed and require resending. preprocessing: - type: JSONPATH parameters: - $.resent_message_count master_item: key: gcp.cloudsql.mssql.repl.metrics.get tags: - tag: component value: replication tags: - tag: class value: cloud - tag: target value: cloudsql - tag: target value: gcp - tag: target value: google-cloud-platform - tag: target value: mssql - tag: target value: replica macros: - macro: '{$GCP.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$GCP.TIME.WINDOW}' value: 5m description: | Time interval for the data requests. Supported usage type: 1. The default update interval for most of the items. 2. The minimal time window for the data requested in the Monitoring Query Language REST API request. dashboards: - uuid: f50d9889ca3c4f6b91dd9e40902e37fb name: 'MSSQL replica' pages: - name: 'MSSQL replica' widgets: - type: graph width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MSSQL Replica by HTTP' name: 'GCP Cloud SQL MSSQL: Replication data' - type: graph x: '12' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MSSQL Replica by HTTP' key: gcp.cloudsql.mssql.repl.log_apply_pending_queue - uuid: 38456af4aedd4b168ec3fa4ad2acb256 template: 'GCP Cloud SQL MySQL by HTTP' name: 'GCP Cloud SQL MySQL by HTTP' description: | Get GCP Cloud SQL MySQL instances monitoring with script item usage to perform HTTP requests to Google Cloud Platform Monitoring API. This template will be automatically connected to discovered entities with all their required parameters pre-defined. 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: 83e36c61e8ce4d06a395ea7b06c5877b name: 'GCP Cloud SQL MySQL: Reserved CPU cores' type: DEPENDENT key: gcp.cloudsql.mysql.cpu.reserved_cores delay: '0' history: 7d trends: 90d value_type: FLOAT description: 'Number of cores reserved for the database.' preprocessing: - type: JSONPATH parameters: - $.base_reserved_cores master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: cpu - uuid: a39ba253dbf24110af48fd49572976fd name: 'GCP Cloud SQL MySQL: CPU usage time' type: DEPENDENT key: gcp.cloudsql.mysql.cpu.usage_time delay: '0' history: 7d trends: 90d value_type: FLOAT units: s description: 'Cumulative CPU usage time in seconds.' preprocessing: - type: JSONPATH parameters: - $.base_usage_time master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: cpu - uuid: df7469e3c76c4286846c27003c9785cc name: 'GCP Cloud SQL MySQL: CPU utilization' type: DEPENDENT key: gcp.cloudsql.mysql.cpu.utilization delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: 'Current CPU utilization represented as a percentage of the reserved CPU that is currently in use.' preprocessing: - type: JSONPATH parameters: - $.base_utilization - type: MULTIPLIER parameters: - '100' master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: cpu triggers: - uuid: 5bf54c01665549c8a05f49db34c86191 expression: 'min(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.cpu.utilization,5m) >= {$CLOUD_SQL.MYSQL.CPU.UTIL.MAX}' name: 'GCP Cloud SQL MySQL: High CPU utilization' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: AVERAGE description: 'The CPU utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: 948dac37023c4efcaf5f830ba5d4fafe name: 'GCP Cloud SQL MySQL: DB engine state' type: HTTP_AGENT key: gcp.cloudsql.mysql.db.state history: 7d description: 'GCP Cloud SQL MySQL DB Engine State.' valuemap: name: 'Database availability' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' - type: JSONPATH parameters: - '$.timeSeriesData[0].pointData[0].values[0].int64Value' error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 10m timeout: '{$GCP.DATA.TIMEOUT}' url: 'https://monitoring.googleapis.com/v3/projects/{$GCP.PROJECT.ID}/timeSeries:query' posts: '{"query":"cloudsql.googleapis.com/database/up | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}' status_codes: '' headers: - name: Content-Type value: application/json - name: Authorization value: 'Bearer {$GCP.AUTH.TOKEN}' request_method: POST tags: - tag: component value: status triggers: - uuid: a3eff8c422f5427e9b1c6abb9854f73c expression: | last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.db.state)=0 name: 'GCP Cloud SQL MySQL: Database engine is down' priority: AVERAGE description: | Database engine is down. If an instance experiences unplanned (non-maintenance) downtime, the instance state will still be RUNNING, but the database engine state metric will report 0. dependencies: - name: 'GCP Cloud SQL MySQL: Failed to get the instance state' expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 10' - name: 'GCP Cloud SQL MySQL: Instance is in failed state' expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 5' - name: 'GCP Cloud SQL MySQL: Instance is in maintenance' expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 4' - name: 'GCP Cloud SQL MySQL: Instance is in suspended state' expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 1' - name: 'GCP Cloud SQL MySQL: Instance is in unknown state' expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 6' - name: 'GCP Cloud SQL MySQL: Instance is stopped by the owner' expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 2' tags: - tag: scope value: availability - uuid: 76c37760145d43f3927f1a9548dea8a5 name: 'GCP Cloud SQL MySQL: Disk bytes used' type: DEPENDENT key: gcp.cloudsql.mysql.disk.bytes_used delay: '0' history: 7d trends: 90d units: B description: 'Data utilization in bytes.' preprocessing: - type: JSONPATH parameters: - $.mysql_bytes_used master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: storage - uuid: 464fecbbedd64e988739c93736d2b824 name: 'GCP Cloud SQL MySQL: Disk size' type: DEPENDENT key: gcp.cloudsql.mysql.disk.quota delay: '0' history: 7d trends: 90d units: B description: 'Maximum data disk size in bytes.' preprocessing: - type: JSONPATH parameters: - $.mysql_quota master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: storage - uuid: d426d282d2ee43fe9c9b64dcb6d0c4c9 name: 'GCP Cloud SQL MySQL: Disk read I/O' type: DEPENDENT key: gcp.cloudsql.mysql.disk.read_ops_count delay: '0' history: 7d trends: 90d description: 'Delta count of data disk read I/O operations.' preprocessing: - type: JSONPATH parameters: - $.base_read_ops_count master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: storage - uuid: b2274d47be5041b493b00fd55172c0e9 name: 'GCP Cloud SQL MySQL: Disk utilization' type: DEPENDENT key: gcp.cloudsql.mysql.disk.utilization delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: | The fraction of the disk quota that is currently in use. Shown as percentage. preprocessing: - type: JSONPATH parameters: - $.mysql_utilization - type: MULTIPLIER parameters: - '100' master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: storage triggers: - uuid: d5ade16fb0494ca6af61100a2e643702 expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.disk.utilization) >= {$CLOUD_SQL.MYSQL.DISK.UTIL.CRIT}' name: 'GCP Cloud SQL MySQL: Disk space is critically low' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: AVERAGE description: 'Critical utilization of the disk space.' tags: - tag: scope value: capacity - uuid: 3b5c84fee47f4376b19d0738b261c01b expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.disk.utilization) >= {$CLOUD_SQL.MYSQL.DISK.UTIL.WARN}' name: 'GCP Cloud SQL MySQL: Disk space is low' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: WARNING description: 'High utilization of the storage space.' dependencies: - name: 'GCP Cloud SQL MySQL: Disk space is critically low' expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.disk.utilization) >= {$CLOUD_SQL.MYSQL.DISK.UTIL.CRIT}' tags: - tag: scope value: capacity - uuid: 7a44187c6a404defb0dc83fa22f89d96 name: 'GCP Cloud SQL MySQL: Disk write I/O' type: DEPENDENT key: gcp.cloudsql.mysql.disk.write_ops_count delay: '0' history: 7d trends: 90d description: 'Delta count of data disk write I/O operations.' preprocessing: - type: JSONPATH parameters: - $.base_write_ops_count master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: storage - uuid: 5e5b9cdfa7f2455b881cceface136e65 name: 'GCP Cloud SQL MySQL: InnoDB dirty pages' type: DEPENDENT key: gcp.cloudsql.mysql.innodb_buffer_pool_pages_dirty delay: '0' history: 7d trends: 90d description: 'Number of unflushed pages in the InnoDB buffer pool.' preprocessing: - type: JSONPATH parameters: - $.mysql_innodb_buffer_pool_pages_dirty master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: innodb - tag: component value: memory - uuid: 75835c8326e6461d8f25fb7d55271f16 name: 'GCP Cloud SQL MySQL: InnoDB free pages' type: DEPENDENT key: gcp.cloudsql.mysql.innodb_buffer_pool_pages_free delay: '0' history: 7d trends: 90d description: 'Number of unused pages in the InnoDB buffer pool.' preprocessing: - type: JSONPATH parameters: - $.mysql_innodb_buffer_pool_pages_free master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: innodb - tag: component value: memory - uuid: 080d5304c0e346808bd70b125a27be4b name: 'GCP Cloud SQL MySQL: InnoDB total pages' type: DEPENDENT key: gcp.cloudsql.mysql.innodb_buffer_pool_pages_total delay: '0' history: 7d trends: 90d description: 'Total number of pages in the InnoDB buffer pool.' preprocessing: - type: JSONPATH parameters: - $.mysql_innodb_buffer_pool_pages_total master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: innodb - tag: component value: memory - uuid: 19e259f61fc24e29a189c35121878eb3 name: 'GCP Cloud SQL MySQL: InnoDB fsync calls' type: DEPENDENT key: gcp.cloudsql.mysql.innodb_data_fsyncs delay: '0' history: 7d trends: 90d description: 'Delta count of InnoDB fsync() calls.' preprocessing: - type: JSONPATH parameters: - $.mysql_innodb_data_fsyncs master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: innodb - tag: component value: storage - uuid: c4a4ffa274974041bccbd25643ff9f70 name: 'GCP Cloud SQL MySQL: InnoDB log fsync calls' type: DEPENDENT key: gcp.cloudsql.mysql.innodb_os_log_fsyncs delay: '0' history: 7d trends: 90d description: 'Delta count of InnoDB fsync() calls to the log file.' preprocessing: - type: JSONPATH parameters: - $.mysql_innodb_os_log_fsyncs master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: innodb - tag: component value: storage - uuid: 4a9154e235e84c0d9dbf0abf44479f49 name: 'GCP Cloud SQL MySQL: InnoDB pages read' type: DEPENDENT key: gcp.cloudsql.mysql.innodb_pages_read delay: '0' history: 7d trends: 90d description: 'Delta count of InnoDB pages read.' preprocessing: - type: JSONPATH parameters: - $.mysql_innodb_pages_read master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: innodb - tag: component value: memory - uuid: 584714b219034bbebbc24edad36704c9 name: 'GCP Cloud SQL MySQL: InnoDB pages written' type: DEPENDENT key: gcp.cloudsql.mysql.innodb_pages_written delay: '0' history: 7d trends: 90d description: 'Delta count of InnoDB pages written.' preprocessing: - type: JSONPATH parameters: - $.mysql_innodb_pages_written master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: innodb - tag: component value: memory - uuid: 71559008ad444772b0b1212f715980ed name: 'GCP Cloud SQL MySQL: Instance state' type: HTTP_AGENT key: gcp.cloudsql.mysql.inst.state history: 7d description: 'GCP Cloud SQL MySQL Current instance state.' valuemap: name: 'Instance state' preprocessing: - type: JSONPATH parameters: - '$.timeSeriesData[0].pointData[0].values[0].stringValue' error_handler: CUSTOM_VALUE error_handler_params: '10' - type: JAVASCRIPT parameters: - | const idx = [ 'RUNNING', 'SUSPENDED', 'RUNNABLE', 'PENDING_CREATE', 'MAINTENANCE', 'FAILED', 'UNKNOWN_STATE' ].indexOf(value); return idx !== -1 ? idx : 10; - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 10m timeout: '{$GCP.DATA.TIMEOUT}' url: 'https://monitoring.googleapis.com/v3/projects/{$GCP.PROJECT.ID}/timeSeries:query' posts: '{"query":"cloudsql.googleapis.com/database/state | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}' status_codes: '' headers: - name: Content-Type value: application/json - name: Authorization value: 'Bearer {$GCP.AUTH.TOKEN}' request_method: POST tags: - tag: component value: status triggers: - uuid: 3b3adc89e0bb45a79a824121f49d2d02 expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 10' name: 'GCP Cloud SQL MySQL: Failed to get the instance state' priority: AVERAGE description: | Failed to get the instance state. Check access permissions to GCP API or service account. tags: - tag: scope value: availability - uuid: 65831fed3d19425c86933db4034ed565 expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 5' name: 'GCP Cloud SQL MySQL: Instance is in failed state' priority: AVERAGE description: | The instance creation failed, or an operation left the instance in an own bad state. tags: - tag: scope value: availability - uuid: fae15d1ab46c418ebfdfdd73fb698b51 expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 4' name: 'GCP Cloud SQL MySQL: Instance is in maintenance' priority: INFO description: 'The instance is down for maintenance.' tags: - tag: scope value: availability - uuid: 347215d307c8465cad41198f12b5ff68 expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 1' name: 'GCP Cloud SQL MySQL: Instance is in suspended state' priority: WARNING description: | The instance is in suspended state. It is not available, for example, due to problems with billing. tags: - tag: scope value: availability - uuid: 1387f9a2ef194d5bb5d1e548fc4eb8d3 expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 6' name: 'GCP Cloud SQL MySQL: Instance is in unknown state' priority: AVERAGE description: | The state of the instance is unknown. tags: - tag: scope value: availability - uuid: 9c66317433a24be985559fdb11907c70 expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 2' name: 'GCP Cloud SQL MySQL: Instance is stopped by the owner' priority: INFO description: | The instance has been stopped by the owner. It is not currently running, but it's ready to be restarted. tags: - tag: scope value: availability - uuid: cc09f5591b0242b3b99199b267a1c527 name: 'GCP Cloud SQL MySQL: Memory size' type: DEPENDENT key: gcp.cloudsql.mysql.memory.quota delay: '0' history: 7d trends: 90d units: B description: 'Maximum RAM size in bytes.' preprocessing: - type: JSONPATH parameters: - $.base_quota master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: memory - uuid: 13868b9408c9489296531bf1fd927084 name: 'GCP Cloud SQL MySQL: Memory used by DB engine' type: DEPENDENT key: gcp.cloudsql.mysql.memory.total_usage delay: '0' history: 7d trends: 90d units: B description: | Total RAM usage in bytes. This metric reports the RAM usage of the database process, including the buffer/cache. preprocessing: - type: JSONPATH parameters: - $.base_total_usage master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: memory - uuid: 995d07fc814f4d12a9c9bdc6bb52481d name: 'GCP Cloud SQL MySQL: Memory usage' type: DEPENDENT key: gcp.cloudsql.mysql.memory.usage delay: '0' history: 7d trends: 90d units: B description: | The RAM usage in bytes. This metric reports the RAM usage of the server, excluding the buffer/cache. preprocessing: - type: JSONPATH parameters: - $.base_usage master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: memory - uuid: efe4357a63ec43f799b2303a952c1378 name: 'GCP Cloud SQL MySQL: Memory utilization' type: DEPENDENT key: gcp.cloudsql.mysql.memory.utilization delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: | The fraction of the memory quota that is currently in use. Shown as percentage. preprocessing: - type: JSONPATH parameters: - $.base_ram_pused master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: memory triggers: - uuid: 82e3af43d3104b4ba641e0be56d11662 expression: 'min(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.memory.utilization,5m) >= {$CLOUD_SQL.MYSQL.RAM.UTIL.MAX}' name: 'GCP Cloud SQL MySQL: High memory utilization' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: HIGH description: 'RAM utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: 682484eaf1db4a239c69566a5cd492e2 name: 'GCP Cloud SQL MySQL: Metrics get' type: SCRIPT key: gcp.cloudsql.mysql.metrics.get delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'cloudsql.googleapis.com/database/', mysql_path = 'cloudsql.googleapis.com/database/mysql/', obj = {}, base_paths = [ 'cpu/reserved_cores', 'cpu/usage_time', 'cpu/utilization', 'disk/read_ops_count', 'disk/write_ops_count', 'memory/quota', 'memory/total_usage', 'memory/usage', 'network/connections', 'network/received_bytes_count', 'network/sent_bytes_count | map ignore [destination]' ].map(function (path) { return base_path + path; }), mysql_paths = [ 'innodb_buffer_pool_pages_dirty', 'innodb_buffer_pool_pages_free', 'innodb_buffer_pool_pages_total', 'innodb_data_fsyncs', 'innodb_os_log_fsyncs', 'innodb_pages_read', 'innodb_pages_written', 'queries', 'questions', 'received_bytes_count', 'sent_bytes_count', 'open_tables', 'open_table_definitions' ].map(function (path) { return mysql_path + path; }).concat( ['disk/bytes_used', 'disk/utilization', 'disk/quota'].map(function (path) { return base_path + path; })); function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function checkParams(params) { ['project_id', 'time_window', 'database_id', 'token'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } return params; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; function rawMap(raw, prefix) { var keys = getField(raw, 'timeSeriesDescriptor.pointDescriptors'), values = getField(raw, 'timeSeriesData.0.pointData.0.values'), re = /(^t_\d+\.value\.)/g; for (i in keys) { var key = getField(keys[i], 'key').replace(re, ''), value_types = ['int64Value', 'doubleValue', 'stringValue', 'boolValue']; for (v in value_types) { if (typeof values[i][value_types[v]] !== 'undefined') { if (prefix) { obj[prefix + key] = values[i][value_types[v]]; } else { obj[key] = values[i][value_types[v]]; } } } } return obj; } var params = checkParams(JSON.parse(value)), time_window = params.time_window, project = params.project_id, filter = ' | within ' + time_window + " | filter database_id = '" + params.database_id + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query', queries = [ { name: 'base_', data: { query: '{' + base_paths.join(';') + '}' + j_filter } }, { name: 'mysql_', data: { query: '{' + mysql_paths.join(';') + '}' + j_filter } } ]; for (q in queries) { raw = getHttpData(url, params.token, queries[q].data); obj = Object.assign(obj, rawMap(raw, queries[q].name)); } obj.base_ram_pused = Math.floor(getField(obj, 'base_usage') / getField(obj, 'base_quota') * 100); return JSON.stringify(obj); description: 'MySQL metrics in raw format.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: database_id value: '{$GCP.PROJECT.ID}:{HOST.NAME}' - name: token value: '{$GCP.AUTH.TOKEN}' tags: - tag: component value: raw - uuid: 9ddae405a9b343759d03b5b29c469d18 name: 'GCP Cloud SQL MySQL: Connections' type: DEPENDENT key: gcp.cloudsql.mysql.network.connections delay: '0' history: 7d trends: 90d description: 'Number of connections to the databases on the Cloud SQL instance.' preprocessing: - type: JSONPATH parameters: - $.base_connections master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: connections - tag: component value: network - uuid: d970d8e209df4b2a810c2e59f39fa429 name: 'GCP Cloud SQL MySQL: Network: Received bytes' type: DEPENDENT key: gcp.cloudsql.mysql.network.received_bytes_count delay: '0' history: 7d trends: 90d units: B description: 'Delta count of bytes received through the network.' preprocessing: - type: JSONPATH parameters: - $.base_received_bytes_count master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 977e4e22ebfc4a19a228a8935d9a342c name: 'GCP Cloud SQL MySQL: Network: Sent bytes' type: DEPENDENT key: gcp.cloudsql.mysql.network.sent_bytes_count delay: '0' history: 7d trends: 90d units: B description: 'Delta count of bytes sent through the network.' preprocessing: - type: JSONPATH parameters: - $.base_sent_bytes_count master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 1d651976f70944acb31cd0430e70d422 name: 'GCP Cloud SQL MySQL: Open tables' type: DEPENDENT key: gcp.cloudsql.mysql.open_tables delay: '0' history: 7d trends: 90d description: 'The number of tables that are currently open.' preprocessing: - type: JSONPATH parameters: - $.mysql_open_tables master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: tables - uuid: 1606766c63bf4aa1ade24a34650eef05 name: 'GCP Cloud SQL MySQL: Open table definitions' type: DEPENDENT key: gcp.cloudsql.mysql.open_table_definitions delay: '0' history: 7d trends: 90d description: 'The number of table definitions that are currently cached.' preprocessing: - type: JSONPATH parameters: - $.mysql_open_table_definitions master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: tables - uuid: 3d3ec2e37bf94fb68c40967b56dfd95c name: 'GCP Cloud SQL MySQL: Network: Bytes received by MySQL' type: DEPENDENT key: gcp.cloudsql.mysql_received_bytes_count delay: '0' history: 7d trends: 90d units: B description: 'Delta count of bytes received by MySQL process.' preprocessing: - type: JSONPATH parameters: - $.mysql_received_bytes_count master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: f926beb31be44dc0bfb30c571fac280a name: 'GCP Cloud SQL MySQL: Network: Bytes sent by MySQL' type: DEPENDENT key: gcp.cloudsql.mysql_sent_bytes_count delay: '0' history: 7d trends: 90d units: B description: 'Delta count of bytes sent by MySQL process.' preprocessing: - type: JSONPATH parameters: - $.mysql_sent_bytes_count master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: bbdeb595ab1b44d7a332fbf0c2637403 name: 'GCP Cloud SQL MySQL: Queries' type: DEPENDENT key: gcp.cloudsql.queries delay: '0' history: 7d trends: 90d description: 'Delta of statements executed by the server.' preprocessing: - type: JSONPATH parameters: - $.mysql_queries master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: queries - uuid: 114fb26dcdc1441c84c150c7809b3400 name: 'GCP Cloud SQL MySQL: Questions' type: DEPENDENT key: gcp.cloudsql.questions delay: '0' history: 7d trends: 90d description: 'Delta of statements executed by the server sent by the client.' preprocessing: - type: JSONPATH parameters: - $.mysql_questions master_item: key: gcp.cloudsql.mysql.metrics.get tags: - tag: component value: queries tags: - tag: class value: cloud - tag: target value: cloudsql - tag: target value: gcp - tag: target value: google-cloud-platform - tag: target value: mysql macros: - macro: '{$CLOUD_SQL.MYSQL.CPU.UTIL.MAX}' value: '95' description: 'GCP Cloud SQL MySQL instance CPU usage threshold.' - macro: '{$CLOUD_SQL.MYSQL.DISK.UTIL.CRIT}' value: '90' description: 'GCP Cloud SQL MySQL instance critical disk usage threshold.' - macro: '{$CLOUD_SQL.MYSQL.DISK.UTIL.WARN}' value: '80' description: 'GCP Cloud SQL MySQL instance warning disk usage threshold.' - macro: '{$CLOUD_SQL.MYSQL.RAM.UTIL.MAX}' value: '90' description: 'GCP Cloud SQL MySQL instance RAM usage threshold.' - macro: '{$GCP.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$GCP.TIME.WINDOW}' value: 5m description: | Time interval for the data requests. Supported usage type: 1. The default update interval for most of the items. 2. The minimal time window for the data requested in the Monitoring Query Language REST API request. dashboards: - uuid: 5932cc56f6f146db8fac121b3817a407 name: 'MySQL instance' pages: - name: 'MySQL instance' widgets: - type: graph width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.cpu.usage_time - type: graph x: '12' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.cpu.utilization - type: graph 'y': '5' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MySQL by HTTP' name: 'GCP Cloud SQL MySQL: Memory usage' - type: graph x: '12' 'y': '5' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.memory.utilization - type: graph 'y': '10' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.disk.utilization - type: graph x: '12' 'y': '10' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MySQL by HTTP' name: 'GCP Cloud SQL MySQL: Disk read/write operations' - type: graph 'y': '15' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MySQL by HTTP' name: 'GCP Cloud SQL MySQL: Network traffic' - type: graph x: '12' 'y': '15' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.network.connections - type: graph 'y': '20' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MySQL by HTTP' name: 'GCP Cloud SQL MySQL: pages' - type: graph x: '12' 'y': '20' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MySQL by HTTP' name: 'GCP Cloud SQL MySQL: Queries' valuemaps: - uuid: 8aa36f0f6a0b42a3b5e0eabfb700e8db name: 'Database availability' mappings: - value: '0' newvalue: Down - value: '1' newvalue: Up - uuid: 9adad9dad34646d79bcc6c414ddf8afe name: 'Instance state' mappings: - value: '0' newvalue: Running - value: '1' newvalue: Suspended - value: '2' newvalue: Runnable - value: '3' newvalue: 'Pending create' - value: '4' newvalue: Maintenance - value: '5' newvalue: Failed - value: '6' newvalue: 'Unknown state' - value: '10' newvalue: 'Data retrievement error' - uuid: 9d7871c093f9489293421396b9fea668 template: 'GCP Cloud SQL MySQL Replica by HTTP' name: 'GCP Cloud SQL MySQL Replica by HTTP' description: | Get GCP Cloud SQL MySQL monitoring for read-only replicas with script item usage to perform HTTP requests to Google Cloud Platform Monitoring API. This template will be automatically connected to discovered entities with all their required parameters pre-defined. 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: 17aa9eb4749e46be9b0b0f93ef011fca name: 'GCP Cloud SQL MySQL: Last I/O thread error number' type: DEPENDENT key: gcp.cloudsql.mysql.repl.last_io_errno delay: '0' history: 7d trends: 90d description: 'The error number of the most recent error that caused the I/O thread to stop.' preprocessing: - type: JSONPATH parameters: - $.last_io_errno master_item: key: gcp.cloudsql.mysql.repl.metrics.get tags: - tag: component value: replication - uuid: 52c11965a2fc4d37a97ebccc04ee7b80 name: 'GCP Cloud SQL MySQL: Last SQL thread error number' type: DEPENDENT key: gcp.cloudsql.mysql.repl.last_sql_errno delay: '0' history: 7d trends: 90d description: 'The error number of the most recent error that caused the SQL thread to stop.' preprocessing: - type: JSONPATH parameters: - $.last_sql_errno master_item: key: gcp.cloudsql.mysql.repl.metrics.get tags: - tag: component value: replication - uuid: 470200d2cca348bb8a670a2be3a270e3 name: 'GCP Cloud SQL MySQL: Replica metrics get' type: SCRIPT key: gcp.cloudsql.mysql.repl.metrics.get delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'cloudsql.googleapis.com/database/replication/', mysql_path = 'cloudsql.googleapis.com/database/mysql/replication/', raw_metrics, obj = {}, base_paths = ['network_lag', 'replica_lag'].map(function (path) { return base_path + path; }), mysql_paths = [ 'last_io_errno', 'last_sql_errno', 'slave_io_running', 'slave_sql_running'].map(function (path) { return mysql_path + path; }).concat( ['network_lag', 'replica_lag'].map(function (path) { return base_path + path; })); function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function checkParams(params) { ['project_id', 'time_window', 'database_id', 'token'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } return params; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; var params = checkParams(JSON.parse(value)), time_window = params.time_window, project = params.project_id, filter = ' | within ' + time_window + " | filter database_id = '" + params.database_id + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query'; var metric_raw = getHttpData(url, params.token, { query: '{' + mysql_paths.join(';') + '}' + j_filter }); var metric_keys = getField(metric_raw, 'timeSeriesDescriptor.pointDescriptors'), metric_values = getField(metric_raw, 'timeSeriesData.0.pointData.0.values'), re = /(^t_\d+\.value\.)/g; for (i in metric_keys) { var value_types = ['int64Value', 'doubleValue', 'stringValue', 'boolValue']; for (v in value_types) { if (typeof metric_values[i][value_types[v]] !== 'undefined') { obj[getField(metric_keys[i], 'key').replace(re, "")] = metric_values[i][value_types[v]]; } } } var state_raw = getHttpData(url, params.token, { query: base_path + 'state' + filter }), state_keys = getField(state_raw, 'timeSeriesDescriptor.pointDescriptors'), state_tsd = getField(state_raw, 'timeSeriesData'); for (i in state_keys) { var state_key = getField(state_keys[i], 'key').replace(/value\./g, ''); obj[state_key] = 'undefined'; for (t in state_tsd) { if (getField(state_tsd[t], 'pointData.0.values.' + i + '.boolValue') == true) { obj[state_key] = getField(state_tsd[t], 'labelValues.3.stringValue'); break; } } } return JSON.stringify(obj); description: 'MySQL replication metrics data in raw format.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: database_id value: '{$GCP.PROJECT.ID}:{HOST.NAME}' - name: token value: '{$GCP.AUTH.TOKEN}' tags: - tag: component value: raw - uuid: e84ac3a2537848b29024659ab5e3a0e9 name: 'GCP Cloud SQL MySQL: Network lag' type: DEPENDENT key: gcp.cloudsql.mysql.repl.network_lag delay: '0' history: 7d trends: 90d units: s description: 'Indicates time taken from primary binary log to IO thread on replica.' preprocessing: - type: JSONPATH parameters: - $.network_lag master_item: key: gcp.cloudsql.mysql.repl.metrics.get tags: - tag: component value: replication - uuid: b5f9960de9414975ac48357844a15860 name: 'GCP Cloud SQL MySQL: Replication lag' type: DEPENDENT key: gcp.cloudsql.mysql.repl.replica_lag delay: '0' history: 7d trends: 90d units: s description: 'Number of seconds the read replica is behind its primary (approximation).' preprocessing: - type: JSONPATH parameters: - $.replica_lag master_item: key: gcp.cloudsql.mysql.repl.metrics.get tags: - tag: component value: replication - uuid: 0c093a0416f24afb96fc28a7abb283d4 name: 'GCP Cloud SQL MySQL: Slave I/O thread running' type: DEPENDENT key: gcp.cloudsql.mysql.repl.slave_io_running delay: '0' history: 7d trends: 90d description: | Indicates whether the I/O thread for reading the primary's binary log is running. Possible values are Yes, No and Connecting. valuemap: name: 'Thread state' preprocessing: - type: JSONPATH parameters: - $.slave_io_running - type: JAVASCRIPT parameters: - | const idx = [ 'No', 'Yes', 'Connecting', ].indexOf(value); return idx !== -1 ? idx : 10; master_item: key: gcp.cloudsql.mysql.repl.metrics.get tags: - tag: component value: replication - uuid: 994d92340dd146a381f2e6bbebd1c3f2 name: 'GCP Cloud SQL MySQL: Slave SQL thread running' type: DEPENDENT key: gcp.cloudsql.mysql.repl.slave_sql_running delay: '0' history: 7d trends: 90d description: 'Indicates whether the SQL thread for executing events in the relay log is running.' valuemap: name: 'Thread state' preprocessing: - type: JSONPATH parameters: - $.slave_sql_running - type: BOOL_TO_DECIMAL parameters: - '' master_item: key: gcp.cloudsql.mysql.repl.metrics.get tags: - tag: component value: replication - uuid: 90a9154072164b5c89d715fa77e7e2b0 name: 'GCP Cloud SQL MySQL: Replication state' type: DEPENDENT key: gcp.cloudsql.mysql.repl.state delay: '0' history: 7d trends: 90d description: | The current serving state of replication. This metric is only available for the MySQL/PostgreSQL instances. valuemap: name: 'Replication state' preprocessing: - type: JSONPATH parameters: - $.state - type: JAVASCRIPT parameters: - | const idx = [ 'Running', 'Syncing', 'Unsynced', 'Stopped', 'Error', ].indexOf(value); return idx !== -1 ? idx : 10; master_item: key: gcp.cloudsql.mysql.repl.metrics.get tags: - tag: component value: replication - tag: component value: status tags: - tag: class value: cloud - tag: target value: cloudsql - tag: target value: gcp - tag: target value: google-cloud-platform - tag: target value: mysql - tag: target value: replica macros: - macro: '{$GCP.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$GCP.TIME.WINDOW}' value: 5m description: | Time interval for the data requests. Supported usage type: 1. The default update interval for most of the items. 2. The minimal time window for the data requested in the Monitoring Query Language REST API request. dashboards: - uuid: 76eda12212f045388bef22cb382eff6b name: 'MySQL replica' pages: - name: 'MySQL replica' widgets: - type: graph width: '24' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL MySQL Replica by HTTP' name: 'GCP Cloud SQL MySQL: Lags' - type: item name: 'I/O Thread Error' x: '6' 'y': '5' width: '6' height: '3' fields: - type: INTEGER name: show value: '2' - type: INTEGER name: adv_conf value: '1' - type: INTEGER name: decimal_size value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MySQL Replica by HTTP' key: gcp.cloudsql.mysql.repl.last_io_errno - type: item name: 'I/O Thread State' 'y': '5' width: '6' height: '3' fields: - type: INTEGER name: show value: '2' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MySQL Replica by HTTP' key: gcp.cloudsql.mysql.repl.slave_io_running - type: item name: 'SQL Thread Error' x: '18' 'y': '5' width: '6' height: '3' fields: - type: INTEGER name: show value: '2' - type: INTEGER name: adv_conf value: '1' - type: INTEGER name: decimal_size value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MySQL Replica by HTTP' key: gcp.cloudsql.mysql.repl.last_sql_errno - type: item name: 'SQL Thread State' x: '12' 'y': '5' width: '6' height: '3' fields: - type: INTEGER name: show value: '2' - type: INTEGER name: adv_conf value: '1' - type: INTEGER name: decimal_size value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL MySQL Replica by HTTP' key: gcp.cloudsql.mysql.repl.slave_sql_running valuemaps: - uuid: ea83090a16d94eb3bb643009c784d820 name: 'Replication state' mappings: - value: '0' newvalue: Running - value: '1' newvalue: Syncing - value: '2' newvalue: Unsynced - value: '3' newvalue: Stopped - value: '4' newvalue: Error - value: '10' newvalue: Unknown - uuid: b1acfa66a401499cae56777db6c7750b name: 'Thread state' mappings: - value: '0' newvalue: 'No' - value: '1' newvalue: 'Yes' - value: '2' newvalue: Connecting - value: '10' newvalue: Unknown - uuid: e74c1e12f82e4d9880a368b53f5e65a4 template: 'GCP Cloud SQL PostgreSQL by HTTP' name: 'GCP Cloud SQL PostgreSQL by HTTP' description: | Get GCP Cloud SQL PostgreSQL instances monitoring with script item usage to perform HTTP requests to Google Cloud Platform Monitoring API. This template will be automatically connected to discovered entities with all their required parameters pre-defined. 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: 396a555958514890af339f4504a96cc6 name: 'GCP Cloud SQL PostgreSQL: Reserved CPU cores' type: DEPENDENT key: gcp.cloudsql.pgsql.cpu.reserved_cores delay: '0' history: 7d trends: 90d value_type: FLOAT description: 'Number of cores reserved for the database.' preprocessing: - type: JSONPATH parameters: - $.base_reserved_cores master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: cpu - uuid: aa2e6d9118ed4b198ed9a28932ea8539 name: 'GCP Cloud SQL PostgreSQL: CPU usage time' type: DEPENDENT key: gcp.cloudsql.pgsql.cpu.usage_time delay: '0' history: 7d trends: 90d value_type: FLOAT units: s description: 'Cumulative CPU usage time in seconds.' preprocessing: - type: JSONPATH parameters: - $.base_usage_time master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: cpu - uuid: cb7cd1b74e4944d88334f22d25b985fa name: 'GCP Cloud SQL PostgreSQL: CPU utilization' type: DEPENDENT key: gcp.cloudsql.pgsql.cpu.utilization delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: 'Current CPU utilization represented as a percentage of the reserved CPU that is currently in use.' preprocessing: - type: JSONPATH parameters: - $.base_utilization - type: MULTIPLIER parameters: - '100' master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: cpu triggers: - uuid: 3ca3942121bd41029645a19fd3947416 expression: 'min(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.cpu.utilization,5m) >= {$CLOUD_SQL.PGSQL.CPU.UTIL.MAX}' name: 'GCP Cloud SQL PostgreSQL: High CPU utilization' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: AVERAGE description: 'The CPU utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: 27ad9640bf734dd49548c19241cc4838 name: 'GCP Cloud SQL PostgreSQL: DB engine state' type: HTTP_AGENT key: gcp.cloudsql.pgsql.db.state history: 7d description: 'GCP Cloud SQL PostgreSQL DB Engine State.' valuemap: name: 'Database availability' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' - type: JSONPATH parameters: - '$.timeSeriesData[0].pointData[0].values[0].int64Value' error_handler: DISCARD_VALUE - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 10m timeout: '{$GCP.DATA.TIMEOUT}' url: 'https://monitoring.googleapis.com/v3/projects/{$GCP.PROJECT.ID}/timeSeries:query' posts: '{"query":"cloudsql.googleapis.com/database/up | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}' status_codes: '' headers: - name: Content-Type value: application/json - name: Authorization value: 'Bearer {$GCP.AUTH.TOKEN}' request_method: POST tags: - tag: component value: status triggers: - uuid: f7b0fc21edcf489ab174eb06dee4fabe expression: | last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.db.state)=0 name: 'GCP Cloud SQL PostgreSQL: Database engine is down' priority: AVERAGE description: | Database engine is down. If an instance experiences unplanned (non-maintenance) downtime, the instance state will still be RUNNING, but the database engine state metric will report 0. dependencies: - name: 'GCP Cloud SQL PostgreSQL: Failed to get the instance state' expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 10' - name: 'GCP Cloud SQL PostgreSQL: Instance is in failed state' expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 5' - name: 'GCP Cloud SQL PostgreSQL: Instance is in maintenance' expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 4' - name: 'GCP Cloud SQL PostgreSQL: Instance is in suspended state' expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 1' - name: 'GCP Cloud SQL PostgreSQL: Instance is in unknown state' expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 6' - name: 'GCP Cloud SQL PostgreSQL: Instance is stopped by the owner' expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 2' tags: - tag: scope value: availability - uuid: 799cad827e8b44d98b8285b08153842d name: 'GCP Cloud SQL PostgreSQL: Disk bytes used' type: DEPENDENT key: gcp.cloudsql.pgsql.disk.bytes_used delay: '0' history: 7d trends: 90d units: B description: 'Data utilization in bytes.' preprocessing: - type: JSONPATH parameters: - $.pgsql_bytes_used master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: storage - uuid: 470510bf76fb47fbbddfc8c4a711a335 name: 'GCP Cloud SQL PostgreSQL: Disk size' type: DEPENDENT key: gcp.cloudsql.pgsql.disk.quota delay: '0' history: 7d trends: 90d units: B description: 'Maximum data disk size in bytes.' preprocessing: - type: JSONPATH parameters: - $.pgsql_quota master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: storage - uuid: f12ba5129c2d435389f4fb6964294381 name: 'GCP Cloud SQL PostgreSQL: Disk read I/O' type: DEPENDENT key: gcp.cloudsql.pgsql.disk.read_ops_count delay: '0' history: 7d trends: 90d description: 'Delta count of data disk read I/O operations.' preprocessing: - type: JSONPATH parameters: - $.base_read_ops_count master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: storage - uuid: e2d6702514b941cb9586cb98786c6a01 name: 'GCP Cloud SQL PostgreSQL: Disk utilization' type: DEPENDENT key: gcp.cloudsql.pgsql.disk.utilization delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: | The fraction of the disk quota that is currently in use. Shown as percentage. preprocessing: - type: JSONPATH parameters: - $.pgsql_utilization - type: MULTIPLIER parameters: - '100' master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: storage triggers: - uuid: c4fa1d580ffd4546b82605f94da5d2ba expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.disk.utilization) >= {$CLOUD_SQL.PGSQL.DISK.UTIL.CRIT}' name: 'GCP Cloud SQL PostgreSQL: Disk space is critically low' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: AVERAGE description: 'Critical utilization of the disk space.' tags: - tag: scope value: capacity - uuid: 186a707ca3194c32a894ae809177a7e2 expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.disk.utilization) >= {$CLOUD_SQL.PGSQL.DISK.UTIL.WARN}' name: 'GCP Cloud SQL PostgreSQL: Disk space is low' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: WARNING description: 'High utilization of the storage space.' dependencies: - name: 'GCP Cloud SQL PostgreSQL: Disk space is critically low' expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.disk.utilization) >= {$CLOUD_SQL.PGSQL.DISK.UTIL.CRIT}' tags: - tag: scope value: capacity - uuid: 8d8d6c13cdb244cb80c03226b7c14a90 name: 'GCP Cloud SQL PostgreSQL: Disk write I/O' type: DEPENDENT key: gcp.cloudsql.pgsql.disk.write_ops_count delay: '0' history: 7d trends: 90d description: 'Delta count of data disk write I/O operations.' preprocessing: - type: JSONPATH parameters: - $.base_write_ops_count master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: storage - uuid: 88fd41960538460ebfd2ed9194677cd1 name: 'GCP Cloud SQL PostgreSQL: Instance state' type: HTTP_AGENT key: gcp.cloudsql.pgsql.inst.state history: 7d description: 'GCP Cloud SQL PostgreSQL Current instance state.' valuemap: name: 'Instance state' preprocessing: - type: JSONPATH parameters: - '$.timeSeriesData[0].pointData[0].values[0].stringValue' error_handler: CUSTOM_VALUE error_handler_params: '10' - type: JAVASCRIPT parameters: - | const idx = [ 'RUNNING', 'SUSPENDED', 'RUNNABLE', 'PENDING_CREATE', 'MAINTENANCE', 'FAILED', 'UNKNOWN_STATE' ].indexOf(value); return idx !== -1 ? idx : 10; - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 10m timeout: '{$GCP.DATA.TIMEOUT}' url: 'https://monitoring.googleapis.com/v3/projects/{$GCP.PROJECT.ID}/timeSeries:query' posts: '{"query":"cloudsql.googleapis.com/database/state | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}' status_codes: '' headers: - name: Content-Type value: application/json - name: Authorization value: 'Bearer {$GCP.AUTH.TOKEN}' request_method: POST tags: - tag: component value: status triggers: - uuid: 596020e32d0c4193a6626c960b4b5be8 expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 10' name: 'GCP Cloud SQL PostgreSQL: Failed to get the instance state' priority: AVERAGE description: | Failed to get the instance state. Check access permissions to GCP API or service account. tags: - tag: scope value: availability - uuid: 1a2efb6f755444c0bab85d2778018eb1 expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 5' name: 'GCP Cloud SQL PostgreSQL: Instance is in failed state' priority: AVERAGE description: | The instance creation failed, or an operation left the instance in an own bad state. tags: - tag: scope value: availability - uuid: aad6fb2d86c84e33868aacbf160c3d65 expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 4' name: 'GCP Cloud SQL PostgreSQL: Instance is in maintenance' priority: INFO description: 'The instance is down for maintenance.' tags: - tag: scope value: availability - uuid: 959072ed00c4461196bef71618799b82 expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 1' name: 'GCP Cloud SQL PostgreSQL: Instance is in suspended state' priority: WARNING description: | The instance is in suspended state. It is not available, for example, due to problems with billing. tags: - tag: scope value: availability - uuid: 5f1084f744b444f3b803110baf703973 expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 6' name: 'GCP Cloud SQL PostgreSQL: Instance is in unknown state' priority: AVERAGE description: | The state of the instance is unknown. tags: - tag: scope value: availability - uuid: fb0df2eb001649febb6fc6513e056fcc expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 2' name: 'GCP Cloud SQL PostgreSQL: Instance is stopped by the owner' priority: INFO description: | The instance has been stopped by the owner. It is not currently running, but it's ready to be restarted. tags: - tag: scope value: availability - uuid: 014d96156a364f2c8eac6a47de3eddfe name: 'GCP Cloud SQL PostgreSQL: Memory size' type: DEPENDENT key: gcp.cloudsql.pgsql.memory.quota delay: '0' history: 7d trends: 90d units: B description: 'Maximum RAM size in bytes.' preprocessing: - type: JSONPATH parameters: - $.base_quota master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: memory - uuid: e73876fa0728402db7688a41938f4a12 name: 'GCP Cloud SQL PostgreSQL: Memory used by DB engine' type: DEPENDENT key: gcp.cloudsql.pgsql.memory.total_usage delay: '0' history: 7d trends: 90d units: B description: | Total RAM usage in bytes. This metric reports the RAM usage of the database process, including the buffer/cache. preprocessing: - type: JSONPATH parameters: - $.base_total_usage master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: memory - uuid: 2a5daa0300564b97a5e744e576a217cb name: 'GCP Cloud SQL PostgreSQL: Memory usage' type: DEPENDENT key: gcp.cloudsql.pgsql.memory.usage delay: '0' history: 7d trends: 90d units: B description: | The RAM usage in bytes. This metric reports the RAM usage of the server, excluding the buffer/cache. preprocessing: - type: JSONPATH parameters: - $.base_usage master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: memory - uuid: 4c524a81bf3b4a6bbc87d23b60c4f74c name: 'GCP Cloud SQL PostgreSQL: Memory utilization' type: DEPENDENT key: gcp.cloudsql.pgsql.memory.utilization delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: | The fraction of the memory quota that is currently in use. Shown as percentage. preprocessing: - type: JSONPATH parameters: - $.base_ram_pused master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: memory triggers: - uuid: bbbdbd9c3c5b407491b359f98e4e3fa9 expression: 'min(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.memory.utilization,5m) >= {$CLOUD_SQL.PGSQL.RAM.UTIL.MAX}' name: 'GCP Cloud SQL PostgreSQL: High memory utilization' opdata: 'Current utilization: {ITEM.LASTVALUE}' priority: HIGH description: 'RAM utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: 9bf09a42ddd64f7eabf6bbc011eda689 name: 'GCP Cloud SQL PostgreSQL: Metrics get' type: SCRIPT key: gcp.cloudsql.pgsql.metrics.get delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'cloudsql.googleapis.com/database/', pgsql_path = 'cloudsql.googleapis.com/database/postgresql/', obj = {}, value_types = ['int64Value', 'doubleValue', 'stringValue', 'boolValue']; function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function checkParams(params) { ['project_id', 'time_window', 'database_id', 'token'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } return params; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; function rawMap(raw, prefix) { var keys = getField(raw, 'timeSeriesDescriptor.pointDescriptors'), values = getField(raw, 'timeSeriesData.0.pointData.0.values'), re = /(^t_\d+\.value(_|\.)|_sum$)/g; for (i in keys) { var key = getField(keys[i], 'key').replace(re, ''); for (v in value_types) { if (typeof values[i][value_types[v]] !== 'undefined') { if (prefix) { obj[prefix + key] = values[i][value_types[v]]; } else { obj[key] = values[i][value_types[v]]; } } } } return obj; } function singleMetrics(tsd) { result = {}; for (t in tsd) { for (v in value_types) { if (typeof tsd[t].pointData[0].values[0][value_types[v]] !== 'undefined') { result['pgsql_' + getField(tsd[t], 'labelValues.3.stringValue').toLowerCase()] = tsd[t].pointData[0].values[0][value_types[v]]; } } } return result; } var params = checkParams(JSON.parse(value)), time_window = params.time_window, project = params.project_id, filter = ' | within ' + time_window + " | filter database_id = '" + params.database_id + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query', base_paths = [ 'cpu/reserved_cores', 'cpu/usage_time', 'cpu/utilization', 'disk/read_ops_count', 'disk/write_ops_count', 'memory/quota', 'memory/total_usage', 'memory/usage', 'network/received_bytes_count', 'network/sent_bytes_count | map ignore [destination]' ].map(function (path) { return base_path + path; }), pgsql_paths = [ 'transaction_id_utilization ' + filter, 'temp_bytes_written_count' + filter + ' | sum', 'temp_files_written_count' + filter + ' | sum', 'num_backends' + filter + ' | sum' ].map(function (path) { return pgsql_path + path; }).concat( ['disk/bytes_used', 'disk/utilization', 'disk/quota'].map(function (path) { return base_path + path; })), queries = [ { name: 'base_', data: { query: '{' + base_paths.join(';') + '}' + j_filter } }, { name: 'pgsql_', data: { query: '{' + pgsql_paths.join(';') + '}' + '| within ' + time_window + '| join' } } ]; for (q in queries) { raw = getHttpData(url, params.token, queries[q].data); obj = Object.assign(obj, rawMap(raw, queries[q].name)); } obj.base_ram_pused = Math.floor((getField(obj, 'base_usage') / getField(obj, 'base_quota')) * 100); var single_paths = ['transaction_id_count', 'vacuum/oldest_transaction_age'], single_queries = single_paths.map(function (path) { return { query: pgsql_path + path + filter }; }); for (q in single_queries) { raw = getHttpData(url, params.token, single_queries[q]); Object.assign(obj, singleMetrics(getField(raw, 'timeSeriesData'))); } return JSON.stringify(obj); description: 'PostgreSQL metrics data in raw format.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: database_id value: '{$GCP.PROJECT.ID}:{HOST.NAME}' - name: token value: '{$GCP.AUTH.TOKEN}' tags: - tag: component value: raw - uuid: f2d00c86eedd4a1e8efce7661c3da18d name: 'GCP Cloud SQL PostgreSQL: Network: Received bytes' type: DEPENDENT key: gcp.cloudsql.pgsql.network.received_bytes_count delay: '0' history: 7d trends: 90d units: B description: 'Delta count of bytes received through the network.' preprocessing: - type: JSONPATH parameters: - $.base_received_bytes_count master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: dc67deac1a2f4cc993406028d6cc8c3b name: 'GCP Cloud SQL PostgreSQL: Network: Sent bytes' type: DEPENDENT key: gcp.cloudsql.pgsql.network.sent_bytes_count delay: '0' history: 7d trends: 90d units: B description: 'Delta count of bytes sent through the network.' preprocessing: - type: JSONPATH parameters: - $.base_sent_bytes_count master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 512c5d8156fb4d5299284f708e64dffc name: 'GCP Cloud SQL PostgreSQL: Connections' type: DEPENDENT key: gcp.cloudsql.pgsql.num_backends delay: '0' history: 7d trends: 90d description: | The number of the connections to the Cloud SQL PostgreSQL instance. Includes connections to the system databases, which aren't visible by default. preprocessing: - type: JSONPATH parameters: - $.pgsql_num_backends master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: connections - tag: component value: network - uuid: 88603b1881114551ba23e8f12d5ab47f name: 'GCP Cloud SQL PostgreSQL: Oldest prepared transaction age' type: DEPENDENT key: gcp.cloudsql.pgsql.oldest_transaction.prepared delay: '0' history: 7d trends: 90d description: | Age of the oldest prepared transaction yet to be vacuumed in the Cloud SQL PostgreSQL instance, measured in number of transactions that have happened since the oldest transaction. Empty value when there is no such transaction type. preprocessing: - type: JSONPATH parameters: - $.pgsql_prepared error_handler: DISCARD_VALUE master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: transactions - uuid: 50df8067afcb42a9ac44fe963ee635d2 name: 'GCP Cloud SQL PostgreSQL: Oldest replica transaction age' type: DEPENDENT key: gcp.cloudsql.pgsql.oldest_transaction.replica delay: '0' history: 7d trends: 90d description: | Age of the oldest replica transaction yet to be vacuumed in the Cloud SQL PostgreSQL instance, measured in number of transactions that have happened since the oldest transaction. Empty value when there is no such transaction type. preprocessing: - type: JSONPATH parameters: - $.pgsql_replica error_handler: DISCARD_VALUE master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: transactions - uuid: fee3d72f615c479389c5fdb46f32229f name: 'GCP Cloud SQL PostgreSQL: Oldest replication slot transaction age' type: DEPENDENT key: gcp.cloudsql.pgsql.oldest_transaction.replication_slot delay: '0' history: 7d trends: 90d description: | Age of the oldest replication slot transaction yet to be vacuumed in the Cloud SQL PostgreSQL instance, measured in number of transactions that have happened since the oldest transaction. Empty value when there is no such transaction type. preprocessing: - type: JSONPATH parameters: - $.pgsql_replication_slot error_handler: DISCARD_VALUE master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: transactions - uuid: 6d51c4865cd04607986ef4e02bc43fb6 name: 'GCP Cloud SQL PostgreSQL: Oldest running transaction age' type: DEPENDENT key: gcp.cloudsql.pgsql.oldest_transaction.running delay: '0' history: 7d trends: 90d description: | Age of the oldest running transaction yet to be vacuumed in the Cloud SQL PostgreSQL instance, measured in number of transactions that have happened since the oldest transaction. Empty value when there is no such transaction type. preprocessing: - type: JSONPATH parameters: - $.pgsql_running error_handler: DISCARD_VALUE master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: transactions - uuid: 75bc8d76a59a465fb66a434e13de107d name: 'GCP Cloud SQL PostgreSQL: Data written to temporary' type: DEPENDENT key: gcp.cloudsql.pgsql.temp_bytes_written_count delay: '0' history: 7d trends: 90d units: B description: 'Total data size (in bytes) written to temporary files by the queries.' preprocessing: - type: JSONPATH parameters: - $.pgsql_temp_bytes_written_count master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: storage - uuid: bd10ec6251c444a79878e82e3ebe9ac0 name: 'GCP Cloud SQL PostgreSQL: Temporary files used for writing data' type: DEPENDENT key: gcp.cloudsql.pgsql.temp_files_written_count delay: '0' history: 7d trends: 90d description: 'Total number of temporary files used for writing data while performing algorithms such as join and sort.' preprocessing: - type: JSONPATH parameters: - $.pgsql_temp_files_written_count master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: storage - uuid: 2498b066f4964aa7be03f4cc43eab95e name: 'GCP Cloud SQL PostgreSQL: Assigned transactions' type: DEPENDENT key: gcp.cloudsql.pgsql.transaction_id_count_assigned delay: '0' history: 7d trends: 90d description: 'Delta count of assigned transaction IDs.' preprocessing: - type: JSONPATH parameters: - $.pgsql_assigned master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: transactions - uuid: 23d1b88571d347db9672596ec13580cc name: 'GCP Cloud SQL PostgreSQL: Frozen transactions' type: DEPENDENT key: gcp.cloudsql.pgsql.transaction_id_count_frozen delay: '0' history: 7d trends: 90d description: 'Delta count of frozen transaction IDs.' preprocessing: - type: JSONPATH parameters: - $.pgsql_frozen master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: transactions - uuid: 004042d342d0478ea8f826466353454d name: 'GCP Cloud SQL PostgreSQL: Transaction ID utilization' type: DEPENDENT key: gcp.cloudsql.pgsql.transaction_id_utilization delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: 'Current utilization represented as a percentage of transaction IDs consumed by the Cloud SQL PostgreSQL instance.' preprocessing: - type: JSONPATH parameters: - $.pgsql_transaction_id_utilization - type: MULTIPLIER parameters: - '100' master_item: key: gcp.cloudsql.pgsql.metrics.get tags: - tag: component value: transactions discovery_rules: - uuid: 090d05a647384858a8b9efe5502c0a76 name: 'GCP Cloud SQL PostgreSQL: Databases discovery' type: HTTP_AGENT key: gcp.cloudsql.pgsql.db.discovery delay: 1h filter: evaltype: AND conditions: - macro: '{#PGSQL.DB.NAME}' value: '{$GCP.CLOUD_SQL.DB.NAME.MATCHES}' formulaid: A - macro: '{#PGSQL.DB.NAME}' value: '{$GCP.CLOUD_SQL.DB.NAME.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B lifetime: 7d description: 'Databases discovery for the particular PostgreSQL instance.' item_prototypes: - uuid: 997bdb03ba0b437ca2705f28dcc651ed name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Buffer cache blocks read.' type: DEPENDENT key: 'gcp.cloudsql.pgsql.blocks_read_count_buffer_cache[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Number of buffer cache blocks read by the [{#PGSQL.DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - $.buffer_cache master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: memory - tag: database value: '{#PGSQL.DB.NAME}' - uuid: b35c4a888743448688a8c5233ed165e7 name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Disk blocks read.' type: DEPENDENT key: 'gcp.cloudsql.pgsql.blocks_read_count_disk[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Number of disk blocks read by the [{#PGSQL.DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - $.disk master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: storage - tag: database value: '{#PGSQL.DB.NAME}' - uuid: 7a1df30ae0c443839fe625142aea61b2 name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Metrics raw' type: SCRIPT key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'cloudsql.googleapis.com/database/postgresql/', obj = {}; function checkParams(params) { ['project_id', 'time_window', 'database_id', 'token'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } return params; } function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; function singleMetrics(tsd) { var result = {}; for (i in tsd) { result[getField(tsd[i], 'labelValues.4.stringValue')] = getField(tsd[i], 'pointData.0.values.0.int64Value'); } return result; } var params = checkParams(JSON.parse(value)), time_window = params.time_window, project = params.project_id, filter = ' | within ' + time_window + " | filter database_id ='" + params.database_id + "'" + " | filter database ='" + params.database_name + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query', common_paths = ['deadlock_count', 'tuples_returned_count', 'tuples_fetched_count']; var common_raw = getHttpData(url, params.token, { query: '{' + common_paths.map(function (path) { return base_path + path; }).join(';') + '}' + j_filter }), keys = getField(common_raw, 'timeSeriesDescriptor.pointDescriptors'), values = getField(common_raw, 'timeSeriesData.0.pointData.0.values'), re = /(^t_\d+\.value\.)/g; for (i in keys) { var value_types = ['int64Value', 'doubleValue', 'stringValue', 'boolValue']; for (v in value_types) { if (typeof values[i][value_types[v]] !== 'undefined') { obj[getField(keys[i], 'key').replace(re, '')] = values[i][value_types[v]]; } } } var single_paths = ['transaction_count', 'blocks_read_count', 'tuples_processed_count', 'tuple_size'], single_queries = single_paths.map(function (path) { return { query: base_path + path + filter }; }); for (q in single_queries) { raw = getHttpData(url, params.token, single_queries[q]); obj = Object.assign(obj, singleMetrics(getField(raw, 'timeSeriesData'))); } return JSON.stringify(obj); description: 'PostgreSQL metrics in raw format.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: database_id value: '{$GCP.PROJECT.ID}:{HOST.NAME}' - name: token value: '{$GCP.AUTH.TOKEN}' - name: database_name value: '{#PGSQL.DB.NAME}' tags: - tag: component value: raw - tag: database value: '{#PGSQL.DB.NAME}' - uuid: d5632c60593749209a6e681b396f4cc7 name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Deadlocks count' type: DEPENDENT key: 'gcp.cloudsql.pgsql.deadlock_count[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Number of deadlocks detected in the [{#PGSQL.DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - $.deadlock_count master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: deadlock - tag: database value: '{#PGSQL.DB.NAME}' - uuid: 6d846507fbc24cbb9fb4ad59167552db name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Committed transactions' type: DEPENDENT key: 'gcp.cloudsql.pgsql.transaction_count_commit[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Delta count of number of committed transactions to the [{#PGSQL.DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - $.commit master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: transactions - tag: database value: '{#PGSQL.DB.NAME}' - uuid: 4751ef5e498e4ce184bd07aadc831d2b name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Rolled-back transactions' type: DEPENDENT key: 'gcp.cloudsql.pgsql.transaction_count_rollback[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Delta count of number of rolled-back transactions in the [{#PGSQL.DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - $.rollback master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: transactions - tag: database value: '{#PGSQL.DB.NAME}' - uuid: a7451a61e0b04be8b1f85b47c44107e2 name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Tuples fetched' type: DEPENDENT key: 'gcp.cloudsql.pgsql.tuples_fetched_count[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Total number of rows fetched as a result of queries to the [{#PGSQL.DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - $.tuples_fetched_count master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: tuples - tag: database value: '{#PGSQL.DB.NAME}' - uuid: 7daca0b14f5843669bc5b0823cd4d44f name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Deleted rows processed' type: DEPENDENT key: 'gcp.cloudsql.pgsql.tuples_processed_count_delete[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Number of tuples(rows) processed for delete operations for the database with the name [{#PGSQL.DB.NAME}].' preprocessing: - type: JSONPATH parameters: - $.delete master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: tuples - tag: database value: '{#PGSQL.DB.NAME}' - uuid: 48a7613fa611410b8353d03d87af0f8d name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Inserted rows processed.' type: DEPENDENT key: 'gcp.cloudsql.pgsql.tuples_processed_count_insert[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Number of tuples(rows) processed for insert operations for the database with the name [{#PGSQL.DB.NAME}].' preprocessing: - type: JSONPATH parameters: - $.insert master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: tuples - tag: database value: '{#PGSQL.DB.NAME}' - uuid: e159cc28aec6448b9162f780479f5aab name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Updated rows processed' type: DEPENDENT key: 'gcp.cloudsql.pgsql.tuples_processed_count_update[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Number of tuples(rows) processed for update operations for the database with the name [{#PGSQL.DB.NAME}].' preprocessing: - type: JSONPATH parameters: - $.update master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: tuples - tag: database value: '{#PGSQL.DB.NAME}' - uuid: ee6fad5b2fb44a14a29c7cd662b1f5d2 name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Tuples returned' type: DEPENDENT key: 'gcp.cloudsql.pgsql.tuples_returned_count[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Total number of rows scanned while processing the queries of the [{#PGSQL.DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - $.tuples_returned_count master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: tuples - tag: database value: '{#PGSQL.DB.NAME}' - uuid: f7a58601a3384b8ba24c89b3693ddb88 name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Dead tuples' type: DEPENDENT key: 'gcp.cloudsql.pgsql.tuple_size_dead[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Number of live tuples(rows) in the [{#PGSQL.DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - $.dead master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: tuples - tag: database value: '{#PGSQL.DB.NAME}' - uuid: 16e88225cd41406285b3237ee1e61bb4 name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Live tuples' type: DEPENDENT key: 'gcp.cloudsql.pgsql.tuple_size_live[{#PGSQL.DB.NAME}]' delay: '0' history: 7d trends: 90d description: 'Number of live tuples(rows) in the [{#PGSQL.DB.NAME}] database.' preprocessing: - type: JSONPATH parameters: - $.live master_item: key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]' tags: - tag: component value: tuples - tag: database value: '{#PGSQL.DB.NAME}' graph_prototypes: - uuid: 8ba7dd12152243b4a5a438bd649f96c1 name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Tuples' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: 'gcp.cloudsql.pgsql.tuple_size_dead[{#PGSQL.DB.NAME}]' - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: 'gcp.cloudsql.pgsql.tuple_size_live[{#PGSQL.DB.NAME}]' - sortorder: '2' color: 00611C item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: 'gcp.cloudsql.pgsql.tuples_processed_count_insert[{#PGSQL.DB.NAME}]' - sortorder: '3' color: F7941D item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: 'gcp.cloudsql.pgsql.tuples_processed_count_update[{#PGSQL.DB.NAME}]' - sortorder: '4' color: FC6EA3 item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: 'gcp.cloudsql.pgsql.tuples_processed_count_delete[{#PGSQL.DB.NAME}]' timeout: '{$GCP.DATA.TIMEOUT}' url: 'https://sqladmin.googleapis.com/sql/v1beta4/projects/{$GCP.PROJECT.ID}/instances/{HOST.NAME}/databases' headers: - name: Content-Type value: application/json - name: Authorization value: 'Bearer {$GCP.AUTH.TOKEN}' lld_macro_paths: - lld_macro: '{#PGSQL.DB.NAME}' path: $.name preprocessing: - type: JSONPATH parameters: - $.items - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h tags: - tag: class value: cloud - tag: target value: cloudsql - tag: target value: gcp - tag: target value: google-cloud-platform - tag: target value: postgresql macros: - macro: '{$CLOUD_SQL.PGSQL.CPU.UTIL.MAX}' value: '95' description: 'GCP Cloud SQL PostgreSQL instance CPU usage threshold.' - macro: '{$CLOUD_SQL.PGSQL.DISK.UTIL.CRIT}' value: '90' description: 'GCP Cloud SQL PostgreSQL instance critical disk usage threshold.' - macro: '{$CLOUD_SQL.PGSQL.DISK.UTIL.WARN}' value: '80' description: 'GCP Cloud SQL PostgreSQL instance warning disk usage threshold.' - macro: '{$CLOUD_SQL.PGSQL.RAM.UTIL.MAX}' value: '90' description: 'GCP Cloud SQL PostgreSQL instance RAM usage threshold.' - macro: '{$GCP.CLOUD_SQL.DB.NAME.MATCHES}' value: '.*' description: 'The filter to include GCP Cloud SQL PostgreSQL databases by namespace.' - macro: '{$GCP.CLOUD_SQL.DB.NAME.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Cloud SQL PostgreSQL databases by namespace.' - macro: '{$GCP.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$GCP.TIME.WINDOW}' value: 5m description: | Time interval for the data requests. Supported usage type: 1. The default update interval for most of the items. 2. The minimal time window for the data requested in the Monitoring Query Language REST API request. dashboards: - uuid: 21636cfe7d2f4de28d07af09c9812075 name: 'PostgreSQL instance' pages: - name: 'PostgreSQL instance' widgets: - type: graph width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.cpu.usage_time - type: graph x: '12' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.cpu.utilization - type: graph 'y': '5' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' name: 'GCP Cloud SQL PostgreSQL: Memory usage' - type: graph x: '12' 'y': '5' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.memory.utilization - type: graph 'y': '10' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.disk.utilization - type: graph x: '12' 'y': '10' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' name: 'GCP Cloud SQL PostgreSQL: Disk read/write operations' - type: graph 'y': '15' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' name: 'GCP Cloud SQL PostgreSQL: Network traffic' - type: graph x: '12' 'y': '15' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.transaction_id_utilization - type: graph 'y': '20' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' name: 'GCP Cloud SQL PostgreSQL: Transactions count' - type: graph x: '12' 'y': '20' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' name: 'GCP Cloud SQL PostgreSQL: Transaction age' - type: graphprototype 'y': '25' width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: GRAPH_PROTOTYPE name: graphid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Tuples' - type: graphprototype x: '12' 'y': '25' width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: INTEGER name: source_type value: '3' - type: ITEM_PROTOTYPE name: itemid value: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: 'gcp.cloudsql.pgsql.deadlock_count[{#PGSQL.DB.NAME}]' valuemaps: - uuid: c783556dfa214e73b676ca187648c5df name: 'Database availability' mappings: - value: '0' newvalue: Down - value: '1' newvalue: Up - uuid: bc3b08ca201d438689678a29e3575823 name: 'Instance state' mappings: - value: '0' newvalue: Running - value: '1' newvalue: Suspended - value: '2' newvalue: Runnable - value: '3' newvalue: 'Pending create' - value: '4' newvalue: Maintenance - value: '5' newvalue: Failed - value: '6' newvalue: 'Unknown state' - value: '10' newvalue: 'Data retrievement error' - uuid: b43a7c5f1d1d43d28e2eb8f0a9f6f16f template: 'GCP Cloud SQL PostgreSQL Replica by HTTP' name: 'GCP Cloud SQL PostgreSQL Replica by HTTP' description: | Get GCP Cloud SQL PostgreSQL monitoring for read-only replicas with script item usage to perform HTTP requests to Google Cloud Platform Monitoring API. This template will be automatically connected to discovered entities with all their required parameters pre-defined. 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: c67dd812c7784948bad5dfa0d9a6cc66 name: 'GCP Cloud SQL PostgreSQL: Flush location lag' type: DEPENDENT key: gcp.cloudsql.pgsql.repl.flush_location delay: '0' history: 7d trends: 90d units: B description: 'Flush location replication lag in bytes.' preprocessing: - type: JSONPATH parameters: - $.flush_location master_item: key: gcp.cloudsql.pgsql.repl.metrics.get tags: - tag: component value: replication - uuid: 2b8b51f0266049ffbfb7ece2f944fb68 name: 'GCP Cloud SQL PostgreSQL: Number of log archival failures' type: DEPENDENT key: gcp.cloudsql.pgsql.repl.log_archive_failure_count delay: '0' history: 7d trends: 90d description: 'Number of failed attempts for archiving replication log files.' preprocessing: - type: JSONPATH parameters: - $.log_archive_failure_count master_item: key: gcp.cloudsql.pgsql.repl.metrics.get tags: - tag: component value: replication - uuid: 4657c4bb904b437598b68410e47f7194 name: 'GCP Cloud SQL PostgreSQL: Number of log archival successes' type: DEPENDENT key: gcp.cloudsql.pgsql.repl.log_archive_success_count delay: '0' history: 7d trends: 90d description: 'Number of failed attempts for archiving replication log files.' preprocessing: - type: JSONPATH parameters: - $.log_archive_success_count master_item: key: gcp.cloudsql.pgsql.repl.metrics.get tags: - tag: component value: replication - uuid: cb9c5aff913e4deeb29dfa1a20b5ff04 name: 'GCP Cloud SQL PostgreSQL: Replica metrics get' type: SCRIPT key: gcp.cloudsql.pgsql.repl.metrics.get delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'cloudsql.googleapis.com/database/replication/', pgsql_path = 'cloudsql.googleapis.com/database/postgresql/replication/', obj = {}, base_paths = ['network_lag', 'replica_lag', 'log_archive_failure_count', 'log_archive_success_count']; function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function checkParams(params) { ['project_id', 'time_window', 'database_id', 'token'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } return params; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; var params = checkParams(JSON.parse(value)), time_window = params.time_window, project = params.project_id, filter = ' | within ' + time_window + " | filter database_id = '" + params.database_id + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query'; var metric_raw = getHttpData(url, params.token, { query: '{' + base_paths.map(function (path) { return base_path + path; }).join(';') + '}' + j_filter }); var metric_keys = getField(metric_raw, 'timeSeriesDescriptor.pointDescriptors'), metric_values = getField(metric_raw, 'timeSeriesData.0.pointData.0.values'), re = /(^t_\d+\.value\.)/g; for (i in metric_keys) { var value_types = ['int64Value', 'doubleValue', 'stringValue', 'boolValue']; for (v in value_types) { if (typeof metric_values[i][value_types[v]] !== 'undefined') { obj[getField(metric_keys[i], 'key').replace(re, '')] = metric_values[i][value_types[v]]; } } } var state_raw = getHttpData(url, params.token, { query: base_path + 'state' + filter }), state_keys = getField(state_raw, 'timeSeriesDescriptor.pointDescriptors'), state_tsd = getField(state_raw, 'timeSeriesData'); for (i in state_keys) { var state_key = getField(state_keys[i], 'key').replace(/value\./g, ''); obj[state_key] = 'undefined'; for (t in state_tsd) { if (getField(state_tsd[t], 'pointData.0.values.' + i + '.boolValue') == true) { obj[state_key] = getField(state_tsd[t], 'labelValues.3.stringValue'); break; } } } var lag_raw = getHttpData(url, params.token, { query: pgsql_path + 'replica_byte_lag' + '| within ' + time_window + " | filter replica_name = '" + params.database_id + "'" }), lag_tsd = getField(lag_raw, 'timeSeriesData'); for (t in lag_tsd) { obj[getField(lag_tsd[t], 'labelValues.3.stringValue')] = getField(lag_tsd[t], 'pointData.0.values.0.int64Value'); } return JSON.stringify(obj); description: 'PostgreSQL replica metrics data in raw format.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: database_id value: '{$GCP.PROJECT.ID}:{HOST.NAME}' - name: token value: '{$GCP.AUTH.TOKEN}' tags: - tag: component value: raw - uuid: e43272210c45425d871d70a5bb91cdd1 name: 'GCP Cloud SQL PostgreSQL: Network lag' type: DEPENDENT key: gcp.cloudsql.pgsql.repl.network_lag delay: '0' history: 7d trends: 90d units: s description: 'Indicates time taken from primary binary log to IO thread on replica.' preprocessing: - type: JSONPATH parameters: - $.network_lag master_item: key: gcp.cloudsql.pgsql.repl.metrics.get tags: - tag: component value: replication - uuid: 7d74736aa2804c899de35634bc072edf name: 'GCP Cloud SQL PostgreSQL: Replay location lag' type: DEPENDENT key: gcp.cloudsql.pgsql.repl.replay_location delay: '0' history: 7d trends: 90d units: B description: 'Replay location replication lag in bytes.' preprocessing: - type: JSONPATH parameters: - $.replay_location master_item: key: gcp.cloudsql.pgsql.repl.metrics.get tags: - tag: component value: replication - uuid: 192e0bb3ac744f8eb38a760ee3f7c623 name: 'GCP Cloud SQL PostgreSQL: Replication lag' type: DEPENDENT key: gcp.cloudsql.pgsql.repl.replica_lag delay: '0' history: 7d trends: 90d units: s description: 'Number of seconds the read replica is behind its primary (approximation).' preprocessing: - type: JSONPATH parameters: - $.replica_lag master_item: key: gcp.cloudsql.pgsql.repl.metrics.get tags: - tag: component value: replication - uuid: 379c8bc0cfe847d1819ab96aceee5efe name: 'GCP Cloud SQL PostgreSQL: Sent location lag' type: DEPENDENT key: gcp.cloudsql.pgsql.repl.sent_location delay: '0' history: 7d trends: 90d units: B description: 'Sent location replication lag in bytes.' preprocessing: - type: JSONPATH parameters: - $.sent_location master_item: key: gcp.cloudsql.pgsql.repl.metrics.get tags: - tag: component value: replication - uuid: a7f785dbe4954d77a82e6384620b5d6e name: 'GCP Cloud SQL PostgreSQL: Replication state' type: DEPENDENT key: gcp.cloudsql.pgsql.repl.state delay: '0' history: 7d trends: 90d description: | The current serving state of replication. This metric is only available for the MySQL/PostgreSQL instances. valuemap: name: 'Replication state' preprocessing: - type: JSONPATH parameters: - $.state - type: JAVASCRIPT parameters: - | const idx = [ 'Running', 'Syncing', 'Unsynced', 'Stopped', 'Error', ].indexOf(value); return idx !== -1 ? idx : 10; master_item: key: gcp.cloudsql.pgsql.repl.metrics.get tags: - tag: component value: replication - tag: component value: status - uuid: 10af15bc71ed446eb4e614c2cb6029d5 name: 'GCP Cloud SQL PostgreSQL: Write location lag' type: DEPENDENT key: gcp.cloudsql.pgsql.repl.write_location delay: '0' history: 7d trends: 90d units: B description: 'Write location replication lag in bytes.' preprocessing: - type: JSONPATH parameters: - $.write_location master_item: key: gcp.cloudsql.pgsql.repl.metrics.get tags: - tag: component value: replication tags: - tag: class value: cloud - tag: target value: cloudsql - tag: target value: gcp - tag: target value: google-cloud-platform - tag: target value: postgresql - tag: target value: replica macros: - macro: '{$GCP.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$GCP.TIME.WINDOW}' value: 5m description: | Time interval for the data requests. Supported usage type: 1. The default update interval for most of the items. 2. The minimal time window for the data requested in the Monitoring Query Language REST API request. dashboards: - uuid: acb71f4a818d43e0b045ba87c2daa989 name: 'PostgreSQL replica' pages: - name: 'PostgreSQL replica' widgets: - type: graph width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL PostgreSQL Replica by HTTP' name: 'GCP Cloud SQL PostgreSQL: WAL archiving' - type: graph x: '12' width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Cloud SQL PostgreSQL Replica by HTTP' name: 'GCP Cloud SQL PostgreSQL: Lags' valuemaps: - uuid: af111e6b9e5a47cd9c3933b8ce35076c name: 'Replication state' mappings: - value: '0' newvalue: Running - value: '1' newvalue: Syncing - value: '2' newvalue: Unsynced - value: '3' newvalue: Stopped - value: '4' newvalue: Error - value: '10' newvalue: Unknown - uuid: 6d2443db49e54d59a82b9b525f2424ef template: 'GCP Compute Engine Instance by HTTP' name: 'GCP Compute Engine Instance by HTTP' description: | Discover GCP Compute Engine instances by HTTP with script item usage. This template will be automatically connected to discovered entities with all their required parameters pre-defined. 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: 3de05ba490644a62ba4a700ffe439c98 name: 'GCP Compute Engine: Guest visible vCPUs' type: DEPENDENT key: gcp.gce.cpu.guest_visible_vcpus delay: '0' history: 7d trends: 90d value_type: FLOAT description: | Number of vCPUs visible inside the guest. For many GCE machine types, the number of vCPUs visible inside the guest is equal to the `compute.googleapis.com/instance/cpu/reserved_cores` metric. For shared-core machine types, the number of guest-visible vCPUs differs from the number of reserved cores. For example, e2-small instances have two vCPUs visible inside the guest and 0.5 fractional vCPUs reserved. Therefore, for an e2-small instance, `compute.googleapis.com/instance/cpu/guest_visible_vcpus` has a value of 2 and `compute.googleapis.com/instance/cpu/reserved_cores` has a value of 0.5. preprocessing: - type: JSONPATH parameters: - $.guest_visible_vcpus master_item: key: gcp.gce.metrics.get tags: - tag: component value: cpu - uuid: 2fa7a2aa15a242cc826248ebe96bb173 name: 'GCP Compute Engine: Reserved vCPUs' type: DEPENDENT key: gcp.gce.cpu.reserved_cores delay: '0' history: 7d trends: 90d value_type: FLOAT description: 'Number of vCPUs reserved on the host of the instance.' preprocessing: - type: JSONPATH parameters: - $.reserved_cores master_item: key: gcp.gce.metrics.get tags: - tag: component value: cpu - uuid: f6c9c633f514416189ba85d2015251ba name: 'GCP Compute Engine: Scheduler wait time' type: DEPENDENT key: gcp.gce.cpu.scheduler_wait_time delay: '0' history: 7d trends: 90d value_type: FLOAT units: s description: | Wait time is the time a vCPU is ready to run, but unexpectedly not scheduled to run. The wait time returned here is the accumulated value for all vCPUs. The time interval for which the value was measured is returned by Monitoring in whole seconds as start_time and end_time. This metric is only available for VMs that belong to the e2 family or to overcommitted VMs on sole-tenant nodes. preprocessing: - type: JSONPATH parameters: - $.scheduler_wait_time error_handler: DISCARD_VALUE master_item: key: gcp.gce.metrics.get tags: - tag: component value: cpu - uuid: daf4d0d23ccf4633aad6405bd1f09dc3 name: 'GCP Compute Engine: CPU usage time' type: DEPENDENT key: gcp.gce.cpu.usage_time delay: '0' history: 7d trends: 90d value_type: FLOAT units: s description: | Delta vCPU usage for all vCPUs, in vCPU-seconds. To compute the per-vCPU utilization fraction, divide this value by (end-start)*N, where end and start define this value's time interval and N is `compute.googleapis.com/instance/cpu/reserved_cores` at the end of the interval. This value is reported by the hypervisor for the VM and can differ from `agent.googleapis.com/cpu/usage_time`, which is reported from inside the VM. preprocessing: - type: JSONPATH parameters: - $.usage_time master_item: key: gcp.gce.metrics.get tags: - tag: component value: cpu - uuid: 666cd3e9f21d4ede9d4bcc16bc95347c name: 'GCP Compute Engine: CPU utilization' type: DEPENDENT key: gcp.gce.cpu.utilization delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: | Fractional utilization of allocated CPU on this instance. This metric is reported by the hypervisor for the VM and can differ from `agent.googleapis.com/cpu/utilization`, which is reported from inside the VM. preprocessing: - type: JSONPATH parameters: - $.utilization - type: MULTIPLIER parameters: - '100' master_item: key: gcp.gce.metrics.get tags: - tag: component value: cpu triggers: - uuid: fb8e28649b4947e9a11d891e3126a3a1 expression: 'min(/GCP Compute Engine Instance by HTTP/gcp.gce.cpu.utilization,15m) >= {$GCE.CPU.UTIL.MAX}' name: 'GCP Compute Engine: High CPU utilization' event_name: 'GCP Compute Engine: High CPU utilization (over {$GCE.CPU.UTIL.MAX}% for 15m)' priority: AVERAGE description: 'The CPU utilization is too high. The system might be slow to respond.' manual_close: 'YES' tags: - tag: scope value: performance - uuid: 4bdd3662247749a69bb59e6643ba7b9a name: 'GCP Compute Engine: Disks get' type: SCRIPT key: gcp.gce.disks.get delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'compute.googleapis.com/instance/disk/', base_paths = ['read_ops_count', 'read_bytes_count', 'write_bytes_count', 'write_ops_count']; function checkParams(params) { ['project_id', 'time_window', 'instance_id', 'token'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } return params; } function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; var params = checkParams(JSON.parse(value)), time_window = params.time_window, project = project = params.project_id, filter = ' | within ' + time_window + " | filter instance_id = '" + params.instance_id + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query'; var raw = getHttpData(url, params.token, { query: '{' + base_paths.map(function (path) { return base_path + path; }).join(';') + '}' + j_filter }), metrics = getField(raw, 'timeSeriesDescriptor.pointDescriptors'), time_series = getField(raw, 'timeSeriesData'), arr = []; for (t in time_series) { data = { disk_name: getField(time_series[t], 'labelValues.3.stringValue'), device_type: getField(time_series[t], 'labelValues.4.stringValue'), storage_type: getField(time_series[t], 'labelValues.6.stringValue'), metrics: {} }; for (i in metrics) { re = /(^t_\d+\.value(_|\.))/g; data['metrics'][getField(metrics[i], 'key').replace(re, '')] = getField(time_series[t], 'pointData.0.values.' + i + '.int64Value'); } arr.push(data); } return JSON.stringify(arr); description: 'Disk entities and metrics related to a particular instance.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: instance_id value: '{HOST.HOST}' - name: token value: '{$GCP.AUTH.TOKEN}' tags: - tag: component value: raw - uuid: e1cd503d86f7487db023e2fd3cea5385 name: 'GCP Compute Engine: Firewall: Dropped bytes' type: DEPENDENT key: gcp.gce.firewall.dropped_bytes_count delay: '0' history: 7d trends: 90d units: B description: 'Count of incoming bytes dropped by the firewall.' preprocessing: - type: JSONPATH parameters: - $.dropped_bytes_count master_item: key: gcp.gce.metrics.get tags: - tag: component value: firewall - tag: component value: network - uuid: 25002706c5164c43a345a8ce594615c7 name: 'GCP Compute Engine: Firewall: Dropped packets' type: DEPENDENT key: gcp.gce.firewall.dropped_packets_count delay: '0' history: 7d trends: 90d description: 'Count of incoming packets dropped by the firewall.' preprocessing: - type: JSONPATH parameters: - $.dropped_packets_count master_item: key: gcp.gce.metrics.get tags: - tag: component value: firewall - tag: component value: network - uuid: 3f82955d43694b25b1e96c9b8f4f6ffb name: 'GCP Compute Engine: Instance state' type: HTTP_AGENT key: gcp.gce.instance.state history: 7d description: 'GCP Compute Engine instance state.' valuemap: name: 'Instance state' preprocessing: - type: JSONPATH parameters: - $.status error_handler: CUSTOM_VALUE error_handler_params: '10' - type: JAVASCRIPT parameters: - | const idx = [ 'RUNNING', 'PROVISIONING', 'STAGING', 'STOPPING', 'REPAIRING', 'TERMINATED', 'SUSPENDING', 'SUSPENDED' ].indexOf(value); return idx !== -1 ? idx : 10; - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 10m timeout: '{$GCP.DATA.TIMEOUT}' url: 'https://compute.googleapis.com/compute/v1/projects/{$GCP.PROJECT.ID}/zones/{$GCE.INSTANCE.ZONE}/instances/{HOST.NAME}' status_codes: '' headers: - name: Content-Type value: application/json - name: Authorization value: 'Bearer {$GCP.AUTH.TOKEN}' tags: - tag: component value: status triggers: - uuid: 96abd48a3e684e1b9b95fdd96d095188 expression: 'last(/GCP Compute Engine Instance by HTTP/gcp.gce.instance.state) = 10' name: 'GCP Compute Engine: Failed to get the instance state' priority: AVERAGE description: | Failed to get the instance state. Check access permissions to GCP API or service account. manual_close: 'YES' tags: - tag: scope value: availability - uuid: 1223f00a5e4b4bc8aa9e8ec08253c4cc expression: 'last(/GCP Compute Engine Instance by HTTP/gcp.gce.instance.state) = 7' name: 'GCP Compute Engine: Instance is in suspended state' priority: INFO description: 'The VM is in a suspended state. You can resume the VM or delete it.' manual_close: 'YES' tags: - tag: scope value: availability - tag: scope value: notice - uuid: d2144e2277ec458c80d2b948364f1924 expression: 'last(/GCP Compute Engine Instance by HTTP/gcp.gce.instance.state) = 4' name: 'GCP Compute Engine: The instance is in repairing state' priority: WARNING description: | The VM is being repaired. Repairing occurs when the VM encounters an internal error or the underlying machine is unavailable due to maintenance. During this time, the VM is unusable. manual_close: 'YES' tags: - tag: scope value: availability - uuid: 4a010c2b1e6f4ec88dbbe97255b9bac4 expression: 'last(/GCP Compute Engine Instance by HTTP/gcp.gce.instance.state) = 5' name: 'GCP Compute Engine: The instance is in terminated state' priority: AVERAGE description: 'The VM is stopped. You stopped the VM, or the VM encountered a failure.' manual_close: 'YES' tags: - tag: scope value: availability - uuid: f075482578ec475385cdfc57346d1570 name: 'GCP Compute Engine: Instance uptime' type: DEPENDENT key: gcp.gce.instance.uptime delay: '0' history: 7d trends: 90d value_type: FLOAT units: s description: 'Elapsed time since the VM was started, in seconds.' preprocessing: - type: JSONPATH parameters: - $.uptime_total master_item: key: gcp.gce.metrics.get tags: - tag: component value: uptime - uuid: 744f3f821847473d9cef1236580bda38 name: 'GCP Compute Engine: Integrity: Early boot validation status' type: DEPENDENT key: gcp.gce.integrity.early_boot_validation_status delay: '0' history: 7d trends: 90d description: | The validation status of early boot integrity policy. Empty value if integrity monitoring isn't enabled. valuemap: name: 'Integrity validation status' preprocessing: - type: JSONPATH parameters: - $.early_boot_validation_status error_handler: DISCARD_VALUE - type: JAVASCRIPT parameters: - | const idx = [ 'passed', 'failed', 'unknown', ].indexOf(value); return idx !== -1 ? idx : ""; master_item: key: gcp.gce.metrics.get tags: - tag: component value: security - uuid: aa334c3a0faf4f36bcbbf51d87ef9186 name: 'GCP Compute Engine: Integrity: Late boot validation status' type: DEPENDENT key: gcp.gce.integrity.late_boot_validation_status delay: '0' history: 7d trends: 90d description: | The validation status of late boot integrity policy. Empty value if integrity monitoring isn't enabled. valuemap: name: 'Integrity validation status' preprocessing: - type: JSONPATH parameters: - $.late_boot_validation_status error_handler: DISCARD_VALUE - type: JAVASCRIPT parameters: - | const idx = [ 'passed', 'failed', 'unknown', ].indexOf(value); return idx !== -1 ? idx : ""; master_item: key: gcp.gce.metrics.get tags: - tag: component value: security - uuid: 1b14fefa6b0f4abc98f6ddf3164074b3 name: 'GCP Compute Engine: Memory usage percentage' type: DEPENDENT key: gcp.gce.memory.ram_pused delay: '0' history: 7d trends: 90d value_type: FLOAT units: '%' description: | Memory usage Percentage. This metric is only available for VMs that belong to the e2 family; returns empty value for different instance types. preprocessing: - type: JSONPATH parameters: - $.ram_pused error_handler: DISCARD_VALUE master_item: key: gcp.gce.metrics.get tags: - tag: component value: memory triggers: - uuid: fa918889bcb84d3886254f00f0df288c expression: 'min(/GCP Compute Engine Instance by HTTP/gcp.gce.memory.ram_pused,15m) >= {$GCE.RAM.UTIL.MAX}' name: 'GCP Compute Engine: High memory utilization' event_name: 'GCP Compute Engine: High memory utilization (over {$GCE.RAM.UTIL.MAX}% for 15m)' priority: AVERAGE description: 'RAM utilization is too high. The system might be slow to respond.' tags: - tag: scope value: performance - uuid: 10d63d2c01dc481380bf386af7af7f97 name: 'GCP Compute Engine: Memory size' type: DEPENDENT key: gcp.gce.memory.ram_size delay: '0' history: 7d trends: 90d units: B description: | Total VM memory size. This metric is only available for VMs that belong to the e2 family; returns empty value for different instance types. preprocessing: - type: JSONPATH parameters: - $.ram_size error_handler: DISCARD_VALUE master_item: key: gcp.gce.metrics.get tags: - tag: component value: memory - uuid: 20dc9e49a60d46b4b6d855eb74a60d5e name: 'GCP Compute Engine: Memory used' type: DEPENDENT key: gcp.gce.memory.ram_used delay: '0' history: 7d trends: 90d units: B description: | Memory currently used in the VM. This metric is only available for VMs that belong to the e2 family; returns empty value for different instance types. preprocessing: - type: JSONPATH parameters: - $.ram_used error_handler: DISCARD_VALUE master_item: key: gcp.gce.metrics.get tags: - tag: component value: memory - uuid: b043128882254e9492c7436521bf994a name: 'GCP Compute Engine: VM swap in' type: DEPENDENT key: gcp.gce.memory.swap_in_bytes_count delay: '0' history: 7d trends: 90d units: B description: | The amount of memory read into the guest from its own swap space. This metric is only available for VMs that belong to the e2 family; returns empty value for different instance types. preprocessing: - type: JSONPATH parameters: - $.swap_in_bytes_count error_handler: DISCARD_VALUE master_item: key: gcp.gce.metrics.get tags: - tag: component value: memory - uuid: 7166423bbcf0456ab0fcc7c852d89125 name: 'GCP Compute Engine: VM swap out' type: DEPENDENT key: gcp.gce.memory.swap_out_bytes_count delay: '0' history: 7d trends: 90d units: B description: | The amount of memory written from the guest to its own swap space. This metric is only available for VMs that belong to the e2 family; returns empty value for different instance types. preprocessing: - type: JSONPATH parameters: - $.swap_out_bytes_count error_handler: DISCARD_VALUE master_item: key: gcp.gce.metrics.get tags: - tag: component value: memory - uuid: 723fbff060ab41a39322bc0d6d8b1f84 name: 'GCP Compute Engine: Metrics get' type: SCRIPT key: gcp.gce.metrics.get delay: '{$GCP.TIME.WINDOW}' history: '0' trends: '0' value_type: TEXT params: | var base_path = 'compute.googleapis.com/', value_types = ['int64Value', 'doubleValue', 'stringValue', 'boolValue'], re = /(^t_\d+\.value\.)/g, obj = {}, base_paths = [ 'instance/uptime_total', 'firewall/dropped_packets_count', 'firewall/dropped_bytes_count', 'instance/cpu/guest_visible_vcpus', 'instance/cpu/reserved_cores', 'instance/cpu/usage_time', 'instance/cpu/utilization', 'mirroring/mirrored_bytes_count', 'mirroring/mirrored_packets_count' ], e2_paths = [ 'instance/cpu/scheduler_wait_time', 'instance/memory/balloon/ram_size', 'instance/memory/balloon/ram_used', 'instance/memory/balloon/swap_in_bytes_count', 'instance/memory/balloon/swap_out_bytes_count', ], net_paths = [ 'instance/network/received_packets_count', 'instance/network/received_bytes_count', 'instance/network/sent_bytes_count', 'instance/network/sent_packets_count' ], integrity_paths = [ 'instance/integrity/late_boot_validation_status', 'instance/integrity/early_boot_validation_status' ]; function getField(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 "' + path + '" is not present in data received.'; } data = data[step]; } return data; } function getFieldBool(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') { return false; } data = data[step]; } return true; } function queryMap(array, path, filter) { var query_params = '{' + array.map(function (element) { return path + element; }).join(';') + '}'; return {query: query_params + filter} } function checkParams(params) { ['project_id', 'time_window', 'instance_id', 'token', 'machine_type', 'integrity'].forEach(function (field) { if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '' || params[field].match(/^\{\$.*\}$/)) { throw 'Required param is not set: ' + field + '.'; } }); if (!params.time_window.match(/^[0-9]+(m|h)$/)) { throw 'Incorrect update interval for parameter time_window. Valid ranges 1m-23h.'; } if (params.integrity !== 'true' && params.integrity !== 'false') { throw 'Incorrect integrity state definition type. Valid definitions: true/false'; } return params; } function getHttpData(url, token, body) { var request = new HttpRequest(); request.addHeader('Authorization: Bearer ' + token); request.addHeader('Content-Type: application/json'); var response = request.post(url, JSON.stringify(body)); Zabbix.log(4, '[ GCP API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { throw 'Failed to parse response received from GCP API. Check debug log for more information.'; } } if (typeof response !== 'object' || response === null) { throw 'Cannot process response data: received data is not an object. Check debug log for more information.'; } if (request.getStatus() !== 200) { if (typeof (response.error && response.error.message) !== 'undefined') { throw response.error.message; } else { throw 'Failed to receive data: invalid response status code. Check debug log for more information.'; } } return response; }; function nestedMap(raw) { var ids = getField(raw, 'timeSeriesDescriptor.pointDescriptors'), ltsd = getField(raw, 'timeSeriesData'), result = {}; for (i in ids) { var id = getField(ids[i], 'key').replace(re, ''); result[id] = {}; for (t in ltsd) { for (v in value_types) { if (getFieldBool(ltsd[t], 'pointData.0.values.' + [i] + '.' + [value_types[v]])) { ['stringValue', 'boolValue'].forEach(function (type) { if (getFieldBool(ltsd[t], 'labelValues.4.' + [type])) { result[id][ltsd[t].labelValues[4][type]] = ltsd[t].pointData[0].values[i][value_types[v]]; } }); } } } } return result; } var params = checkParams(JSON.parse(value)); if (params.machine_type.match(/e2.*/)) { base_paths = base_paths.concat(e2_paths); } var time_window = params.time_window, project = params.project_id, filter = ' | within ' + time_window + " | filter instance_id = '" + params.instance_id + "'", j_filter = filter + ' | join', url = 'https://monitoring.googleapis.com/v3/projects/' + project + '/timeSeries:query'; var raw = getHttpData(url, params.token, queryMap(base_paths, base_path, j_filter)), keys = getField(raw, 'timeSeriesDescriptor.pointDescriptors'), values = getField(raw, 'timeSeriesData.0.pointData.0.values'); for (i in keys) { for (v in value_types) { if (typeof values[i][value_types[v]] !== 'undefined') { obj[getField(keys[i], 'key').replace(re, '')] = values[i][value_types[v]]; } } } if (params.machine_type.match(/e2.*/)) { obj.ram_pused = Math.floor((getField(obj,'ram_used') / getField(obj,'ram_size')) * 100); } var mirr_raw = getHttpData(url, params.token, { query: base_path + 'mirroring/dropped_packets_count' + filter }), tsd = getField(mirr_raw, 'timeSeriesData'); for (t in tsd) { for (v in value_types) { if (getFieldBool(tsd[t], 'pointData.0.values.0.' + [value_types[v]])) { obj[getField(tsd[t], 'labelValues.3.stringValue')] = getField(tsd[t], 'pointData.0.values.0.' + [value_types[v]]); } } } var net_metrics = getHttpData(url, params.token, queryMap(net_paths, base_path, j_filter)); Object.assign(obj, nestedMap(net_metrics)); if (params.integrity === 'true') { integrity_metrics = getHttpData(url, params.token, queryMap(integrity_paths, base_path, j_filter)); var keys = getField(integrity_metrics, 'timeSeriesDescriptor.pointDescriptors'), tsd = getField(integrity_metrics, 'timeSeriesData'); for (i in keys) { var key = getField(keys[i], 'key').replace(re, ''); obj[key] = 'undefined'; for (t in tsd) { if (getField(tsd[t], 'pointData.0.values.' + i + '.int64Value') == 1) { obj[key] = getField(tsd[t], 'labelValues.4.stringValue'); break; } } } } return JSON.stringify(obj); description: 'GCP Compute Engine metrics get in raw format.' preprocessing: - type: CHECK_NOT_SUPPORTED parameters: - '' timeout: '{$GCP.DATA.TIMEOUT}' parameters: - name: project_id value: '{$GCP.PROJECT.ID}' - name: time_window value: '{$GCP.TIME.WINDOW}' - name: instance_id value: '{HOST.HOST}' - name: token value: '{$GCP.AUTH.TOKEN}' - name: machine_type value: '{$GCE.MACHINE.TYPE}' - name: integrity value: '{$GCE.INTEGRITY.STATE}' tags: - tag: component value: raw - uuid: faf1c3ccbcc24b9eb52be355f2f782e6 name: 'GCP Compute Engine: Network: Received bytes' type: DEPENDENT key: gcp.gce.network.lb.received_bytes_count.false delay: '0' history: 7d trends: 90d units: B description: 'Count of bytes received from the network without load-balancing.' preprocessing: - type: JSONPATH parameters: - $.received_bytes_count.false master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 91ef1b33d7ae479999302cdec227eb3e name: 'GCP Compute Engine: Network: Received bytes: Load-balanced' type: DEPENDENT key: gcp.gce.network.lb.received_bytes_count.true delay: '0' history: 7d trends: 90d units: B description: | Whether traffic was received by an L3 loadbalanced IP address assigned to the VM. Traffic that is externally routed to the VM's standard internal or external IP address, such as L7 loadbalanced traffic, is not considered to be loadbalanced in this metric. The value is empty when load-balancing is not used. preprocessing: - type: JSONPATH parameters: - $.received_bytes_count.true error_handler: DISCARD_VALUE master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 84dec0cb32ea434a9d6f29f402d337a0 name: 'GCP Compute Engine: Network: Received packets' type: DEPENDENT key: gcp.gce.network.lb.received_packets_count.false delay: '0' history: 7d trends: 90d description: 'Count of packets received from the network without load-balancing.' preprocessing: - type: JSONPATH parameters: - $.received_packets_count.false master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 148fe8aaa01e4863bbe2ca4c0226ce80 name: 'GCP Compute Engine: Network: Received packets: Load-balanced' type: DEPENDENT key: gcp.gce.network.lb.received_packets_count.true delay: '0' history: 7d trends: 90d description: | Whether traffic was received by an L3 loadbalanced IP address assigned to the VM. Traffic that is externally routed to the VM's standard internal or external IP address, such as L7 loadbalanced traffic, is not considered to be loadbalanced in this metric. The value is empty when load-balancing is not used. preprocessing: - type: JSONPATH parameters: - $.received_packets_count.true error_handler: DISCARD_VALUE master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: b8ea22b00a254ee5a2484fd833421b12 name: 'GCP Compute Engine: Network: Sent bytes' type: DEPENDENT key: gcp.gce.network.lb.sent_bytes_count.false delay: '0' history: 7d trends: 90d units: B description: 'Count of bytes sent over the network without load-balancing.' preprocessing: - type: JSONPATH parameters: - $.sent_bytes_count.false master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 77bd252194764837bc71b031e4d7e2b8 name: 'GCP Compute Engine: Network: Sent bytes: Load-balanced' type: DEPENDENT key: gcp.gce.network.lb.sent_bytes_count.true delay: '0' history: 7d trends: 90d units: B description: | Whether traffic was received by an L3 loadbalanced IP address assigned to the VM. Traffic that is externally routed to the VM's standard internal or external IP address, such as L7 loadbalanced traffic, is not considered to be loadbalanced in this metric. The value is empty when load-balancing is not used. preprocessing: - type: JSONPATH parameters: - $.sent_bytes_count.true error_handler: DISCARD_VALUE master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 44032903b7da4d72b2dff35e81e787d3 name: 'GCP Compute Engine: Network: Sent packets' type: DEPENDENT key: gcp.gce.network.lb.sent_packets_count.false delay: '0' history: 7d trends: 90d description: 'Count of packets sent over the network without load-balancing.' preprocessing: - type: JSONPATH parameters: - $.sent_packets_count.false master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 2aef5ad0f3704550b4920ce36614b52d name: 'GCP Compute Engine: Network: Sent packets: Load-balanced' type: DEPENDENT key: gcp.gce.network.lb.sent_packets_count.true delay: '0' history: 7d trends: 90d description: | Whether traffic was received by an L3 loadbalanced IP address assigned to the VM. Traffic that is externally routed to the VM's standard internal or external IP address, such as L7 loadbalanced traffic, is not considered to be loadbalanced in this metric. The value is empty when load-balancing is not used. preprocessing: - type: JSONPATH parameters: - $.sent_packets_count.true error_handler: DISCARD_VALUE master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 199fb1f4278848138ef8cfd8fc3e07ee name: 'GCP Compute Engine: Network: Mirrored bytes' type: DEPENDENT key: gcp.gce.network.mirrored_bytes_count delay: '0' history: 7d trends: 90d units: B description: 'The count of mirrored bytes.' preprocessing: - type: JSONPATH parameters: - $.mirrored_bytes_count master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: f0add3d3853d4d8c9993b1603fd7b542 name: 'GCP Compute Engine: Network: Mirrored packets' type: DEPENDENT key: gcp.gce.network.mirrored_packets_count delay: '0' history: 7d trends: 90d description: 'The count of mirrored packets.' preprocessing: - type: JSONPATH parameters: - $.mirrored_packets_count master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 6ca64c0fa39e4587a2987cd607058b54 name: 'GCP Compute Engine: Network: Mirrored packets dropped: Invalid' type: DEPENDENT key: gcp.gce.network.mirr_dropped_packets.invalid delay: '0' history: 7d trends: 90d description: | The count of mirrored packets dropped. Reason - invalid. preprocessing: - type: JSONPATH parameters: - $.invalid master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 3cf438aa0225428385d30c5be30ea3e6 name: 'GCP Compute Engine: Network: Mirrored packets dropped: Out of quota' type: DEPENDENT key: gcp.gce.network.mirr_dropped_packets.out_of_quota delay: '0' history: 7d trends: 90d description: | The count of mirrored packets dropped. Reason - out of quota. preprocessing: - type: JSONPATH parameters: - $.out_of_quota master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic - uuid: 5303badcf26641f1af85366fbaecdd77 name: 'GCP Compute Engine: Network: Mirrored packets dropped: Unknown' type: DEPENDENT key: gcp.gce.network.mirr_dropped_packets.unknown delay: '0' history: 7d trends: 90d description: | The count of mirrored packets dropped. Reason - unknown. preprocessing: - type: JSONPATH parameters: - $.unknown master_item: key: gcp.gce.metrics.get tags: - tag: component value: network - tag: component value: traffic discovery_rules: - uuid: 260e06bfe28e46f4a726dd4a6d7fa523 name: 'GCP Compute Engine: Physical disks discovery' type: DEPENDENT key: gcp.gce.phys.disks.discovery delay: '0' filter: evaltype: AND conditions: - macro: '{#GCE.DISK.NAME}' value: '{$GCE.DISK.NAME.MATCHES}' formulaid: C - macro: '{#GCE.DISK.NAME}' value: '{$GCE.DISK.NAME.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: D - macro: '{#GCE.DISK.DEV_TYPE}' value: '{$GCE.DISK.DEV_TYPE.MATCHES}' formulaid: A - macro: '{#GCE.DISK.DEV_TYPE}' value: '{$GCE.DISK.DEV_TYPE.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: B - macro: '{#GCE.DISK.STOR_TYPE}' value: '{$GCE.DISK.STOR_TYPE.MATCHES}' formulaid: E - macro: '{#GCE.DISK.STOR_TYPE}' value: '{$GCE.DISK.STOR_TYPE.NOT_MATCHES}' operator: NOT_MATCHES_REGEX formulaid: F lifetime: 7d description: 'GCP Compute Engine: Physical disks discovery.' item_prototypes: - uuid: dda10a0535c04fdb92092efeff020b2c name: 'GCP Compute Engine: Disk [{#GCE.DISK.NAME}]: Read bytes' type: DEPENDENT key: 'gcp.gce.disk.read_bytes_count[{#GCE.DISK.NAME}]' delay: '0' history: 7d trends: 90d units: B description: 'Count of bytes read from [{#GCE.DISK.NAME}] disk.' preprocessing: - type: JSONPATH parameters: - $.read_bytes_count master_item: key: 'gcp.gce.quota.single.raw[{#GCE.DISK.NAME}]' tags: - tag: component value: storage - tag: device-type value: '{#GCE.DISK.DEV_TYPE}' - tag: disk value: '{#GCE.DISK.NAME}' - tag: storage-type value: '{#GCE.DISK.STOR_TYPE}' - uuid: e166d3dfeb404111bcd143415070a0af name: 'GCP Compute Engine: Disk [{#GCE.DISK.NAME}]: Read operations' type: DEPENDENT key: 'gcp.gce.disk.read_ops_count[{#GCE.DISK.NAME}]' delay: '0' history: 7d trends: 90d description: 'Count of read IO operations from [{#GCE.DISK.NAME}] disk.' preprocessing: - type: JSONPATH parameters: - $.read_ops_count master_item: key: 'gcp.gce.quota.single.raw[{#GCE.DISK.NAME}]' tags: - tag: component value: storage - tag: device-type value: '{#GCE.DISK.DEV_TYPE}' - tag: disk value: '{#GCE.DISK.NAME}' - tag: storage-type value: '{#GCE.DISK.STOR_TYPE}' - uuid: cf21b2bf6dc74ed28bc55a2c567b3dae name: 'GCP Compute Engine: Disk [{#GCE.DISK.NAME}]: Write bytes' type: DEPENDENT key: 'gcp.gce.disk.write_bytes_count[{#GCE.DISK.NAME}]' delay: '0' history: 7d trends: 90d units: B description: 'Count of bytes written to {#GCE.DISK.NAME}] disk.' preprocessing: - type: JSONPATH parameters: - $.write_bytes_count master_item: key: 'gcp.gce.quota.single.raw[{#GCE.DISK.NAME}]' tags: - tag: component value: storage - tag: device-type value: '{#GCE.DISK.DEV_TYPE}' - tag: disk value: '{#GCE.DISK.NAME}' - tag: storage-type value: '{#GCE.DISK.STOR_TYPE}' - uuid: 602255b7df004129b5a3e0e1d2fba920 name: 'GCP Compute Engine: Disk [{#GCE.DISK.NAME}]: Write operations' type: DEPENDENT key: 'gcp.gce.disk.write_ops_count[{#GCE.DISK.NAME}]' delay: '0' history: 7d trends: 90d description: 'Count of write IO operations to [{#GCE.DISK.NAME}] disk.' preprocessing: - type: JSONPATH parameters: - $.write_ops_count master_item: key: 'gcp.gce.quota.single.raw[{#GCE.DISK.NAME}]' tags: - tag: component value: storage - tag: device-type value: '{#GCE.DISK.DEV_TYPE}' - tag: disk value: '{#GCE.DISK.NAME}' - tag: storage-type value: '{#GCE.DISK.STOR_TYPE}' - uuid: 7fc27a6630664e2fbac8fe64ac40985a name: 'GCP Compute Engine: Disk [{#GCE.DISK.NAME}]: Raw data' type: DEPENDENT key: 'gcp.gce.quota.single.raw[{#GCE.DISK.NAME}]' delay: '0' history: '0' trends: '0' value_type: TEXT description: 'Data in raw format for the disk with the name [{#GCE.DISK.NAME}].' preprocessing: - type: JSONPATH parameters: - '$[?(@.disk_name == "{#GCE.DISK.NAME}")].metrics.first()' master_item: key: gcp.gce.disks.get tags: - tag: component value: raw - tag: component value: storage - tag: disk value: '{#GCE.DISK.NAME}' graph_prototypes: - uuid: 9af0456af3d74041b678ceeccbc036fc name: 'GCP Compute Engine: Disk [{#GCE.DISK.NAME}]: Read/Write bytes' graph_items: - color: 199C0D item: host: 'GCP Compute Engine Instance by HTTP' key: 'gcp.gce.disk.read_bytes_count[{#GCE.DISK.NAME}]' - sortorder: '1' color: F63100 item: host: 'GCP Compute Engine Instance by HTTP' key: 'gcp.gce.disk.write_bytes_count[{#GCE.DISK.NAME}]' - uuid: 542185ffc8b3485f8955b63c46a50b83 name: 'GCP Compute Engine: Disk [{#GCE.DISK.NAME}]: Read/Write operations' graph_items: - color: 199C0D item: host: 'GCP Compute Engine Instance by HTTP' key: 'gcp.gce.disk.read_ops_count[{#GCE.DISK.NAME}]' - sortorder: '1' color: F63100 item: host: 'GCP Compute Engine Instance by HTTP' key: 'gcp.gce.disk.write_ops_count[{#GCE.DISK.NAME}]' master_item: key: gcp.gce.disks.get lld_macro_paths: - lld_macro: '{#GCE.DISK.NAME}' path: $.disk_name - lld_macro: '{#GCE.DISK.DEV_TYPE}' path: $.device_type - lld_macro: '{#GCE.DISK.STOR_TYPE}' path: $.storage_type preprocessing: - type: DISCARD_UNCHANGED_HEARTBEAT parameters: - 3h tags: - tag: class value: cloud - tag: target value: compute-engine - tag: target value: gce - tag: target value: gcp - tag: target value: google-cloud-platform macros: - macro: '{$GCE.CPU.UTIL.MAX}' value: '95' description: 'GCP Compute Engine instance CPU utilization threshold.' - macro: '{$GCE.DISK.DEV_TYPE.MATCHES}' value: '.*' description: 'The filter to include GCP Compute Engine disks by device type.' - macro: '{$GCE.DISK.DEV_TYPE.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Compute Engine disks by device type.' - macro: '{$GCE.DISK.NAME.MATCHES}' value: '.*' description: 'The filter to include GCP Compute Engine disks by namespace.' - macro: '{$GCE.DISK.NAME.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Compute Engine disks by namespace.' - macro: '{$GCE.DISK.STOR_TYPE.MATCHES}' value: '.*' description: 'The filter to include GCP Compute Engine disks by storage type.' - macro: '{$GCE.DISK.STOR_TYPE.NOT_MATCHES}' value: CHANGE_IF_NEEDED description: 'The filter to exclude GCP Compute Engine disks by storage type.' - macro: '{$GCE.RAM.UTIL.MAX}' value: '90' description: 'GCP Compute Engine instance RAM utilization threshold.' - macro: '{$GCP.DATA.TIMEOUT}' value: 15s description: 'A response timeout for an API.' - macro: '{$GCP.TIME.WINDOW}' value: 5m description: | Time interval for the data requests. Supported usage type: 1. The default update interval for most of the items. 2. The minimal time window for the data requested in the Monitoring Query Language REST API request. dashboards: - uuid: b8b09f6833ec4ea78c4ac7d15cdb0cc5 name: Hardware pages: - name: Hardware widgets: - type: graph width: '12' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Compute Engine Instance by HTTP' name: 'GCP Compute Engine: CPU usage' - type: graph x: '12' width: '12' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.cpu.utilization - type: graph 'y': '5' width: '8' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Compute Engine Instance by HTTP' name: 'GCP Compute Engine: Memory usage' - type: graph x: '8' 'y': '5' width: '8' height: '5' fields: - type: INTEGER name: source_type value: '1' - type: ITEM name: itemid value: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.memory.ram_pused - type: graph x: '16' 'y': '5' width: '8' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Compute Engine Instance by HTTP' name: 'GCP Compute Engine: Memory swapping' - type: graphprototype 'y': '10' width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: GRAPH_PROTOTYPE name: graphid value: host: 'GCP Compute Engine Instance by HTTP' name: 'GCP Compute Engine: Disk [{#GCE.DISK.NAME}]: Read/Write bytes' - type: graphprototype x: '12' 'y': '10' width: '12' height: '5' fields: - type: INTEGER name: columns value: '1' - type: INTEGER name: rows value: '1' - type: GRAPH_PROTOTYPE name: graphid value: host: 'GCP Compute Engine Instance by HTTP' name: 'GCP Compute Engine: Disk [{#GCE.DISK.NAME}]: Read/Write operations' - type: graph 'y': '15' width: '24' height: '5' fields: - type: GRAPH name: graphid value: host: 'GCP Compute Engine Instance by HTTP' name: 'GCP Compute Engine: Network traffic' valuemaps: - uuid: d5f19327f8b74b44a40950d9d4f9410f name: 'Instance state' mappings: - value: '0' newvalue: Running - value: '1' newvalue: Provisioning - value: '2' newvalue: Staging - value: '3' newvalue: Stopping - value: '4' newvalue: Repairing - value: '5' newvalue: Terminated - value: '6' newvalue: Suspending - value: '7' newvalue: Suspended - value: '10' newvalue: 'Data retrievement error' - uuid: 1e17bce361f9486dae764fc195561703 name: 'Integrity validation status' mappings: - value: '0' newvalue: Passed - value: '1' newvalue: Failed - value: '2' newvalue: Unknown graphs: - uuid: 1ff7d04868284c07829382c44301fe0e name: 'GCP Cloud SQL MSSQL: Disk read/write operations' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.disk.read_ops_count - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.disk.write_ops_count - uuid: 0ef4b456168d4ecd87c3dc68092c673d name: 'GCP Cloud SQL MSSQL: Disk usage' graph_items: - drawtype: BOLD_LINE color: 199C0D calc_fnc: MIN item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.disk.quota - sortorder: '1' drawtype: GRADIENT_LINE color: F63100 item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.disk.bytes_used - uuid: 09b009aa17f1410bb926043b4c7c39e4 name: 'GCP Cloud SQL MSSQL: Memory Read/Writes' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.memory.page_ops.read - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.memory.page_ops.write - uuid: 3273bee668e84b26911307ea4c1f620f name: 'GCP Cloud SQL MSSQL: Memory usage' graph_items: - drawtype: BOLD_LINE color: 199C0D calc_fnc: MIN item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.memory.quota - sortorder: '1' drawtype: GRADIENT_LINE color: F63100 item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.memory.usage - uuid: 4d5afffa67804f4da73474d2ee26bd5d name: 'GCP Cloud SQL MSSQL: Memory workflow' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.memory.checkpoint_page_count - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.memory.free_list_stall_count - sortorder: '2' color: 00611C item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.memory.lazy_write_count - sortorder: '3' color: F7941D item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.memory.memory_grants_pending - uuid: 558283815ab2414f8da6387724a784a3 name: 'GCP Cloud SQL MSSQL: Network traffic' type: STACKED graph_items: - color: 199C0D item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.network.received_bytes_count - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.network.sent_bytes_count - uuid: 0bfd3e8be20c4b5a88b23f16aff4eb82 name: 'GCP Cloud SQL MSSQL: Replication data' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL MSSQL Replica by HTTP' key: gcp.cloudsql.mssql.repl.bytes_sent_to_replica_count - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL MSSQL Replica by HTTP' key: gcp.cloudsql.mssql.repl.log_bytes_received_count - sortorder: '2' color: 00611C item: host: 'GCP Cloud SQL MSSQL Replica by HTTP' key: gcp.cloudsql.mssql.repl.redone_bytes_count - uuid: 922d35bf685b473ca9848a9b9e7e34c3 name: 'GCP Cloud SQL MSSQL: Transactions' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.trans.batch_request_count - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.trans.forwarded_record_count - sortorder: '2' color: 00611C item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.trans.full_scan_count - sortorder: '3' color: F7941D item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.trans.page_split_count - sortorder: '4' color: FC6EA3 item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.trans.probe_scan_count - sortorder: '5' color: 6C59DC item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.trans.sql_compilation_count - sortorder: '6' color: C7A72D item: host: 'GCP Cloud SQL MSSQL by HTTP' key: gcp.cloudsql.mssql.trans.sql_recompilation_count - uuid: 935c2f388185469f82100541d9efb2c7 name: 'GCP Cloud SQL MySQL: Disk read/write operations' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.disk.read_ops_count - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.disk.write_ops_count - uuid: 1b0ea2b38fe740b197ecbcfdd7464b02 name: 'GCP Cloud SQL MySQL: Disk usage' graph_items: - drawtype: BOLD_LINE color: 199C0D calc_fnc: MIN item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.disk.quota - sortorder: '1' drawtype: GRADIENT_LINE color: F63100 item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.disk.bytes_used - uuid: e94b7e8241b544e2beb4ea95db3e139f name: 'GCP Cloud SQL MySQL: Lags' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL MySQL Replica by HTTP' key: gcp.cloudsql.mysql.repl.network_lag - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL MySQL Replica by HTTP' key: gcp.cloudsql.mysql.repl.replica_lag - uuid: 4378be58ccff4592a1b54838b90e9ea8 name: 'GCP Cloud SQL MySQL: Memory usage' graph_items: - drawtype: BOLD_LINE color: 199C0D calc_fnc: MIN item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.memory.quota - sortorder: '1' drawtype: GRADIENT_LINE color: F63100 item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.memory.usage - uuid: c23964e5e54541ccb3c8b7b5f5a4b24d name: 'GCP Cloud SQL MySQL: Network traffic' type: STACKED graph_items: - color: 199C0D item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.network.received_bytes_count - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.network.sent_bytes_count - uuid: e680755183ec4927893e03f8d83bc0f2 name: 'GCP Cloud SQL MySQL: pages' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.innodb_buffer_pool_pages_free - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.innodb_buffer_pool_pages_dirty - sortorder: '2' color: 00611C item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.innodb_buffer_pool_pages_total - sortorder: '3' color: F7941D item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.innodb_pages_read - sortorder: '4' color: FC6EA3 item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.mysql.innodb_pages_written - uuid: e447dd13336446b1a965e92d7ddeaf96 name: 'GCP Cloud SQL MySQL: Queries' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.queries - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL MySQL by HTTP' key: gcp.cloudsql.questions - uuid: e2e4ef0a2c1a43d68ae9f4ee881f070e name: 'GCP Cloud SQL PostgreSQL: Disk read/write operations' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.disk.read_ops_count - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.disk.write_ops_count - uuid: 707d5cca2ba349f18088d00ef7657eef name: 'GCP Cloud SQL PostgreSQL: Disk usage' graph_items: - drawtype: BOLD_LINE color: 199C0D calc_fnc: MIN item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.disk.quota - sortorder: '1' drawtype: GRADIENT_LINE color: F63100 item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.disk.bytes_used - uuid: 30fe61bafae64ae6b29dacd68e9a6b3b name: 'GCP Cloud SQL PostgreSQL: Lags' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL PostgreSQL Replica by HTTP' key: gcp.cloudsql.pgsql.repl.network_lag - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL PostgreSQL Replica by HTTP' key: gcp.cloudsql.pgsql.repl.replica_lag - sortorder: '2' color: 00611C item: host: 'GCP Cloud SQL PostgreSQL Replica by HTTP' key: gcp.cloudsql.pgsql.repl.flush_location - sortorder: '3' color: F7941D item: host: 'GCP Cloud SQL PostgreSQL Replica by HTTP' key: gcp.cloudsql.pgsql.repl.replay_location - sortorder: '4' color: FC6EA3 item: host: 'GCP Cloud SQL PostgreSQL Replica by HTTP' key: gcp.cloudsql.pgsql.repl.sent_location - sortorder: '5' color: 6C59DC item: host: 'GCP Cloud SQL PostgreSQL Replica by HTTP' key: gcp.cloudsql.pgsql.repl.write_location - uuid: 897843c1fef540c2ab033c9bad0e9de1 name: 'GCP Cloud SQL PostgreSQL: Memory usage' graph_items: - drawtype: BOLD_LINE color: 199C0D calc_fnc: MIN item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.memory.quota - sortorder: '1' drawtype: GRADIENT_LINE color: F63100 item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.memory.usage - uuid: 8a61208f44c94cf5bfcb851c4de6412a name: 'GCP Cloud SQL PostgreSQL: Network traffic' type: STACKED graph_items: - color: 199C0D item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.network.received_bytes_count - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.network.sent_bytes_count - uuid: bf09992b7f324703b3d51250e47d37f4 name: 'GCP Cloud SQL PostgreSQL: Transaction age' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.oldest_transaction.prepared - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.oldest_transaction.replication_slot - sortorder: '2' color: 00611C item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.oldest_transaction.replica - sortorder: '3' color: F7941D item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.oldest_transaction.running - uuid: 5c567b9d1ef14fcb93eef332fccbe198 name: 'GCP Cloud SQL PostgreSQL: Transactions count' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.transaction_id_count_assigned - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL PostgreSQL by HTTP' key: gcp.cloudsql.pgsql.transaction_id_count_frozen - uuid: e96be84efaf7445fbfd8cf707b585fe7 name: 'GCP Cloud SQL PostgreSQL: WAL archiving' graph_items: - color: 199C0D item: host: 'GCP Cloud SQL PostgreSQL Replica by HTTP' key: gcp.cloudsql.pgsql.repl.log_archive_failure_count - sortorder: '1' color: F63100 item: host: 'GCP Cloud SQL PostgreSQL Replica by HTTP' key: gcp.cloudsql.pgsql.repl.log_archive_success_count - uuid: aa6edbd13ec74ee4b30de2c68823e6aa name: 'GCP Compute Engine: CPU usage' graph_items: - color: 199C0D item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.cpu.scheduler_wait_time - sortorder: '1' color: F63100 item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.cpu.usage_time - uuid: a87f4b9849e34f96b7026f4abc8499a1 name: 'GCP Compute Engine: Memory swapping' graph_items: - color: 199C0D item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.memory.swap_in_bytes_count - sortorder: '1' color: F63100 item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.memory.swap_out_bytes_count - uuid: 5aef2c89a0fa41cd889d87a618cc10bd name: 'GCP Compute Engine: Memory usage' graph_items: - drawtype: BOLD_LINE color: 199C0D item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.memory.ram_size - sortorder: '1' drawtype: GRADIENT_LINE color: F63100 item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.memory.ram_used - uuid: c1c8ebb71d9542ea8b59cef775a6bd65 name: 'GCP Compute Engine: Network traffic' type: STACKED graph_items: - color: 199C0D item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.firewall.dropped_bytes_count - sortorder: '1' color: F63100 item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.network.lb.received_bytes_count.false - sortorder: '2' color: 00611C item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.network.lb.received_bytes_count.true - sortorder: '3' color: F7941D item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.network.lb.sent_bytes_count.false - sortorder: '4' color: FC6EA3 item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.network.lb.sent_bytes_count.true - sortorder: '5' color: 6C59DC item: host: 'GCP Compute Engine Instance by HTTP' key: gcp.gce.network.mirrored_bytes_count