You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

750 lines
29 KiB

1 year ago
zabbix_export:
version: '7.0'
template_groups:
- uuid: a571c0d144b14fd4a87a9d9b2aa9fcd6
name: Templates/Applications
templates:
- uuid: 8098b3c157ab456abd55d3840eef79c1
template: 'OpenWeatherMap by HTTP'
name: 'OpenWeatherMap by HTTP'
description: |
Get weather metrics from OpenWeatherMap current weather API by HTTP.
It works without any external scripts and uses the Script item.
Setup:
1. Create a host.
2. Link the template to the host.
3. Customize the values of {$OPENWEATHERMAP.API.TOKEN} and {$LOCATION} macros.
OpenWeatherMap API Tokens are available in your OpenWeatherMap account https://home.openweathermap.org/api_keys.
Locations can be set by few ways:
- by geo coordinates (for example: 56.95,24.0833)
- by location name (for example: Riga)
- by location ID. Link to the list of city ID: http://bulk.openweathermap.org/sample/city.list.json.gz
- by zip/post code with a country code (for example: 94040,us)
A few locations can be added to the macro at the same time by "|" delimiter.
For example: 43.81821,7.76115|Riga|2643743|94040,us.
Please note that API requests by city name, zip-codes and city id will be deprecated soon.
Language and units macros can be customized too if necessary.
List of available languages: https://openweathermap.org/current#multi.
Available units of measurement are: standard, metric and imperial https://openweathermap.org/current#data.
You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback
Generated by official Zabbix template tool "Templator" 2.0.0
vendor:
name: Zabbix
version: 7.0-0
groups:
- name: Templates/Applications
items:
- uuid: 7db240f752294b2eb86537d6c06cac5e
name: 'Openweathermap: Get data'
type: SCRIPT
key: openweathermap.get.data
delay: 10m
history: '0'
trends: '0'
value_type: TEXT
params: |
var params = JSON.parse(value),
request = new HttpRequest(),
data = [],
error_msg = [],
measurement,
temp_unit,
wind_unit,
errors_only = [],
error_locations = [],
unique_errors,
new_error_msg;
function getHttpData(query) {
url = params.api_endpoint + query + '&appid=' + params.apikey + '&units=' + params.units + '&lang=' + params.lang;
response = request.get(url);
Zabbix.log(4, '[ Openweathermap ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response);
if (response !== null) {
try {
response = JSON.parse(response);
}
catch (error) {
throw 'Failed to parse response.';
}
}
if (request.getStatus() !== 200) {
if (response.error && response.error.message) {
throw response.error.message;
}
else {
throw 'Failed to receive data. Invalid response status code: ' + request.getStatus();
}
}
return response;
}
switch (params.units) {
case 'metric':
measurement = 'metric';
temp_unit = 'C';
wind_unit = 'meter/sec';
break;
case 'imperial':
measurement = 'imperial';
temp_unit = 'F';
wind_unit = 'miles/hour';
break;
default:
measurement = 'standard';
temp_unit = 'K';
wind_unit = 'meter/sec';
}
locations = params.location.split('|');
for (var i in locations) {
try {
if (/^[0-9]+$/g.test(locations[i])) {
result = getHttpData('id=' + locations[i]);
}
else if (/^.*,[\w]+$/g.test(locations[i])) {
result = getHttpData('zip=' + locations[i]);
}
else if (/^(\-)?[0-9]{1,2}(\.[0-9]+)?,(\-)?[0-9]{1,2}(\.[0-9]+)?/g.test(locations[i])) {
coordinates = locations[i].split(',');
result = getHttpData('lat=' + coordinates[0] + '&lon=' + coordinates[1]);
}
else {
result = getHttpData('q=' + encodeURIComponent(locations[i]));
}
if (!data.filter(function (location) { return location.id === result.id; }).length) {
result.measurement = measurement;
result.temp_unit = temp_unit;
result.wind_unit = wind_unit;
data.push(result);
}
} catch (error) {
errors = {};
errors.location = locations[i];
errors.error = error.toString();
error_msg.push(errors);
errors_only.push(error.toString());
}
}
if (error_msg.length === 0) {
return JSON.stringify({
'data': data,
'errors': error_msg.toString()
});
} else {
unique_errors = errors_only.filter(function (value, index, self) {
return self.indexOf(value) == index;
});
if (unique_errors.length === 1) {
for (var j in error_msg) {
error_locations.push(error_msg[j].location);
}
new_error_msg = 'Failed to retrieve data for the following locations: ' + error_locations + '. ' + unique_errors[0];
return JSON.stringify({
'data': data,
'errors': new_error_msg
});
} else {
return JSON.stringify({
'data': data,
'errors': error_msg
});
}
}
description: 'JSON array with result of OpenWeatherMap API requests.'
timeout: '{$OPENWEATHERMAP.DATA.TIMEOUT}'
parameters:
- name: apikey
value: '{$OPENWEATHERMAP.API.TOKEN}'
- name: api_endpoint
value: '{$OPENWEATHERMAP.API.ENDPOINT}'
- name: lang
value: '{$LANG}'
- name: location
value: '{$LOCATION}'
- name: units
value: '{$UNITS}'
tags:
- tag: component
value: raw
- uuid: 2eb0520627084f2596743f53552c3744
name: 'Openweathermap: Get data collection errors'
type: DEPENDENT
key: openweathermap.get.errors
delay: '0'
history: 7d
trends: '0'
value_type: TEXT
description: 'Errors from get data requests by script item.'
preprocessing:
- type: JSONPATH
parameters:
- $.errors
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
master_item:
key: openweathermap.get.data
tags:
- tag: component
value: application
- tag: component
value: errors
triggers:
- uuid: 8c2c6f81e1e74f97a28538e714eee474
expression: 'length(last(/OpenWeatherMap by HTTP/openweathermap.get.errors))>0'
name: 'Openweathermap: There are errors in requests to OpenWeatherMap API'
opdata: '{ITEM.LASTVALUE1}'
priority: AVERAGE
description: 'Zabbix has received errors in requests to OpenWeatherMap API.'
manual_close: 'YES'
tags:
- tag: scope
value: availability
discovery_rules:
- uuid: 8d3f96f4a23c43a2a28b75f078cc1ff2
name: 'Locations discovery'
type: DEPENDENT
key: openweathermap.locations.discovery
delay: '0'
lifetime: 0d
description: 'Weather metrics discovery by location.'
item_prototypes:
- uuid: 8d19b2e691a440dcb014a6518b7bb0d6
name: '[{#LOCATION}, {#COUNTRY}]: Cloudiness'
type: DEPENDENT
key: 'openweathermap.clouds[{#ID}]'
delay: '0'
history: 7d
units: '%'
description: 'Cloudiness in %.'
preprocessing:
- type: JSONPATH
parameters:
- $.clouds.all
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
master_item:
key: 'openweathermap.location.data[{#ID}]'
tags:
- tag: component
value: environment
- tag: country
value: '{#COUNTRY}'
- tag: location
value: '{#LOCATION}'
- uuid: 02463505cab64ae0bbc4554531372818
name: '[{#LOCATION}, {#COUNTRY}]: Short weather status'
type: DEPENDENT
key: 'openweathermap.description[{#ID}]'
delay: '0'
history: 7d
trends: '0'
value_type: CHAR
description: 'Short weather status description.'
preprocessing:
- type: JSONPATH
parameters:
- $.weather..description.first()
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
master_item:
key: 'openweathermap.location.data[{#ID}]'
tags:
- tag: component
value: environment
- tag: country
value: '{#COUNTRY}'
- tag: location
value: '{#LOCATION}'
- uuid: 5f8fa36c0be5475bad5c5c9074afa7e4
name: '[{#LOCATION}, {#COUNTRY}]: Humidity'
type: DEPENDENT
key: 'openweathermap.humidity[{#ID}]'
delay: '0'
history: 7d
units: '%'
description: 'Humidity in %.'
preprocessing:
- type: JSONPATH
parameters:
- $.main.humidity
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
master_item:
key: 'openweathermap.location.data[{#ID}]'
tags:
- tag: component
value: environment
- tag: country
value: '{#COUNTRY}'
- tag: location
value: '{#LOCATION}'
- uuid: 51f79e4be0734ad5b548617eb535fae4
name: '[{#LOCATION}, {#COUNTRY}]: Data'
type: DEPENDENT
key: 'openweathermap.location.data[{#ID}]'
delay: '0'
history: '0'
trends: '0'
value_type: TEXT
description: 'JSON with result of OpenWeatherMap API request by location.'
preprocessing:
- type: JSONPATH
parameters:
- '$.data.[?(@.id==''{#ID}'')].first()'
master_item:
key: openweathermap.get.data
tags:
- tag: component
value: raw
- tag: country
value: '{#COUNTRY}'
- tag: location
value: '{#LOCATION}'
- uuid: a9ef27e9702c4f41bfbb95579ff2014e
name: '[{#LOCATION}, {#COUNTRY}]: Atmospheric pressure'
type: DEPENDENT
key: 'openweathermap.pressure[{#ID}]'
delay: '0'
history: 7d
units: Pa
description: 'Atmospheric pressure in Pa.'
preprocessing:
- type: JSONPATH
parameters:
- $.main.pressure
- type: MULTIPLIER
parameters:
- '100'
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
master_item:
key: 'openweathermap.location.data[{#ID}]'
tags:
- tag: component
value: environment
- tag: country
value: '{#COUNTRY}'
- tag: location
value: '{#LOCATION}'
- uuid: 6a0f10ae39a347319026ff147f1dc470
name: '[{#LOCATION}, {#COUNTRY}]: Rain volume for the last one hour'
type: DEPENDENT
key: 'openweathermap.rain[{#ID}]'
delay: '0'
history: 7d
value_type: FLOAT
units: m
description: 'Rain volume for the lat one hour in m.'
preprocessing:
- type: JSONPATH
parameters:
- $.rain.1h
error_handler: CUSTOM_VALUE
error_handler_params: '0'
- type: MULTIPLIER
parameters:
- '0.001'
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
master_item:
key: 'openweathermap.location.data[{#ID}]'
tags:
- tag: component
value: environment
- tag: country
value: '{#COUNTRY}'
- tag: location
value: '{#LOCATION}'
- uuid: 8310f65dceeb4b348f1a769b806d5239
name: '[{#LOCATION}, {#COUNTRY}]: Snow volume for the last one hour'
type: DEPENDENT
key: 'openweathermap.snow[{#ID}]'
delay: '0'
history: 7d
value_type: FLOAT
units: m
description: 'Snow volume for the lat one hour in m.'
preprocessing:
- type: JSONPATH
parameters:
- $.snow.1h
error_handler: CUSTOM_VALUE
error_handler_params: '0'
- type: MULTIPLIER
parameters:
- '0.001'
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
master_item:
key: 'openweathermap.location.data[{#ID}]'
tags:
- tag: component
value: environment
- tag: country
value: '{#COUNTRY}'
- tag: location
value: '{#LOCATION}'
- uuid: d30b8a4a56344ddd830d0bd633507b78
name: '[{#LOCATION}, {#COUNTRY}]: Temperature'
type: DEPENDENT
key: 'openweathermap.temp[{#ID}]'
delay: '0'
history: 7d
value_type: FLOAT
units: '{#TEMP.UNIT}'
description: 'Atmospheric temperature value.'
preprocessing:
- type: JSONPATH
parameters:
- $.main.temp
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
master_item:
key: 'openweathermap.location.data[{#ID}]'
tags:
- tag: component
value: environment
- tag: country
value: '{#COUNTRY}'
- tag: location
value: '{#LOCATION}'
trigger_prototypes:
- uuid: 3b7e55f13c6a4ba2930709d5c51c8a09
expression: 'min(/OpenWeatherMap by HTTP/openweathermap.temp[{#ID}],#3)>{$TEMP.CRIT.HIGH}'
name: '[{#LOCATION}, {#COUNTRY}]: Temperature is too high'
event_name: '[{#LOCATION}, {#COUNTRY}]: Temperature is too high (over {$TEMP.CRIT.HIGH} for 30m)'
opdata: 'Current temp: {ITEM.LASTVALUE1}'
priority: AVERAGE
description: 'Temperature value is too high.'
manual_close: 'YES'
tags:
- tag: scope
value: notice
- uuid: 7c98d2784a2e42faa76e67348a0df7ff
expression: 'max(/OpenWeatherMap by HTTP/openweathermap.temp[{#ID}],#3)<{$TEMP.CRIT.LOW}'
name: '[{#LOCATION}, {#COUNTRY}]: Temperature is too low'
event_name: '[{#LOCATION}, {#COUNTRY}]: Temperature is too low (below {$TEMP.CRIT.LOW} for 30m)'
opdata: 'Current temp: {ITEM.LASTVALUE1}'
priority: AVERAGE
description: 'Temperature value is too low.'
manual_close: 'YES'
tags:
- tag: scope
value: notice
- uuid: 23d4152f794d46f6af705749b9443100
name: '[{#LOCATION}, {#COUNTRY}]: Visibility'
type: DEPENDENT
key: 'openweathermap.visibility[{#ID}]'
delay: '0'
history: 7d
units: m
description: 'Visibility in m.'
preprocessing:
- type: JSONPATH
parameters:
- $.visibility
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
master_item:
key: 'openweathermap.location.data[{#ID}]'
tags:
- tag: component
value: environment
- tag: country
value: '{#COUNTRY}'
- tag: location
value: '{#LOCATION}'
- uuid: f3350dcbd4f247e7878c06b8695beddd
name: '[{#LOCATION}, {#COUNTRY}]: Wind direction'
type: DEPENDENT
key: 'openweathermap.wind.direction[{#ID}]'
delay: '0'
history: 7d
value_type: FLOAT
units: deg
description: 'Wind direction in degrees.'
valuemap:
name: 'Wind direction'
preprocessing:
- type: JSONPATH
parameters:
- $.wind.deg
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
master_item:
key: 'openweathermap.location.data[{#ID}]'
tags:
- tag: component
value: environment
- tag: country
value: '{#COUNTRY}'
- tag: location
value: '{#LOCATION}'
- uuid: 67decabd27774e9fb6d9212621c43a54
name: '[{#LOCATION}, {#COUNTRY}]: Wind speed'
type: DEPENDENT
key: 'openweathermap.wind.speed[{#ID}]'
delay: '0'
history: 7d
value_type: FLOAT
units: '{#WIND.UNIT}'
description: 'Wind speed value.'
preprocessing:
- type: JSONPATH
parameters:
- $.wind.speed
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
master_item:
key: 'openweathermap.location.data[{#ID}]'
tags:
- tag: component
value: environment
- tag: country
value: '{#COUNTRY}'
- tag: location
value: '{#LOCATION}'
graph_prototypes:
- uuid: 62ba0562f77d46e0b04a387d82c1a51e
name: '[{#LOCATION}, {#COUNTRY}]: Atmospheric pressure'
graph_items:
- color: 199C0D
item:
host: 'OpenWeatherMap by HTTP'
key: 'openweathermap.pressure[{#ID}]'
- uuid: 6196267a6d974ef2acbebdb9b33f6b71
name: '[{#LOCATION}, {#COUNTRY}]: Rain volume'
graph_items:
- color: 199C0D
item:
host: 'OpenWeatherMap by HTTP'
key: 'openweathermap.rain[{#ID}]'
- uuid: 27b47b89606e43f5a4180e9dde29d7d6
name: '[{#LOCATION}, {#COUNTRY}]: Snow volume'
graph_items:
- color: 199C0D
item:
host: 'OpenWeatherMap by HTTP'
key: 'openweathermap.snow[{#ID}]'
- uuid: 3561e247237548f3a26c702924d05894
name: '[{#LOCATION}, {#COUNTRY}]: Temperature'
graph_items:
- color: 199C0D
item:
host: 'OpenWeatherMap by HTTP'
key: 'openweathermap.temp[{#ID}]'
master_item:
key: openweathermap.get.data
lld_macro_paths:
- lld_macro: '{#COUNTRY}'
path: $.sys.country
- lld_macro: '{#ID}'
path: $.id
- lld_macro: '{#LOCATION}'
path: $.name
- lld_macro: '{#TEMP.UNIT}'
path: $.temp_unit
- lld_macro: '{#WIND.UNIT}'
path: $.wind_unit
preprocessing:
- type: JSONPATH
parameters:
- $.data
- type: NOT_MATCHES_REGEX
parameters:
- '\[\]'
error_handler: CUSTOM_ERROR
error_handler_params: 'Failed to receive data about required locations from API'
- type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
tags:
- tag: class
value: service
- tag: target
value: openweathermap
macros:
- macro: '{$LANG}'
value: en
description: 'List of available languages https://openweathermap.org/current#multi.'
- macro: '{$LOCATION}'
value: Riga
description: |
Locations can be set by few ways:
1. by geo coordinates (for example: 56.95,24.0833)
2. by location name (for example: Riga)
3. by location ID. Link to the list of city ID: http://bulk.openweathermap.org/sample/city.list.json.gz
4. by zip/post code with a country code (for example: 94040,us)
A few locations can be added to the macro at the same time by `|` delimiter.
For example: `43.81821,7.76115|Riga|2643743|94040,us`.
Please note that API requests by city name, zip-codes and city id will be deprecated soon.
- macro: '{$OPENWEATHERMAP.API.ENDPOINT}'
value: 'api.openweathermap.org/data/2.5/weather?'
description: 'OpenWeatherMap API endpoint.'
- macro: '{$OPENWEATHERMAP.API.TOKEN}'
type: SECRET_TEXT
description: 'Specify openweathermap API key.'
- macro: '{$OPENWEATHERMAP.DATA.TIMEOUT}'
value: 3s
description: 'Response timeout for OpenWeatherMap API.'
- macro: '{$TEMP.CRIT.HIGH}'
value: '30'
description: 'Threshold for high temperature trigger.'
- macro: '{$TEMP.CRIT.LOW}'
value: '-20'
description: 'Threshold for low temperature trigger.'
- macro: '{$UNITS}'
value: metric
description: 'Available units of measurement are standard, metric and imperial https://openweathermap.org/current#data.'
dashboards:
- uuid: 23d93d156d4d459db69000f3cdd3d788
name: 'Openweathermap: General'
pages:
- name: 'Openweathermap: General'
widgets:
- type: graphprototype
name: Atmospheric.pressure
width: '12'
height: '5'
fields:
- type: INTEGER
name: columns
value: '1'
- type: INTEGER
name: rows
value: '1'
- type: GRAPH_PROTOTYPE
name: graphid
value:
host: 'OpenWeatherMap by HTTP'
name: '[{#LOCATION}, {#COUNTRY}]: Atmospheric pressure'
- type: graphprototype
name: 'Rain volume'
x: '12'
width: '12'
height: '5'
fields:
- type: INTEGER
name: columns
value: '1'
- type: INTEGER
name: rows
value: '1'
- type: GRAPH_PROTOTYPE
name: graphid
value:
host: 'OpenWeatherMap by HTTP'
name: '[{#LOCATION}, {#COUNTRY}]: Rain volume'
- type: graphprototype
name: 'Snow volume'
'y': '5'
width: '12'
height: '5'
fields:
- type: INTEGER
name: columns
value: '1'
- type: INTEGER
name: rows
value: '1'
- type: GRAPH_PROTOTYPE
name: graphid
value:
host: 'OpenWeatherMap by HTTP'
name: '[{#LOCATION}, {#COUNTRY}]: Snow volume'
- type: graphprototype
name: Temperature
x: '12'
'y': '5'
width: '12'
height: '5'
fields:
- type: INTEGER
name: columns
value: '1'
- type: INTEGER
name: rows
value: '1'
- type: GRAPH_PROTOTYPE
name: graphid
value:
host: 'OpenWeatherMap by HTTP'
name: '[{#LOCATION}, {#COUNTRY}]: Temperature'
valuemaps:
- uuid: 9a8fdac997914722acfea90f1f9d45e9
name: 'Wind direction'
mappings:
- type: IN_RANGE
value: '0 - 11.24'
newvalue: 'N'
- type: IN_RANGE
value: '11.25 - 33.74'
newvalue: NNE
- type: IN_RANGE
value: '33.75 - 56.24'
newvalue: NE
- type: IN_RANGE
value: '56.25 - 78.74'
newvalue: ENE
- type: IN_RANGE
value: '78.75 - 101.24'
newvalue: E
- type: IN_RANGE
value: '101.25 - 123.74'
newvalue: ESE
- type: IN_RANGE
value: '123.75 - 146.24'
newvalue: SE
- type: IN_RANGE
value: '146.25 - 168.74'
newvalue: SSE
- type: IN_RANGE
value: '168.75 - 191.24'
newvalue: S
- type: IN_RANGE
value: '191.25 - 213.74'
newvalue: SSW
- type: IN_RANGE
value: '213.75 - 236.24'
newvalue: SW
- type: IN_RANGE
value: '236.25 - 258.74'
newvalue: WSW
- type: IN_RANGE
value: '258.75 - 281.24'
newvalue: W
- type: IN_RANGE
value: '281.25 - 303.74'
newvalue: WNW
- type: IN_RANGE
value: '303.75 - 326.24'
newvalue: NW
- type: IN_RANGE
value: '326.25 - 348.74'
newvalue: NNW
- type: IN_RANGE
value: '348.75 - 379.99'
newvalue: 'N'