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"
      vendor:
        name: Zabbix
        version: 7.0-0
      groups:
        - name: Templates/Cloud
      items:
        - uuid: b003e61fbede488a957b6c866ffaa9ba
          name: 'Authorization errors check'
          type: DEPENDENT
          key: gcp.auth.err.check
          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: '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: Authorization
          type: SCRIPT
          key: gcp.authorization
          delay: '{$GCP.AUTH.FREQUENCY}'
          history: '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
            		}
            	if (typeof script_params.proxy !== 'undefined' && script_params.proxy !== '') {
            		request.setProxy(script_params.proxy);
            	};
            	var 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: email
              value: '{$GCP.CLIENT.EMAIL}'
            - name: pkey_id
              value: '{$GCP.PRIVATE.KEY.ID}'
            - name: private_key
              value: '{$GCP.PRIVATE.KEY}'
            - name: proxy
              value: '{$GCP.PROXY}'
          tags:
            - tag: component
              value: raw
        - uuid: 3ac5c859692140c0b686e772efa05032
          name: 'Instances get'
          type: DEPENDENT
          key: gcp.cloudsql.instances.get
          history: '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(),
                  		proxy = '{$GCP.PROXY}';
                  	if (proxy !== '{' + '$GCP.PROXY}' && proxy !== '') {
                  		request.setProxy(proxy);
                  	};
                  	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: 80687b35246b45ffa1be9d171f686e94
          name: 'MSSQL instances count'
          type: DEPENDENT
          key: gcp.cloudsql.instances.mssql_count
          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: 'MySQL instances count'
          type: DEPENDENT
          key: gcp.cloudsql.instances.mysql_count
          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: 'PostgreSQL instances count'
          type: DEPENDENT
          key: gcp.cloudsql.instances.pgsql_count
          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: b926ba1901c5413396c1c071e6e76072
          name: 'Cloud SQL instances total'
          type: DEPENDENT
          key: gcp.cloudsql.instances.total
          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: 'Container-optimized GCE instances count'
          type: DEPENDENT
          key: gcp.gce.instances.cos_count
          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: 'Instances get'
          type: DEPENDENT
          key: gcp.gce.instances.get
          history: '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(),
                  		proxy = '{$GCP.PROXY}';
                  	if (proxy !== '{' + '$GCP.PROXY}' && proxy !== '') {
                  		request.setProxy(proxy);
                  	};
                  	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: getFieldBool(inst, 'shieldedInstanceConfig.enableIntegrityMonitoring') ? inst.shieldedInstanceConfig.enableIntegrityMonitoring : false
                  			};
                  
                  			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: a936207f9d914955b2e2140e953f22f2
          name: 'Regular GCE instances count'
          type: DEPENDENT
          key: gcp.gce.instances.regular_count
          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: 'GCE instances total'
          type: DEPENDENT
          key: gcp.gce.instances.total
          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: 'Project quotas get'
          type: DEPENDENT
          key: gcp.gce.quotas.get
          history: '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(),
                  		proxy = '{$GCP.PROXY}';
                  	if (proxy !== '{' + '$GCP.PROXY}' && proxy !== '') {
                  		request.setProxy(proxy);
                  	};
                  	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
          filter:
            evaltype: AND
            conditions:
              - macro: '{#CLOUD_SQL.INSTANCE.DB.TYPE}'
                value: 'SQLSERVER.*'
              - macro: '{#CLOUD_SQL.INSTANCE.NAME}'
                value: '{$GCP.MSSQL.INST.NAME.MATCHES}'
              - macro: '{#CLOUD_SQL.INSTANCE.NAME}'
                value: '{$GCP.MSSQL.INST.NAME.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
              - macro: '{#CLOUD_SQL.INSTANCE.TYPE}'
                value: '{$GCP.MSSQL.INST.TYPE.MATCHES}'
              - macro: '{#CLOUD_SQL.INSTANCE.TYPE}'
                value: '{$GCP.MSSQL.INST.TYPE.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
              - macro: '{#CLOUD_SQL.INSTANCE.ZONE}'
                value: '{$GCP.MSSQL.ZONE.MATCHES}'
              - macro: '{#CLOUD_SQL.INSTANCE.ZONE}'
                value: '{$GCP.MSSQL.ZONE.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
          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: '{#CLOUD_SQL.INSTANCE.DB.TYPE}'
              path: $.db_type
            - lld_macro: '{#CLOUD_SQL.INSTANCE.EXT.IP}'
              path: $.ext_ip
            - lld_macro: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}'
              path: $.high_availability
            - lld_macro: '{#CLOUD_SQL.INSTANCE.IP}'
              path: $.ip
            - lld_macro: '{#CLOUD_SQL.INSTANCE.NAME}'
              path: $.name
            - lld_macro: '{#CLOUD_SQL.INSTANCE.TIER}'
              path: $.tier
            - lld_macro: '{#CLOUD_SQL.INSTANCE.TYPE}'
              path: $.inst_type
            - lld_macro: '{#CLOUD_SQL.INSTANCE.ZONE}'
              path: $.zone
            - lld_macro: '{#CLOUD_SQL.MASTER}'
              path: $.master
            - lld_macro: '{#GCP.AUTH.TOKEN}'
              path: $.token
            - lld_macro: '{#GCP.PROJECT.ID}'
              path: $.project_id
            - lld_macro: '{#MSSQL.AUDITED}'
              path: $.audited
          preprocessing:
            - type: DISCARD_UNCHANGED_HEARTBEAT
              parameters:
                - 3h
          overrides:
            - name: 'MSSQL replica'
              step: '1'
              filter:
                conditions:
                  - macro: '{#CLOUD_SQL.INSTANCE.TYPE}'
                    value: READ_REPLICA_INSTANCE
                  - macro: '{#CLOUD_SQL.MASTER}'
                    operator: EXISTS
              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
          filter:
            evaltype: AND
            conditions:
              - macro: '{#CLOUD_SQL.INSTANCE.DB.TYPE}'
                value: 'MYSQL.*'
              - macro: '{#CLOUD_SQL.INSTANCE.NAME}'
                value: '{$GCP.MYSQL.INST.NAME.MATCHES}'
              - macro: '{#CLOUD_SQL.INSTANCE.NAME}'
                value: '{$GCP.MYSQL.INST.NAME.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
              - macro: '{#CLOUD_SQL.INSTANCE.TYPE}'
                value: '{$GCP.MYSQL.INST.TYPE.MATCHES}'
              - macro: '{#CLOUD_SQL.INSTANCE.TYPE}'
                value: '{$GCP.MYSQL.INST.TYPE.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
              - macro: '{#CLOUD_SQL.INSTANCE.ZONE}'
                value: '{$GCP.MYSQL.ZONE.MATCHES}'
              - macro: '{#CLOUD_SQL.INSTANCE.ZONE}'
                value: '{$GCP.MYSQL.ZONE.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
          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.DB.TYPE}'
              path: $.db_type
            - lld_macro: '{#CLOUD_SQL.INSTANCE.EXT.IP}'
              path: $.ext_ip
            - lld_macro: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}'
              path: $.high_availability
            - lld_macro: '{#CLOUD_SQL.INSTANCE.IP}'
              path: $.ip
            - lld_macro: '{#CLOUD_SQL.INSTANCE.NAME}'
              path: $.name
            - lld_macro: '{#CLOUD_SQL.INSTANCE.TIER}'
              path: $.tier
            - lld_macro: '{#CLOUD_SQL.INSTANCE.TYPE}'
              path: $.inst_type
            - lld_macro: '{#CLOUD_SQL.INSTANCE.ZONE}'
              path: $.zone
            - 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
                  - macro: '{#CLOUD_SQL.MASTER}'
                    operator: EXISTS
              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
          filter:
            evaltype: AND
            conditions:
              - macro: '{#CLOUD_SQL.INSTANCE.DB.TYPE}'
                value: 'POSTGRES.*'
              - macro: '{#CLOUD_SQL.INSTANCE.NAME}'
                value: '{$GCP.PGSQL.INST.NAME.MATCHES}'
              - macro: '{#CLOUD_SQL.INSTANCE.NAME}'
                value: '{$GCP.PGSQL.INST.NAME.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
              - macro: '{#CLOUD_SQL.INSTANCE.TYPE}'
                value: '{$GCP.PGSQL.INST.TYPE.MATCHES}'
              - macro: '{#CLOUD_SQL.INSTANCE.TYPE}'
                value: '{$GCP.PGSQL.TYPE.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
              - macro: '{#CLOUD_SQL.INSTANCE.ZONE}'
                value: '{$GCP.PGSQL.ZONE.MATCHES}'
              - macro: '{#CLOUD_SQL.INSTANCE.ZONE}'
                value: '{$GCP.PGSQL.ZONE.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
          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.DB.TYPE}'
              path: $.db_type
            - lld_macro: '{#CLOUD_SQL.INSTANCE.EXT.IP}'
              path: $.ext_ip
            - lld_macro: '{#CLOUD_SQL.INSTANCE.HIGH.AVAIL}'
              path: $.high_availability
            - lld_macro: '{#CLOUD_SQL.INSTANCE.IP}'
              path: $.ip
            - lld_macro: '{#CLOUD_SQL.INSTANCE.NAME}'
              path: $.name
            - lld_macro: '{#CLOUD_SQL.INSTANCE.TIER}'
              path: $.tier
            - lld_macro: '{#CLOUD_SQL.INSTANCE.TYPE}'
              path: $.inst_type
            - lld_macro: '{#CLOUD_SQL.INSTANCE.ZONE}'
              path: $.zone
            - 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
                  - macro: '{#CLOUD_SQL.MASTER}'
                    operator: EXISTS
              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
          filter:
            evaltype: AND
            conditions:
              - macro: '{#GCE.INSTANCE.NAME}'
                value: '{$GCP.GCE.INST.NAME.MATCHES}'
              - macro: '{#GCE.INSTANCE.NAME}'
                value: '{$GCP.GCE.INST.NAME.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
              - macro: '{#GCE.INSTANCE.ZONE}'
                value: '{$GCP.GCE.ZONE.MATCHES}'
              - macro: '{#GCE.INSTANCE.ZONE}'
                value: '{$GCP.GCE.ZONE.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
          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.EXT.IP}'
              path: $.ext_ip
            - lld_macro: '{#GCE.INSTANCE.ID}'
              path: $.id
            - lld_macro: '{#GCE.INSTANCE.IP}'
              path: $.ip
            - lld_macro: '{#GCE.INSTANCE.NAME}'
              path: $.name
            - lld_macro: '{#GCE.INSTANCE.TYPE}'
              path: $.i_type
            - lld_macro: '{#GCE.INSTANCE.ZONE}'
              path: $.zone
            - lld_macro: '{#GCE.INTEGRITY.STATE}'
              path: $.integrity
            - lld_macro: '{#GCE.MACHINE.TYPE}'
              path: $.m_type
            - 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
          filter:
            evaltype: AND
            conditions:
              - macro: '{#GCE.QUOTA.NAME}'
                value: '{$GCP.GCE.QUOTA.MATCHES}'
              - macro: '{#GCE.QUOTA.NAME}'
                value: '{$GCP.GCE.QUOTA.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
          description: 'GCP Compute Engine: Quotas discovery.'
          item_prototypes:
            - uuid: 1e9a772b9a89497ba695079fc480bd0a
              name: 'Quota [{#GCE.QUOTA.NAME}]: Limit'
              type: DEPENDENT
              key: 'gcp.gce.quota.limit[{#GCE.QUOTA.NAME}]'
              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: '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: 'Quota [{#GCE.QUOTA.NAME}]: Percentage used'
              type: DEPENDENT
              key: 'gcp.gce.quota.pused[{#GCE.QUOTA.NAME}]'
              value_type: FLOAT
              units: '%'
              description: 'GCP Compute Engine: Percentage usage for [{#GCE.QUOTA.NAME}] quota.'
              preprocessing:
                - type: CHECK_NOT_SUPPORTED
                  parameters:
                    - '-1'
                - 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: '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: '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: '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: 'Quota [{#GCE.QUOTA.NAME}]: Raw data'
              type: DEPENDENT
              key: 'gcp.gce.quota.single.raw[{#GCE.QUOTA.NAME}]'
              history: '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: 'Quota [{#GCE.QUOTA.NAME}]: Usage'
              type: DEPENDENT
              key: 'gcp.gce.quota.usage[{#GCE.QUOTA.NAME}]'
              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.LIMIT}'
              path: $.limit
            - lld_macro: '{#GCE.QUOTA.NAME}'
              path: $.metric
            - lld_macro: '{#GCE.QUOTA.USAGE}'
              path: $.usage
          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.'
        - macro: '{$GCP.PROXY}'
          description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.'
      dashboards:
        - uuid: 71df4601171e471ea74a291242028394
          name: 'Project resources'
          pages:
            - name: 'Project resources'
              widgets:
                - type: item
                  name: 'GCE instances total'
                  width: '24'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: decimal_places
                      value: '0'
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP by HTTP'
                        key: gcp.gce.instances.total
                    - type: INTEGER
                      name: show.0
                      value: '2'
                    - type: INTEGER
                      name: show.1
                      value: '4'
                - type: item
                  name: 'Cloud SQL total'
                  'y': '5'
                  width: '18'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: decimal_places
                      value: '0'
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP by HTTP'
                        key: gcp.cloudsql.instances.total
                    - type: INTEGER
                      name: show.0
                      value: '2'
                    - type: INTEGER
                      name: show.1
                      value: '4'
                - type: graphprototype
                  'y': '10'
                  width: '36'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: columns
                      value: '1'
                    - type: GRAPH_PROTOTYPE
                      name: graphid.0
                      value:
                        host: 'GCP by HTTP'
                        name: 'GCP Compute Engine: Quota [{#GCE.QUOTA.NAME}]: Usage'
                    - type: STRING
                      name: reference
                      value: AAAAA
                - type: item
                  name: 'Cloud SQL MySQL'
                  x: '18'
                  'y': '5'
                  width: '18'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: decimal_places
                      value: '0'
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP by HTTP'
                        key: gcp.cloudsql.instances.mysql_count
                    - type: INTEGER
                      name: show.0
                      value: '2'
                    - type: INTEGER
                      name: show.1
                      value: '4'
                - type: item
                  name: 'GCE regular instances'
                  x: '24'
                  width: '24'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: decimal_places
                      value: '0'
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP by HTTP'
                        key: gcp.gce.instances.regular_count
                    - type: INTEGER
                      name: show.0
                      value: '2'
                    - type: INTEGER
                      name: show.1
                      value: '4'
                - type: item
                  name: 'Cloud SQL PostgreSQL'
                  x: '36'
                  'y': '5'
                  width: '18'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: decimal_places
                      value: '0'
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP by HTTP'
                        key: gcp.cloudsql.instances.pgsql_count
                    - type: INTEGER
                      name: show.0
                      value: '2'
                    - type: INTEGER
                      name: show.1
                      value: '4'
                - type: graphprototype
                  x: '36'
                  'y': '10'
                  width: '36'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: columns
                      value: '1'
                    - type: ITEM_PROTOTYPE
                      name: itemid.0
                      value:
                        host: 'GCP by HTTP'
                        key: 'gcp.gce.quota.pused[{#GCE.QUOTA.NAME}]'
                    - type: STRING
                      name: reference
                      value: AAAAB
                    - type: INTEGER
                      name: source_type
                      value: '3'
                - type: item
                  name: 'GCE COS instances'
                  x: '48'
                  width: '24'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: decimal_places
                      value: '0'
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP by HTTP'
                        key: gcp.gce.instances.cos_count
                    - type: INTEGER
                      name: show.0
                      value: '2'
                    - type: INTEGER
                      name: show.1
                      value: '4'
                - type: item
                  name: 'Cloud SQL MSSQL'
                  x: '54'
                  'y': '5'
                  width: '18'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: decimal_places
                      value: '0'
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP by HTTP'
                        key: gcp.cloudsql.instances.mssql_count
                    - type: INTEGER
                      name: show.0
                      value: '2'
                    - type: INTEGER
                      name: show.1
                      value: '4'
    - 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"
      vendor:
        name: Zabbix
        version: 7.0-0
      groups:
        - name: Templates/Cloud
      items:
        - uuid: a8d79cab89864c03a7614bd59f734942
          name: 'Audits size'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.audits_size
          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: 'Audits successfully uploaded'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.audits_upload_count
          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: 'Connection resets'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.conn.connection_reset_count
          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: 'Login attempts'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.conn.login_attempt_count
          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: Logouts
          type: DEPENDENT
          key: gcp.cloudsql.mssql.conn.logout_count
          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: 'Processes blocked'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.conn.processes_blocked
          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: 'Reserved CPU cores'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.cpu.reserved_cores
          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: 'CPU usage time'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.cpu.usage_time
          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: 'CPU utilization'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.cpu.utilization
          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: '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: 'Databases get'
          type: SCRIPT
          key: gcp.cloudsql.mssql.db.get
          delay: '{$GCP.TIME.WINDOW}'
          history: '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();
            	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
            		request.setProxy(params.proxy);
            	};
            	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)),
            	j_filter = ' | within ' + params.time_window + " | filter database_id = '" + params.database_id + "'" + ' | join',
            	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/timeSeries:query',
            	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:
                - '-1'
          timeout: '{$GCP.DATA.TIMEOUT}'
          parameters:
            - name: database_id
              value: '{$GCP.PROJECT.ID}:{HOST.NAME}'
            - name: project_id
              value: '{$GCP.PROJECT.ID}'
            - name: proxy
              value: '{$GCP.PROXY}'
            - name: time_window
              value: '{$GCP.TIME.WINDOW}'
            - name: token
              value: '{$GCP.AUTH.TOKEN}'
          tags:
            - tag: component
              value: raw
        - uuid: 9806c645a10a4e1d8fbb39eb1d3ac993
          name: 'DB engine state'
          type: HTTP_AGENT
          key: gcp.cloudsql.mssql.db.state
          description: 'GCP Cloud SQL MSSQL DB Engine State.'
          valuemap:
            name: 'Database availability'
          preprocessing:
            - type: CHECK_NOT_SUPPORTED
              parameters:
                - '-1'
            - 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'
          status_codes: ''
          posts: '{"query":"cloudsql.googleapis.com/database/up | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}'
          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: '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: 'Failed to get the instance state'
                  expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 10'
                - name: 'Instance is in failed state'
                  expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 5'
                - name: 'Instance is in maintenance'
                  expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 4'
                - name: 'Instance is in suspended state'
                  expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 1'
                - name: 'Instance is in unknown state'
                  expression: 'last(/GCP Cloud SQL MSSQL by HTTP/gcp.cloudsql.mssql.inst.state) = 6'
                - name: '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: 'Disk bytes used'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.disk.bytes_used
          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: 'Disk size'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.disk.quota
          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: 'Disk read I/O'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.disk.read_ops_count
          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: 'Disk utilization'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.disk.utilization
          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: '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: 'Disk space is low'
              opdata: 'Current utilization: {ITEM.LASTVALUE}'
              priority: WARNING
              description: 'High utilization of the storage space.'
              dependencies:
                - name: '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: 'Disk write I/O'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.disk.write_ops_count
          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: 'Instance state'
          type: HTTP_AGENT
          key: gcp.cloudsql.mssql.inst.state
          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'
          status_codes: ''
          posts: '{"query":"cloudsql.googleapis.com/database/state | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}'
          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: '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: '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: '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: '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: '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: '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: 'Buffer cache hit ratio'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.buffer_cache_hit_ratio
          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: 'Checkpoint pages'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.checkpoint_page_count
          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: 'Free list stalls'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.free_list_stall_count
          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: 'Lazy writes'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.lazy_write_count
          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: 'Memory grants pending'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.memory_grants_pending
          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: 'Page life expectancy'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.page_life_expectancy
          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: 'Read page operations'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.page_ops.read
          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: 'Write age operations'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.page_ops.write
          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: 'Memory size'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.quota
          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: 'Memory used by DB engine'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.total_usage
          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: 'Memory usage'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.usage
          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: 'Memory utilization'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.memory.utilization
          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: '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: 'Metrics get'
          type: SCRIPT
          key: gcp.cloudsql.mssql.metrics.get
          delay: '{$GCP.TIME.WINDOW}'
          history: '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();
            	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
            		request.setProxy(params.proxy);
            	};
            	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 filter = ' | within ' + params.time_window + " | filter database_id = '" + params.database_id + "'",
            	j_filter = filter + ' | join',
            	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/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:
                - '-1'
          timeout: '{$GCP.DATA.TIMEOUT}'
          parameters:
            - name: audited
              value: '{$CLOUD_SQL.MSSQL.AUDITED}'
            - name: database_id
              value: '{$GCP.PROJECT.ID}:{HOST.NAME}'
            - name: project_id
              value: '{$GCP.PROJECT.ID}'
            - name: proxy
              value: '{$GCP.PROXY}'
            - name: time_window
              value: '{$GCP.TIME.WINDOW}'
            - name: token
              value: '{$GCP.AUTH.TOKEN}'
          tags:
            - tag: component
              value: raw
        - uuid: 393b6117008d4925be9474afc9c7cdf9
          name: Connections
          type: DEPENDENT
          key: gcp.cloudsql.mssql.network.connections
          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: 'Network: Received bytes'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.network.received_bytes_count
          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: 'Network: Sent bytes'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.network.sent_bytes_count
          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: 'Resources get'
          type: SCRIPT
          key: gcp.cloudsql.mssql.resources.get
          delay: '{$GCP.TIME.WINDOW}'
          history: '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();
            	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
            		request.setProxy(params.proxy);
            	};
            	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)),
            	j_filter = ' | within ' + params.time_window + " | filter database_id = '" + params.database_id + "'" + ' | join',
            	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/timeSeries:query',
            	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:
                - '-1'
          timeout: '{$GCP.DATA.TIMEOUT}'
          parameters:
            - name: database_id
              value: '{$GCP.PROJECT.ID}:{HOST.NAME}'
            - name: project_id
              value: '{$GCP.PROJECT.ID}'
            - name: proxy
              value: '{$GCP.PROXY}'
            - name: time_window
              value: '{$GCP.TIME.WINDOW}'
            - name: token
              value: '{$GCP.AUTH.TOKEN}'
          tags:
            - tag: component
              value: raw
        - uuid: 3c14882329b94b8e88ca5d85e21bb7c8
          name: 'Schedulers get'
          type: SCRIPT
          key: gcp.cloudsql.mssql.schedulers.get
          delay: '{$GCP.TIME.WINDOW}'
          history: '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();
            	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
            		request.setProxy(params.proxy);
            	};
            	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)),
            	j_filter = ' | within ' + params.time_window + " | filter database_id = '" + params.database_id + "'" + ' | join',
            	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/timeSeries:query',
            	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:
                - '-1'
          timeout: '{$GCP.DATA.TIMEOUT}'
          parameters:
            - name: database_id
              value: '{$GCP.PROJECT.ID}:{HOST.NAME}'
            - name: project_id
              value: '{$GCP.PROJECT.ID}'
            - name: proxy
              value: '{$GCP.PROXY}'
            - name: time_window
              value: '{$GCP.TIME.WINDOW}'
            - name: token
              value: '{$GCP.AUTH.TOKEN}'
          tags:
            - tag: component
              value: raw
        - uuid: 7d2c28a537e44ee284e4b5d186b935d6
          name: 'Batch requests'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.trans.batch_request_count
          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: 'Forwarded records'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.trans.forwarded_record_count
          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: 'Full scans'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.trans.full_scan_count
          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: 'Page splits'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.trans.page_split_count
          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: 'Probe scans'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.trans.probe_scan_count
          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: 'SQL compilations'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.trans.sql_compilation_count
          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: 'SQL recompilations'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.trans.sql_recompilation_count
          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
          filter:
            evaltype: AND
            conditions:
              - macro: '{#DB.NAME}'
                value: '{$CLOUD_SQL.MSSQL.DB.NAME.MATCHES}'
              - macro: '{#DB.NAME}'
                value: '{$CLOUD_SQL.MSSQL.DB.NAME.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
          description: 'Databases discovery.'
          item_prototypes:
            - uuid: 8f6deafa9efd416797ea58d1fce41c29
              name: 'Database [{#DB.NAME}]: Log bytes flushed'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.db.log_bytes_flushed_count[{#DB.NAME}]'
              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: 'Database [{#DB.NAME}]: Raw data'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.db.raw[{#DB.NAME}]'
              history: '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: 'Database [{#DB.NAME}]: Transactions started'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.db.transaction_count[{#DB.NAME}]'
              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
          filter:
            evaltype: AND
            conditions:
              - macro: '{#RESOURCE.NAME}'
                value: '{$CLOUD_SQL.MSSQL.RES.NAME.MATCHES}'
              - macro: '{#RESOURCE.NAME}'
                value: '{$CLOUD_SQL.MSSQL.RES.NAME.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
          description: 'Resources discovery.'
          item_prototypes:
            - uuid: 55bb12000dca46e096045da83a46edea
              name: 'Resource [{#RESOURCE.NAME}]: Deadlocks'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.resource.deadlock_count[{#RESOURCE.NAME}]'
              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: 'Resource [{#RESOURCE.NAME}]: Lock waits'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.resource.lock_wait_count[{#RESOURCE.NAME}]'
              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: 'Resource [{#RESOURCE.NAME}]: Lock wait time'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.resource.lock_wait_time[{#RESOURCE.NAME}]'
              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: 'Resource [{#RESOURCE.NAME}]: Raw data'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.resource.raw[{#RESOURCE.NAME}]'
              history: '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
          filter:
            evaltype: AND
            conditions:
              - macro: '{#SCHEDULER.ID}'
                value: '{$CLOUD_SQL.MSSQL.SCHEDULER.ID.MATCHES}'
              - macro: '{#SCHEDULER.ID}'
                value: '{$CLOUD_SQL.MSSQL.SCHEDULER.ID.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
          description: 'Schedulers discovery.'
          item_prototypes:
            - uuid: 67bde61c128e4dfe9e47d8a3a6e3ceec
              name: 'Scheduler [{#SCHEDULER.ID}]: Active workers'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.scheduler.active_workers[{#SCHEDULER.ID}]'
              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: 'Scheduler [{#SCHEDULER.ID}]: Current tasks'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.scheduler.current_tasks[{#SCHEDULER.ID}]'
              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: 'Scheduler [{#SCHEDULER.ID}]: Current workers'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.scheduler.current_workers[{#SCHEDULER.ID}]'
              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: 'Scheduler [{#SCHEDULER.ID}]: Pending I/O operations'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.scheduler.pending_disk_io[{#SCHEDULER.ID}]'
              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: 'Scheduler [{#SCHEDULER.ID}]: Raw data'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.scheduler.raw[{#SCHEDULER.ID}]'
              history: '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: 'Scheduler [{#SCHEDULER.ID}]: Runnable tasks'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.scheduler.runnable_tasks[{#SCHEDULER.ID}]'
              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: 'Scheduler [{#SCHEDULER.ID}]: Work queue'
              type: DEPENDENT
              key: 'gcp.cloudsql.mssql.scheduler.work_queue[{#SCHEDULER.ID}]'
              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.PROXY}'
          description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.'
        - 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: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        key: gcp.cloudsql.mssql.cpu.usage_time
                    - type: STRING
                      name: reference
                      value: AAAAA
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  'y': '5'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        name: 'GCP Cloud SQL MSSQL: Memory usage'
                    - type: STRING
                      name: reference
                      value: AAAAC
                - type: graph
                  'y': '10'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        key: gcp.cloudsql.mssql.disk.utilization
                    - type: STRING
                      name: reference
                      value: AAAAE
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  'y': '15'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        name: 'GCP Cloud SQL MSSQL: Network traffic'
                    - type: STRING
                      name: reference
                      value: AAAAG
                - type: graph
                  'y': '20'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        name: 'GCP Cloud SQL MSSQL: Transactions'
                    - type: STRING
                      name: reference
                      value: AAAAI
                - type: graph
                  'y': '25'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        name: 'GCP Cloud SQL MSSQL: Memory workflow'
                    - type: STRING
                      name: reference
                      value: AAAAK
                - type: graph
                  x: '36'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        key: gcp.cloudsql.mssql.cpu.utilization
                    - type: STRING
                      name: reference
                      value: AAAAB
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  x: '36'
                  'y': '5'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        key: gcp.cloudsql.mssql.memory.utilization
                    - type: STRING
                      name: reference
                      value: AAAAD
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  x: '36'
                  'y': '10'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        name: 'GCP Cloud SQL MSSQL: Disk read/write operations'
                    - type: STRING
                      name: reference
                      value: AAAAF
                - type: graph
                  x: '36'
                  'y': '15'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        key: gcp.cloudsql.mssql.network.connections
                    - type: STRING
                      name: reference
                      value: AAAAH
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  x: '36'
                  'y': '20'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        key: gcp.cloudsql.mssql.memory.buffer_cache_hit_ratio
                    - type: STRING
                      name: reference
                      value: AAAAJ
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  x: '36'
                  'y': '25'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL by HTTP'
                        name: 'GCP Cloud SQL MSSQL: Memory Read/Writes'
                    - type: STRING
                      name: reference
                      value: AAAAL
      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"
      vendor:
        name: Zabbix
        version: 7.0-0
      groups:
        - name: Templates/Cloud
      items:
        - uuid: e66fe8bb6f924cb088ec57b215fe21d7
          name: 'Bytes sent to replica'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.repl.bytes_sent_to_replica_count
          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: 'Log apply pending queue'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.repl.log_apply_pending_queue
          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: 'Log bytes received'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.repl.log_bytes_received_count
          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: 'Replica metrics get'
          type: SCRIPT
          key: gcp.cloudsql.mssql.repl.metrics.get
          delay: '{$GCP.TIME.WINDOW}'
          history: '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();
            	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
            		request.setProxy(params.proxy);
            	};
            	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)),
            	filter = ' | within ' + params.time_window + " | filter database_id = '" + params.database_id + "'",
            	j_filter = filter + ' | join',
            	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/timeSeries:query',
            	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:
                - '-1'
          timeout: '{$GCP.DATA.TIMEOUT}'
          parameters:
            - name: database_id
              value: '{$GCP.PROJECT.ID}:{HOST.NAME}'
            - name: project_id
              value: '{$GCP.PROJECT.ID}'
            - name: proxy
              value: '{$GCP.PROXY}'
            - name: time_window
              value: '{$GCP.TIME.WINDOW}'
            - name: token
              value: '{$GCP.AUTH.TOKEN}'
          tags:
            - tag: component
              value: raw
        - uuid: 4ec364fea7894df29813b65c2d170367
          name: 'Recovery queue'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.repl.recovery_queue
          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: 'Redone bytes'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.repl.redone_bytes_count
          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: 'Resent messages'
          type: DEPENDENT
          key: gcp.cloudsql.mssql.repl.resent_message_count
          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.PROXY}'
          description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.'
        - 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: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL Replica by HTTP'
                        name: 'GCP Cloud SQL MSSQL: Replication data'
                    - type: STRING
                      name: reference
                      value: AAAAA
                - type: graph
                  x: '36'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MSSQL Replica by HTTP'
                        key: gcp.cloudsql.mssql.repl.log_apply_pending_queue
                    - type: STRING
                      name: reference
                      value: AAAAB
                    - type: INTEGER
                      name: source_type
                      value: '1'
    - 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"
      vendor:
        name: Zabbix
        version: 7.0-0
      groups:
        - name: Templates/Cloud
      items:
        - uuid: 83e36c61e8ce4d06a395ea7b06c5877b
          name: 'Reserved CPU cores'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.cpu.reserved_cores
          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: 'CPU usage time'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.cpu.usage_time
          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: 'CPU utilization'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.cpu.utilization
          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: '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: 'DB engine state'
          type: HTTP_AGENT
          key: gcp.cloudsql.mysql.db.state
          description: 'GCP Cloud SQL MySQL DB Engine State.'
          valuemap:
            name: 'Database availability'
          preprocessing:
            - type: CHECK_NOT_SUPPORTED
              parameters:
                - '-1'
            - 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'
          status_codes: ''
          posts: '{"query":"cloudsql.googleapis.com/database/up | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}'
          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: '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: 'Failed to get the instance state'
                  expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 10'
                - name: 'Instance is in failed state'
                  expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 5'
                - name: 'Instance is in maintenance'
                  expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 4'
                - name: 'Instance is in suspended state'
                  expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 1'
                - name: 'Instance is in unknown state'
                  expression: 'last(/GCP Cloud SQL MySQL by HTTP/gcp.cloudsql.mysql.inst.state) = 6'
                - name: '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: 'Disk bytes used'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.disk.bytes_used
          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: 'Disk size'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.disk.quota
          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: 'Disk read I/O'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.disk.read_ops_count
          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: 'Disk utilization'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.disk.utilization
          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: '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: 'Disk space is low'
              opdata: 'Current utilization: {ITEM.LASTVALUE}'
              priority: WARNING
              description: 'High utilization of the storage space.'
              dependencies:
                - name: '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: 'Disk write I/O'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.disk.write_ops_count
          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: 'InnoDB dirty pages'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.innodb_buffer_pool_pages_dirty
          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: 'InnoDB free pages'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.innodb_buffer_pool_pages_free
          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: 'InnoDB total pages'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.innodb_buffer_pool_pages_total
          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: 'InnoDB fsync calls'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.innodb_data_fsyncs
          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: 'InnoDB log fsync calls'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.innodb_os_log_fsyncs
          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: 'InnoDB pages read'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.innodb_pages_read
          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: 'InnoDB pages written'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.innodb_pages_written
          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: 'Instance state'
          type: HTTP_AGENT
          key: gcp.cloudsql.mysql.inst.state
          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'
          status_codes: ''
          posts: '{"query":"cloudsql.googleapis.com/database/state | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}'
          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: '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: '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: '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: '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: '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: '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: 'Memory size'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.memory.quota
          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: 'Memory used by DB engine'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.memory.total_usage
          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: 'Memory usage'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.memory.usage
          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: 'Memory utilization'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.memory.utilization
          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: '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: 'Metrics get'
          type: SCRIPT
          key: gcp.cloudsql.mysql.metrics.get
          delay: '{$GCP.TIME.WINDOW}'
          history: '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();
            	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
            		request.setProxy(params.proxy);
            	};
            	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)),
            	j_filter = ' | within ' + params.time_window + " | filter database_id = '" + params.database_id + "'" + ' | join',
            	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/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:
                - '-1'
          timeout: '{$GCP.DATA.TIMEOUT}'
          parameters:
            - name: database_id
              value: '{$GCP.PROJECT.ID}:{HOST.NAME}'
            - name: project_id
              value: '{$GCP.PROJECT.ID}'
            - name: proxy
              value: '{$GCP.PROXY}'
            - name: time_window
              value: '{$GCP.TIME.WINDOW}'
            - name: token
              value: '{$GCP.AUTH.TOKEN}'
          tags:
            - tag: component
              value: raw
        - uuid: 9ddae405a9b343759d03b5b29c469d18
          name: Connections
          type: DEPENDENT
          key: gcp.cloudsql.mysql.network.connections
          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: 'Network: Received bytes'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.network.received_bytes_count
          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: 'Network: Sent bytes'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.network.sent_bytes_count
          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: 'Open tables'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.open_tables
          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: 'Open table definitions'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.open_table_definitions
          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: 'Network: Bytes received by MySQL'
          type: DEPENDENT
          key: gcp.cloudsql.mysql_received_bytes_count
          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: 'Network: Bytes sent by MySQL'
          type: DEPENDENT
          key: gcp.cloudsql.mysql_sent_bytes_count
          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: Queries
          type: DEPENDENT
          key: gcp.cloudsql.queries
          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: Questions
          type: DEPENDENT
          key: gcp.cloudsql.questions
          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.PROXY}'
          description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.'
        - 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: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MySQL by HTTP'
                        key: gcp.cloudsql.mysql.cpu.usage_time
                    - type: STRING
                      name: reference
                      value: AAAAA
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  'y': '5'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MySQL by HTTP'
                        name: 'GCP Cloud SQL MySQL: Memory usage'
                    - type: STRING
                      name: reference
                      value: AAAAC
                - type: graph
                  'y': '10'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MySQL by HTTP'
                        key: gcp.cloudsql.mysql.disk.utilization
                    - type: STRING
                      name: reference
                      value: AAAAE
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  'y': '15'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MySQL by HTTP'
                        name: 'GCP Cloud SQL MySQL: Network traffic'
                    - type: STRING
                      name: reference
                      value: AAAAG
                - type: graph
                  'y': '20'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MySQL by HTTP'
                        name: 'GCP Cloud SQL MySQL: pages'
                    - type: STRING
                      name: reference
                      value: AAAAI
                - type: graph
                  x: '36'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MySQL by HTTP'
                        key: gcp.cloudsql.mysql.cpu.utilization
                    - type: STRING
                      name: reference
                      value: AAAAB
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  x: '36'
                  'y': '5'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MySQL by HTTP'
                        key: gcp.cloudsql.mysql.memory.utilization
                    - type: STRING
                      name: reference
                      value: AAAAD
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  x: '36'
                  'y': '10'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MySQL by HTTP'
                        name: 'GCP Cloud SQL MySQL: Disk read/write operations'
                    - type: STRING
                      name: reference
                      value: AAAAF
                - type: graph
                  x: '36'
                  'y': '15'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MySQL by HTTP'
                        key: gcp.cloudsql.mysql.network.connections
                    - type: STRING
                      name: reference
                      value: AAAAH
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  x: '36'
                  'y': '20'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MySQL by HTTP'
                        name: 'GCP Cloud SQL MySQL: Queries'
                    - type: STRING
                      name: reference
                      value: AAAAJ
      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"
      vendor:
        name: Zabbix
        version: 7.0-0
      groups:
        - name: Templates/Cloud
      items:
        - uuid: 17aa9eb4749e46be9b0b0f93ef011fca
          name: 'Last I/O thread error number'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.repl.last_io_errno
          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: 'Last SQL thread error number'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.repl.last_sql_errno
          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: 'Replica metrics get'
          type: SCRIPT
          key: gcp.cloudsql.mysql.repl.metrics.get
          delay: '{$GCP.TIME.WINDOW}'
          history: '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();
            	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
            		request.setProxy(params.proxy);
            	};
            	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)),
            	filter = ' | within ' + params.time_window + " | filter database_id = '" + params.database_id + "'",
            	j_filter = filter + ' | join',
            	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/timeSeries:query',
            	metric_raw = getHttpData(url, params.token, { query: '{' + mysql_paths.join(';') + '}' + j_filter }),
            	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:
                - '-1'
          timeout: '{$GCP.DATA.TIMEOUT}'
          parameters:
            - name: database_id
              value: '{$GCP.PROJECT.ID}:{HOST.NAME}'
            - name: project_id
              value: '{$GCP.PROJECT.ID}'
            - name: proxy
              value: '{$GCP.PROXY}'
            - name: time_window
              value: '{$GCP.TIME.WINDOW}'
            - name: token
              value: '{$GCP.AUTH.TOKEN}'
          tags:
            - tag: component
              value: raw
        - uuid: e84ac3a2537848b29024659ab5e3a0e9
          name: 'Network lag'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.repl.network_lag
          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: 'Replication lag'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.repl.replica_lag
          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: 'Slave I/O thread running'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.repl.slave_io_running
          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: 'Slave SQL thread running'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.repl.slave_sql_running
          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
          master_item:
            key: gcp.cloudsql.mysql.repl.metrics.get
          tags:
            - tag: component
              value: replication
        - uuid: 90a9154072164b5c89d715fa77e7e2b0
          name: 'Replication state'
          type: DEPENDENT
          key: gcp.cloudsql.mysql.repl.state
          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.PROXY}'
          description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.'
        - 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: '72'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL MySQL Replica by HTTP'
                        name: 'GCP Cloud SQL MySQL: Lags'
                    - type: STRING
                      name: reference
                      value: AAAAA
                - type: item
                  name: 'I/O Thread State'
                  'y': '5'
                  width: '18'
                  height: '3'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MySQL Replica by HTTP'
                        key: gcp.cloudsql.mysql.repl.slave_io_running
                    - type: INTEGER
                      name: show.0
                      value: '2'
                - type: item
                  name: 'I/O Thread Error'
                  x: '18'
                  'y': '5'
                  width: '18'
                  height: '3'
                  fields:
                    - type: INTEGER
                      name: decimal_size
                      value: '1'
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MySQL Replica by HTTP'
                        key: gcp.cloudsql.mysql.repl.last_io_errno
                    - type: INTEGER
                      name: show.0
                      value: '2'
                - type: item
                  name: 'SQL Thread State'
                  x: '36'
                  'y': '5'
                  width: '18'
                  height: '3'
                  fields:
                    - type: INTEGER
                      name: decimal_size
                      value: '1'
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MySQL Replica by HTTP'
                        key: gcp.cloudsql.mysql.repl.slave_sql_running
                    - type: INTEGER
                      name: show.0
                      value: '2'
                - type: item
                  name: 'SQL Thread Error'
                  x: '54'
                  'y': '5'
                  width: '18'
                  height: '3'
                  fields:
                    - type: INTEGER
                      name: decimal_size
                      value: '1'
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL MySQL Replica by HTTP'
                        key: gcp.cloudsql.mysql.repl.last_sql_errno
                    - type: INTEGER
                      name: show.0
                      value: '2'
      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"
      vendor:
        name: Zabbix
        version: 7.0-0
      groups:
        - name: Templates/Cloud
      items:
        - uuid: 396a555958514890af339f4504a96cc6
          name: 'Reserved CPU cores'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.cpu.reserved_cores
          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: 'CPU usage time'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.cpu.usage_time
          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: 'CPU utilization'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.cpu.utilization
          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: '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: 'DB engine state'
          type: HTTP_AGENT
          key: gcp.cloudsql.pgsql.db.state
          description: 'GCP Cloud SQL PostgreSQL DB Engine State.'
          valuemap:
            name: 'Database availability'
          preprocessing:
            - type: CHECK_NOT_SUPPORTED
              parameters:
                - '-1'
            - 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'
          status_codes: ''
          posts: '{"query":"cloudsql.googleapis.com/database/up | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}'
          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: '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: 'Failed to get the instance state'
                  expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 10'
                - name: 'Instance is in failed state'
                  expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 5'
                - name: 'Instance is in maintenance'
                  expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 4'
                - name: 'Instance is in suspended state'
                  expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 1'
                - name: 'Instance is in unknown state'
                  expression: 'last(/GCP Cloud SQL PostgreSQL by HTTP/gcp.cloudsql.pgsql.inst.state) = 6'
                - name: '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: 'Disk bytes used'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.disk.bytes_used
          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: 'Disk size'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.disk.quota
          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: 'Disk read I/O'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.disk.read_ops_count
          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: 'Disk utilization'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.disk.utilization
          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: '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: 'Disk space is low'
              opdata: 'Current utilization: {ITEM.LASTVALUE}'
              priority: WARNING
              description: 'High utilization of the storage space.'
              dependencies:
                - name: '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: 'Disk write I/O'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.disk.write_ops_count
          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: 'Instance state'
          type: HTTP_AGENT
          key: gcp.cloudsql.pgsql.inst.state
          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'
          status_codes: ''
          posts: '{"query":"cloudsql.googleapis.com/database/state | within 5m | filter database_id = ''{$GCP.PROJECT.ID}:{HOST.NAME}''"}'
          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: '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: '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: '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: '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: '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: '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: 'Memory size'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.memory.quota
          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: 'Memory used by DB engine'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.memory.total_usage
          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: 'Memory usage'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.memory.usage
          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: 'Memory utilization'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.memory.utilization
          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: '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: 'Metrics get'
          type: SCRIPT
          key: gcp.cloudsql.pgsql.metrics.get
          delay: '{$GCP.TIME.WINDOW}'
          history: '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();
            	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
            		request.setProxy(params.proxy);
            	};
            	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)),
            	filter = ' | within ' + params.time_window + " | filter database_id = '" + params.database_id + "'",
            	j_filter = filter + ' | join',
            	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/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 ' + params.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:
                - '-1'
          timeout: '{$GCP.DATA.TIMEOUT}'
          parameters:
            - name: database_id
              value: '{$GCP.PROJECT.ID}:{HOST.NAME}'
            - name: project_id
              value: '{$GCP.PROJECT.ID}'
            - name: proxy
              value: '{$GCP.PROXY}'
            - name: time_window
              value: '{$GCP.TIME.WINDOW}'
            - name: token
              value: '{$GCP.AUTH.TOKEN}'
          tags:
            - tag: component
              value: raw
        - uuid: f2d00c86eedd4a1e8efce7661c3da18d
          name: 'Network: Received bytes'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.network.received_bytes_count
          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: 'Network: Sent bytes'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.network.sent_bytes_count
          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: Connections
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.num_backends
          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: 'Oldest prepared transaction age'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.oldest_transaction.prepared
          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: 'Oldest replica transaction age'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.oldest_transaction.replica
          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: 'Oldest replication slot transaction age'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.oldest_transaction.replication_slot
          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: 'Oldest running transaction age'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.oldest_transaction.running
          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: 'Data written to temporary'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.temp_bytes_written_count
          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: 'Temporary files used for writing data'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.temp_files_written_count
          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: 'Assigned transactions'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.transaction_id_count_assigned
          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: 'Frozen transactions'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.transaction_id_count_frozen
          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: 'Transaction ID utilization'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.transaction_id_utilization
          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}'
              - macro: '{#PGSQL.DB.NAME}'
                value: '{$GCP.CLOUD_SQL.DB.NAME.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
          description: 'Databases discovery for the particular PostgreSQL instance.'
          item_prototypes:
            - uuid: 997bdb03ba0b437ca2705f28dcc651ed
              name: 'Database [{#PGSQL.DB.NAME}]: Buffer cache blocks read.'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.blocks_read_count_buffer_cache[{#PGSQL.DB.NAME}]'
              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: 'Database [{#PGSQL.DB.NAME}]: Disk blocks read.'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.blocks_read_count_disk[{#PGSQL.DB.NAME}]'
              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: 'Database [{#PGSQL.DB.NAME}]: Metrics raw'
              type: SCRIPT
              key: 'gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]'
              delay: '{$GCP.TIME.WINDOW}'
              history: '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();
                	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
                		request.setProxy(params.proxy);
                	};
                	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)),
                	filter = ' | within ' + params.time_window + " | filter database_id ='" + params.database_id + "'" + " | filter database ='" + params.database_name + "'",
                	j_filter = filter + ' | join',
                	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/timeSeries:query',
                	common_paths = ['deadlock_count', 'tuples_returned_count', 'tuples_fetched_count'],
                	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:
                    - '-1'
              timeout: '{$GCP.DATA.TIMEOUT}'
              parameters:
                - name: database_id
                  value: '{$GCP.PROJECT.ID}:{HOST.NAME}'
                - name: database_name
                  value: '{#PGSQL.DB.NAME}'
                - name: project_id
                  value: '{$GCP.PROJECT.ID}'
                - name: proxy
                  value: '{$GCP.PROXY}'
                - name: time_window
                  value: '{$GCP.TIME.WINDOW}'
                - name: token
                  value: '{$GCP.AUTH.TOKEN}'
              tags:
                - tag: component
                  value: raw
                - tag: database
                  value: '{#PGSQL.DB.NAME}'
            - uuid: d5632c60593749209a6e681b396f4cc7
              name: 'Database [{#PGSQL.DB.NAME}]: Deadlocks count'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.deadlock_count[{#PGSQL.DB.NAME}]'
              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: 'Database [{#PGSQL.DB.NAME}]: Committed transactions'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.transaction_count_commit[{#PGSQL.DB.NAME}]'
              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: 'Database [{#PGSQL.DB.NAME}]: Rolled-back transactions'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.transaction_count_rollback[{#PGSQL.DB.NAME}]'
              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: 'Database [{#PGSQL.DB.NAME}]: Tuples fetched'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.tuples_fetched_count[{#PGSQL.DB.NAME}]'
              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: 'Database [{#PGSQL.DB.NAME}]: Deleted rows processed'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.tuples_processed_count_delete[{#PGSQL.DB.NAME}]'
              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: 'Database [{#PGSQL.DB.NAME}]: Inserted rows processed.'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.tuples_processed_count_insert[{#PGSQL.DB.NAME}]'
              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: 'Database [{#PGSQL.DB.NAME}]: Updated rows processed'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.tuples_processed_count_update[{#PGSQL.DB.NAME}]'
              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: 'Database [{#PGSQL.DB.NAME}]: Tuples returned'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.tuples_returned_count[{#PGSQL.DB.NAME}]'
              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: 'Database [{#PGSQL.DB.NAME}]: Dead tuples'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.tuple_size_dead[{#PGSQL.DB.NAME}]'
              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: 'Database [{#PGSQL.DB.NAME}]: Live tuples'
              type: DEPENDENT
              key: 'gcp.cloudsql.pgsql.tuple_size_live[{#PGSQL.DB.NAME}]'
              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.PROXY}'
          description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.'
        - 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: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        key: gcp.cloudsql.pgsql.cpu.usage_time
                    - type: STRING
                      name: reference
                      value: AAAAA
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  'y': '5'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        name: 'GCP Cloud SQL PostgreSQL: Memory usage'
                    - type: STRING
                      name: reference
                      value: AAAAC
                - type: graph
                  'y': '10'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        key: gcp.cloudsql.pgsql.disk.utilization
                    - type: STRING
                      name: reference
                      value: AAAAE
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  'y': '15'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        name: 'GCP Cloud SQL PostgreSQL: Network traffic'
                    - type: STRING
                      name: reference
                      value: AAAAG
                - type: graph
                  'y': '20'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        name: 'GCP Cloud SQL PostgreSQL: Transactions count'
                    - type: STRING
                      name: reference
                      value: AAAAI
                - type: graphprototype
                  'y': '25'
                  width: '36'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: columns
                      value: '1'
                    - type: GRAPH_PROTOTYPE
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        name: 'GCP Cloud SQL PostgreSQL: Database [{#PGSQL.DB.NAME}]: Tuples'
                    - type: STRING
                      name: reference
                      value: AAAAK
                - type: graph
                  x: '36'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        key: gcp.cloudsql.pgsql.cpu.utilization
                    - type: STRING
                      name: reference
                      value: AAAAB
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  x: '36'
                  'y': '5'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        key: gcp.cloudsql.pgsql.memory.utilization
                    - type: STRING
                      name: reference
                      value: AAAAD
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  x: '36'
                  'y': '10'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        name: 'GCP Cloud SQL PostgreSQL: Disk read/write operations'
                    - type: STRING
                      name: reference
                      value: AAAAF
                - type: graph
                  x: '36'
                  'y': '15'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        key: gcp.cloudsql.pgsql.transaction_id_utilization
                    - type: STRING
                      name: reference
                      value: AAAAH
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  x: '36'
                  'y': '20'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        name: 'GCP Cloud SQL PostgreSQL: Transaction age'
                    - type: STRING
                      name: reference
                      value: AAAAJ
                - type: graphprototype
                  x: '36'
                  'y': '25'
                  width: '36'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: columns
                      value: '1'
                    - type: ITEM_PROTOTYPE
                      name: itemid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL by HTTP'
                        key: 'gcp.cloudsql.pgsql.deadlock_count[{#PGSQL.DB.NAME}]'
                    - type: STRING
                      name: reference
                      value: AAAAL
                    - type: INTEGER
                      name: source_type
                      value: '3'
      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"
      vendor:
        name: Zabbix
        version: 7.0-0
      groups:
        - name: Templates/Cloud
      items:
        - uuid: c67dd812c7784948bad5dfa0d9a6cc66
          name: 'Flush location lag'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.repl.flush_location
          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: 'Number of log archival failures'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.repl.log_archive_failure_count
          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: 'Number of log archival successes'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.repl.log_archive_success_count
          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: 'Replica metrics get'
          type: SCRIPT
          key: gcp.cloudsql.pgsql.repl.metrics.get
          delay: '{$GCP.TIME.WINDOW}'
          history: '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();
            	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
            		request.setProxy(params.proxy);
            	};
            	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)),
            	filter = ' | within ' + params.time_window + " | filter database_id = '" + params.database_id + "'",
            	j_filter = filter + ' | join',
            	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/timeSeries:query',
            	metric_raw = getHttpData(url, params.token, { query: '{' + base_paths.map(function (path) { return base_path + path; }).join(';') + '}' + j_filter }),
            	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 ' + params.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:
                - '-1'
          timeout: '{$GCP.DATA.TIMEOUT}'
          parameters:
            - name: database_id
              value: '{$GCP.PROJECT.ID}:{HOST.NAME}'
            - name: project_id
              value: '{$GCP.PROJECT.ID}'
            - name: proxy
              value: '{$GCP.PROXY}'
            - name: time_window
              value: '{$GCP.TIME.WINDOW}'
            - name: token
              value: '{$GCP.AUTH.TOKEN}'
          tags:
            - tag: component
              value: raw
        - uuid: e43272210c45425d871d70a5bb91cdd1
          name: 'Network lag'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.repl.network_lag
          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: 'Replay location lag'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.repl.replay_location
          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: 'Replication lag'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.repl.replica_lag
          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: 'Sent location lag'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.repl.sent_location
          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: 'Replication state'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.repl.state
          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: 'Write location lag'
          type: DEPENDENT
          key: gcp.cloudsql.pgsql.repl.write_location
          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.PROXY}'
          description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.'
        - 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: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL Replica by HTTP'
                        name: 'GCP Cloud SQL PostgreSQL: WAL archiving'
                    - type: STRING
                      name: reference
                      value: AAAAA
                - type: graph
                  x: '36'
                  width: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Cloud SQL PostgreSQL Replica by HTTP'
                        name: 'GCP Cloud SQL PostgreSQL: Lags'
                    - type: STRING
                      name: reference
                      value: AAAAB
      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"
      vendor:
        name: Zabbix
        version: 7.0-0
      groups:
        - name: Templates/Cloud
      items:
        - uuid: 3de05ba490644a62ba4a700ffe439c98
          name: 'Guest visible vCPUs'
          type: DEPENDENT
          key: gcp.gce.cpu.guest_visible_vcpus
          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: 'Reserved vCPUs'
          type: DEPENDENT
          key: gcp.gce.cpu.reserved_cores
          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: 'Scheduler wait time'
          type: DEPENDENT
          key: gcp.gce.cpu.scheduler_wait_time
          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: 'CPU usage time'
          type: DEPENDENT
          key: gcp.gce.cpu.usage_time
          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: 'CPU utilization'
          type: DEPENDENT
          key: gcp.gce.cpu.utilization
          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: 'High CPU utilization'
              event_name: '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: 'Disks get'
          type: SCRIPT
          key: gcp.gce.disks.get
          delay: '{$GCP.TIME.WINDOW}'
          history: '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();
            	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
            		request.setProxy(params.proxy);
            	};
            	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)),
            	j_filter = ' | within ' + params.time_window + " | filter instance_id = '" + params.instance_id + "'" + ' | join',
            	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/timeSeries:query',
            	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:
                - '-1'
          timeout: '{$GCP.DATA.TIMEOUT}'
          parameters:
            - name: instance_id
              value: '{HOST.HOST}'
            - name: project_id
              value: '{$GCP.PROJECT.ID}'
            - name: proxy
              value: '{$GCP.PROXY}'
            - name: time_window
              value: '{$GCP.TIME.WINDOW}'
            - name: token
              value: '{$GCP.AUTH.TOKEN}'
          tags:
            - tag: component
              value: raw
        - uuid: e1cd503d86f7487db023e2fd3cea5385
          name: 'Firewall: Dropped bytes'
          type: DEPENDENT
          key: gcp.gce.firewall.dropped_bytes_count
          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: 'Firewall: Dropped packets'
          type: DEPENDENT
          key: gcp.gce.firewall.dropped_packets_count
          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: 'Instance state'
          type: HTTP_AGENT
          key: gcp.gce.instance.state
          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: '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: '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: '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: '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: 'Instance uptime'
          type: DEPENDENT
          key: gcp.gce.instance.uptime
          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: 'Integrity: Early boot validation status'
          type: DEPENDENT
          key: gcp.gce.integrity.early_boot_validation_status
          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: 'Integrity: Late boot validation status'
          type: DEPENDENT
          key: gcp.gce.integrity.late_boot_validation_status
          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: 'Memory usage percentage'
          type: DEPENDENT
          key: gcp.gce.memory.ram_pused
          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: 'High memory utilization'
              event_name: '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: 'Memory size'
          type: DEPENDENT
          key: gcp.gce.memory.ram_size
          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: 'Memory used'
          type: DEPENDENT
          key: gcp.gce.memory.ram_used
          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: 'VM swap in'
          type: DEPENDENT
          key: gcp.gce.memory.swap_in_bytes_count
          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: 'VM swap out'
          type: DEPENDENT
          key: gcp.gce.memory.swap_out_bytes_count
          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: 'Metrics get'
          type: SCRIPT
          key: gcp.gce.metrics.get
          delay: '{$GCP.TIME.WINDOW}'
          history: '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();
            	if (typeof params.proxy !== 'undefined' && params.proxy !== '') {
            		request.setProxy(params.proxy);
            	};
            	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 filter = ' | within ' + params.time_window + " | filter instance_id = '" + params.instance_id + "'",
            	j_filter = filter + ' | join',
            	url = 'https://monitoring.googleapis.com/v3/projects/' + params.project_id + '/timeSeries:query',
            	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:
                - '-1'
          timeout: '{$GCP.DATA.TIMEOUT}'
          parameters:
            - name: instance_id
              value: '{HOST.HOST}'
            - name: integrity
              value: '{$GCE.INTEGRITY.STATE}'
            - name: machine_type
              value: '{$GCE.MACHINE.TYPE}'
            - name: project_id
              value: '{$GCP.PROJECT.ID}'
            - name: proxy
              value: '{$GCP.PROXY}'
            - name: time_window
              value: '{$GCP.TIME.WINDOW}'
            - name: token
              value: '{$GCP.AUTH.TOKEN}'
          tags:
            - tag: component
              value: raw
        - uuid: faf1c3ccbcc24b9eb52be355f2f782e6
          name: 'Network: Received bytes'
          type: DEPENDENT
          key: gcp.gce.network.lb.received_bytes_count.false
          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: 'Network: Received bytes: Load-balanced'
          type: DEPENDENT
          key: gcp.gce.network.lb.received_bytes_count.true
          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: 'Network: Received packets'
          type: DEPENDENT
          key: gcp.gce.network.lb.received_packets_count.false
          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: 'Network: Received packets: Load-balanced'
          type: DEPENDENT
          key: gcp.gce.network.lb.received_packets_count.true
          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: 'Network: Sent bytes'
          type: DEPENDENT
          key: gcp.gce.network.lb.sent_bytes_count.false
          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: 'Network: Sent bytes: Load-balanced'
          type: DEPENDENT
          key: gcp.gce.network.lb.sent_bytes_count.true
          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: 'Network: Sent packets'
          type: DEPENDENT
          key: gcp.gce.network.lb.sent_packets_count.false
          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: 'Network: Sent packets: Load-balanced'
          type: DEPENDENT
          key: gcp.gce.network.lb.sent_packets_count.true
          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: 'Network: Mirrored bytes'
          type: DEPENDENT
          key: gcp.gce.network.mirrored_bytes_count
          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: 'Network: Mirrored packets'
          type: DEPENDENT
          key: gcp.gce.network.mirrored_packets_count
          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: 'Network: Mirrored packets dropped: Invalid'
          type: DEPENDENT
          key: gcp.gce.network.mirr_dropped_packets.invalid
          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: 'Network: Mirrored packets dropped: Out of quota'
          type: DEPENDENT
          key: gcp.gce.network.mirr_dropped_packets.out_of_quota
          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: 'Network: Mirrored packets dropped: Unknown'
          type: DEPENDENT
          key: gcp.gce.network.mirr_dropped_packets.unknown
          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
          filter:
            evaltype: AND
            conditions:
              - macro: '{#GCE.DISK.DEV_TYPE}'
                value: '{$GCE.DISK.DEV_TYPE.MATCHES}'
              - macro: '{#GCE.DISK.DEV_TYPE}'
                value: '{$GCE.DISK.DEV_TYPE.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
              - macro: '{#GCE.DISK.NAME}'
                value: '{$GCE.DISK.NAME.MATCHES}'
              - macro: '{#GCE.DISK.NAME}'
                value: '{$GCE.DISK.NAME.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
              - macro: '{#GCE.DISK.STOR_TYPE}'
                value: '{$GCE.DISK.STOR_TYPE.MATCHES}'
              - macro: '{#GCE.DISK.STOR_TYPE}'
                value: '{$GCE.DISK.STOR_TYPE.NOT_MATCHES}'
                operator: NOT_MATCHES_REGEX
          description: 'GCP Compute Engine: Physical disks discovery.'
          item_prototypes:
            - uuid: dda10a0535c04fdb92092efeff020b2c
              name: 'Disk [{#GCE.DISK.NAME}]: Read bytes'
              type: DEPENDENT
              key: 'gcp.gce.disk.read_bytes_count[{#GCE.DISK.NAME}]'
              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: 'Disk [{#GCE.DISK.NAME}]: Read operations'
              type: DEPENDENT
              key: 'gcp.gce.disk.read_ops_count[{#GCE.DISK.NAME}]'
              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: 'Disk [{#GCE.DISK.NAME}]: Write bytes'
              type: DEPENDENT
              key: 'gcp.gce.disk.write_bytes_count[{#GCE.DISK.NAME}]'
              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: 'Disk [{#GCE.DISK.NAME}]: Write operations'
              type: DEPENDENT
              key: 'gcp.gce.disk.write_ops_count[{#GCE.DISK.NAME}]'
              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: 'Disk [{#GCE.DISK.NAME}]: Raw data'
              type: DEPENDENT
              key: 'gcp.gce.quota.single.raw[{#GCE.DISK.NAME}]'
              history: '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.DEV_TYPE}'
              path: $.device_type
            - lld_macro: '{#GCE.DISK.NAME}'
              path: $.disk_name
            - 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.PROXY}'
          description: 'Sets HTTP proxy value. If this macro is empty then no proxy is used.'
        - 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: '36'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Compute Engine Instance by HTTP'
                        name: 'GCP Compute Engine: CPU usage'
                    - type: STRING
                      name: reference
                      value: AAAAA
                - type: graph
                  'y': '5'
                  width: '24'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Compute Engine Instance by HTTP'
                        name: 'GCP Compute Engine: Memory usage'
                    - type: STRING
                      name: reference
                      value: AAAAC
                - type: graphprototype
                  'y': '10'
                  width: '36'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: columns
                      value: '1'
                    - type: GRAPH_PROTOTYPE
                      name: graphid.0
                      value:
                        host: 'GCP Compute Engine Instance by HTTP'
                        name: 'GCP Compute Engine: Disk [{#GCE.DISK.NAME}]: Read/Write bytes'
                    - type: STRING
                      name: reference
                      value: AAAAF
                - type: graph
                  'y': '15'
                  width: '72'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Compute Engine Instance by HTTP'
                        name: 'GCP Compute Engine: Network traffic'
                    - type: STRING
                      name: reference
                      value: AAAAH
                - type: graph
                  x: '24'
                  'y': '5'
                  width: '24'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Compute Engine Instance by HTTP'
                        key: gcp.gce.memory.ram_pused
                    - type: STRING
                      name: reference
                      value: AAAAD
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graph
                  x: '36'
                  width: '36'
                  height: '5'
                  fields:
                    - type: ITEM
                      name: itemid.0
                      value:
                        host: 'GCP Compute Engine Instance by HTTP'
                        key: gcp.gce.cpu.utilization
                    - type: STRING
                      name: reference
                      value: AAAAB
                    - type: INTEGER
                      name: source_type
                      value: '1'
                - type: graphprototype
                  x: '36'
                  'y': '10'
                  width: '36'
                  height: '5'
                  fields:
                    - type: INTEGER
                      name: columns
                      value: '1'
                    - type: GRAPH_PROTOTYPE
                      name: graphid.0
                      value:
                        host: 'GCP Compute Engine Instance by HTTP'
                        name: 'GCP Compute Engine: Disk [{#GCE.DISK.NAME}]: Read/Write operations'
                    - type: STRING
                      name: reference
                      value: AAAAG
                - type: graph
                  x: '48'
                  'y': '5'
                  width: '24'
                  height: '5'
                  fields:
                    - type: GRAPH
                      name: graphid.0
                      value:
                        host: 'GCP Compute Engine Instance by HTTP'
                        name: 'GCP Compute Engine: Memory swapping'
                    - type: STRING
                      name: reference
                      value: AAAAE
      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
