cookbook 'zabbix_lwrp', '= 1.2.1'
zabbix_lwrp
(26) Versions
1.2.1
-
Follow8
Installs and configures Zabbix agent and server with PostgreSQL and Nginx. Provides LWRP for creating and modifying Zabbix objects.
cookbook 'zabbix_lwrp', '= 1.2.1', :supermarket
knife supermarket install zabbix_lwrp
knife supermarket download zabbix_lwrp
Description
Installs and configures Zabbix agent and server with PostgreSQL and Nginx. Provides LWRP for creating and modifying Zabbix objects.
Requirements
Platform:
- ubuntu
- centos
- windows - only for agent
Cookbooks:
- apt
- build-essential
- lvm
- nginx
- postgresql
- database
- php-fpm
- chocolatey
Attributes
Agent
-
node['zabbix']['agent']['include']
- Defaults to/opt/zabbix/etc
. -
node['zabbix']['agent']['scripts']
- Defaults to/opt/zabbix/scripts
. -
node['zabbix']['agent']['templates']
- Defaults to/opt/zabbix/templates
. -
node['zabbix']['agent']['loglevel']
- Defaults to3
. -
node['zabbix']['agent']['remotecmds']
- Defaults to0
. -
node['zabbix']['agent']['timeout']
- Defaults to3
. -
node['zabbix']['agent']['listen_ip']
- Defaults to0.0.0.0
. -
node['zabbix']['agent']['enable_remote_commands']
- Defaults to0
. -
node['zabbix']['agent']['serverhost']
- Defaults tonode['ipaddress']
. -
node['zabbix']['agent']['user_params']
- Defaults to{ ... }
.
Windows Agent
-
node['zabbix']['agent']['windows']['installer']
- 'chocolatey' or 'bin'(zabbix binaries). Defaults tochocolatey
. -
node['zabbix']['agent']['windows']['version']
- Defaults to3.0.4
. -
node['zabbix']['agent']['windows']['chocolatey']['repo']
- Defaults tohttps://chocolatey.org/api/v2
. -
node['zabbix']['agent']['windows']['path']
- Defaults toC:\ProgramData\zabbix
. -
node['zabbix']['agent']['windows']['include']
- Defaults toC:\ProgramData\zabbix\etc
. -
node['zabbix']['agent']['windows']['scripts']
- Defaults toC:\ProgramData\zabbix\scripts
. -
node['zabbix']['agent']['windows']['templates']
- Defaults toC:\ProgramData\zabbix\templates
. -
node['zabbix']['agent']['windows']['log']
- Defaults toC:\ProgramData\zabbix\zabbix_agentd.log
.
Database
-
node['zabbix']['server']['database']['filesystem']
- Defaults toext4
. -
node['zabbix']['server']['database']['lvm_group']
- Defaults toshared
. -
node['zabbix']['server']['database']['lvm_volume']
- Defaults to/dev/sda3
. -
node['zabbix']['server']['database']['partition_size']
- Defaults to10G
. -
node['zabbix']['server']['database']['cluster']
- Defaults tomain
. -
node['zabbix']['server']['database']['databag']
- Defaults tozabbix
. -
node['zabbix']['server']['database']['locale']
- Defaults toen_US.utf8
. -
node['zabbix']['server']['database']['mount_point']
- Defaults to/var/lib/postgresql
. -
node['zabbix']['server']['database']['network']
- Defaults to127.0.0.0/8
. -
node['zabbix']['server']['database']['version']
- Defaults to9.4
. -
node['zabbix']['server']['database']['configuration']['listen_addresses']
- Defaults to127.0.0.1
. -
node['zabbix']['server']['database']['configuration']['port']
- Defaults to5432
. -
node['zabbix']['server']['database']['configuration']['max_connections']
- Defaults to300
. -
node['zabbix']['server']['database']['configuration']['shared_buffers']
- Defaults to128MB
. -
node['zabbix']['server']['database']['configuration']['maintenance_work_mem']
- Defaults to128MB
. -
node['zabbix']['server']['database']['configuration']['work_mem']
- Defaults to8MB
. -
node['zabbix']['server']['database']['configuration']['effective_cache_size']
- Defaults to2GB
. -
node['zabbix']['server']['database']['configuration']['log_min_duration_statement']
- Defaults to1000
. -
node['zabbix']['server']['database']['configuration']['archive_mode']
- Defaults toon
. -
node['zabbix']['server']['database']['configuration']['archive_command']
- Defaults toexit 0
. -
node['zabbix']['server']['database']['configuration']['wal_level']
- Defaults tohot_standby
Default
-
node['zabbix']['version']
- Defaults to2.4
. -
node['zabbix']['api-version']
- Defaults to2.4.7
.
Server
-
node['zabbix']['server']['service']
- Defaults tozabbix-server
. -
node['zabbix']['server']['credentials']['databag']
- Defaults tozabbix
. -
node['zabbix']['server']['config']['listenip']
- Defaults to0.0.0.0
. -
node['zabbix']['server']['config']['debuglevel']
- Defaults to3
. -
node['zabbix']['server']['config']['workers']
- Defaults to{ ... }
. -
node['zabbix']['server']['config']['hk']
- Defaults to{ ... }
. -
node['zabbix']['server']['config']['cache']
- Defaults to{ ... }
. -
node['zabbix']['server']['config']['timeouts']
- Defaults to{ ... }
. -
node['zabbix']['server']['config']['global']
- Defaults to{ ... }
. -
node['zabbix']['server']['config']['alerts']
- Defaults to{ ... }
. -
node['zabbix']['server']['web']['server_name']
- Defaults tolocalhost
. -
node['zabbix']['server']['web']['listen']
- Defaults to127.0.0.1
. -
node['zabbix']['server']['web']['port']
- Defaults to9200
. -
node['zabbix']['server']['web']['max_requests']
- Defaults to500
. -
node['zabbix']['server']['web']['max_children']
- Defaults to5
. -
node['zabbix']['server']['web']['min_spare_servers']
- Defaults to1
. -
node['zabbix']['server']['web']['start_servers']
- Defaults to2
. -
node['zabbix']['server']['web']['max_spare_servers']
- Defaults to3
. -
node['zabbix']['server']['web']['process_manager']
- Defaults todynamic
. -
node['zabbix']['server']['web']['configuration']['php_admin_value[date.timezone]']
- Defaults toUTC
. -
node['zabbix']['server']['web']['configuration']['php_admin_flag[display_errors]']
- Defaults tofalse
. -
node['zabbix']['server']['web']['configuration']['php_admin_value[error_reporting]']
- Defaults toE_ALL & ~E_DEPRECATED
. -
node['zabbix']['server']['web']['configuration']['php_admin_value[error_log]']
- Defaults to/var/log/zabbix-php-error.log
. -
node['zabbix']['server']['web']['configuration']['php_admin_value[max_execution_time]']
- Defaults to600
. -
node['zabbix']['server']['web']['configuration']['php_admin_value[max_input_time]']
- Defaults to300
. -
node['zabbix']['server']['web']['configuration']['php_admin_value[memory_limit]']
- Defaults to128M
. -
node['zabbix']['server']['web']['configuration']['php_admin_value[post_max_size]']
- Defaults to32M
. -
node['zabbix']['server']['web']['configuration']['php_admin_flag[register_globals]']
- Defaults totrue
.
Recipes
- zabbix_lwrp::agent - Installs and configures Zabbix agent.
- zabbix_lwrp::agent_win - Installs and configures Zabbix agent for Windows.
- zabbix_lwrp::connect - Connects to Zabbix API to sync configuration.
- zabbix_lwrp::default - Installs and configures Zabbix official repository and agent.
- zabbix_lwrp::database - Installs and configures Zabbix database.
- zabbix_lwrp::host - Creates host via Zabbix API.
- zabbix_lwrp::partition - Configures LVM for Zabbix database.
- zabbix_lwrp::repository - Installs Zabbix official repository.
- zabbix_lwrp::server - Installs and configures Zabbix server.
- zabbix_lwrp::web - Installs and configures Zabbix frontend.
Resources
- zabbix_action
- zabbix_application
- zabbix_connect
- zabbix_database
- zabbix_graph
- zabbix_host
- zabbix_media_type
- zabbix_screen
- zabbix_template
- zabbix_user_group
- zabbix_user_macro
zabbix_action
Actions
- sync: Default action.
Attribute Parameters
- name:
- event_source:
- escalation_time: Defaults to <code>60</code>.
- enabled: Defaults to <code>true</code>.
- message_subject:
- message_body:
- send_recovery_message: Defaults to <code>false</code>.
- recovery_message_subject:
- recovery_message_body:
zabbix_application
Actions
- sync: Default action.
Attribute Parameters
- name:
zabbix_connect
Actions
- make: Default action.
Attribute Parameters
- name:
- databag:
- apiurl:
- user:
- password:
zabbix_database
Actions
- create: Default action.
Attribute Parameters
- db_name:
- db_user:
- db_pass:
- db_host:
- db_port:
zabbix_graph
Actions
- create: Default action.
Attribute Parameters
- name:
- height:
- width:
- graph_items:
zabbix_host
Actions
- create:
Attribute Parameters
- type: Defaults to <code>1</code>.
- host_name:
- host_group:
- port: Defaults to <code>10050</code>.
- ip_address:
- dns:
- use_ip: Defaults to <code>true</code>.
zabbix_media_type
Actions
- create: Default action.
Attribute Parameters
- name:
- type:
- server:
- helo:
- email:
- path:
- modem:
- username:
- password:
zabbix_screen
Actions
- sync: Default action.
Attribute Parameters
- name:
- hsize:
- vsize:
zabbix_template
Actions
- add:
- import:
Attribute Parameters
- host_name:
- path:
zabbix_user_group
Actions
- create: Default action.
Attribute Parameters
- name:
zabbix_user_macro
Actions
- create: Default action.
Attribute Parameters
- name:
- value:
- host_name:
Data bag
Data bag zabbix
must contains the following items:
* admin (with Zabbix admin password)
* databases
* users
databases
and users
items related to the postgresql database (see postgresql_lwrp cookbook)
For examples see fixture data bag test/fixtures/databags/zabbix/
Resources
This cookbooks provides next resources:
* zabbix_action
* zabbix_application
* zabbix_connect
* zabbix_database
* zabbix_graph
* zabbix_host
* zabbix_media_type
* zabbix_screen
* zabbix_template
* zabbix_user_group
* zabbix_user_macro
zabbix_action
Creates zabbix action with operations, conditions and messages.
Actions
<table>
<tr>
<th>Action</th>
<th>Description</th>
</tr>
<tr>
<td>sync</td>
<td>Default action. Sync action description with one's in zabbix server</td>
</tr>
</table>
Attributes
<table>
<tr>
<th>Attribute</th>
<th>Description</th>
<th>Default</th>
</tr>
<tr>
<td>name</td>
<td><strong>Name attribute</strong>. Name of the action (required)</td>
<td></td>
</tr>
<tr>
<td>event_source</td>
<td>Source of event for action, now only :trigger allowed</td>
<td>:triggers</td>
</tr>
<tr>
<td>escalation_time</td>
<td>Delay between escalation steps</td>
<td>60</td>
</tr>
<tr>
<td>enabled</td>
<td>Is action enabled?</td>
<td>true</td>
</tr>
<tr>
<td>message_subject</td>
<td>Subject of action message</td>
<td></td>
</tr>
<tr>
<td>message_body</td>
<td>Body of action message</td>
<td>true</td>
</tr>
<tr>
<td>send_recovery_message</td>
<td>Send recovery message when conditions of action become false</td>
<td>false</td>
</tr>
<tr>
<td>recovery_message_subject</td>
<td>Subject of recovery message</td>
<td></td>
</tr>
<tr>
<td>recovery_message_body</td>
<td>Body of recovery message</td>
<td></td>
</tr>
<tr>
<td>operation</td>
<td>Add an operation to action, see below. It's possible to add more then one operation</td>
<td></td>
</tr>
<tr>
<td>condition</td>
<td>Add an condition to action, see below. It's possible to add more the one condition</td>
<td></td>
</tr>
</table>
Attributes for operation.
<table>
<tr>
<th>Attribute</th>
<th>Description</th>
<th>Default</th>
</tr>
<tr>
<td>type</td>
<td>Type of operation, can be :message or :command</td>
<td>:message</td>
</tr>
<tr>
<td>escalation_time</td>
<td>Time to escalate to next step</td>
<td></td>
</tr>
<tr>
<td>start</td>
<td>Start step, when this operation take place</td>
<td></td>
</tr>
<tr>
<td>stop</td>
<td>Last step, when this operation take place</td>
<td></td>
</tr>
<tr>
<td>user_groups</td>
<td>Zabbix user group names that'll receive message</td>
<td></td>
</tr>
<tr>
<td>message</td>
<td>Message description, see below</td>
<td>Use default actin message if empty</td>
</tr>
</table>
Attributes for conditions.
<table>
<tr>
<th>Attribute</th>
<th>Description</th>
<th>Default</th>
</tr>
<tr>
<td>type</td>
<td>Type of condition, can be one of :trigger, :trigger_value, :trigger_serverity, :host_group, :maintenance</td>
<td></td>
</tr>
<tr>
<td>operator</td>
<td>Operator for condition, can be one of :equal, :not_equal, :like, :not_like, :in, :gte, :lte, :not_in</td>
<td></td>
</tr>
<tr>
<td>value</td>
<td>Value for condition.</td>
<td></td>
</tr>
</table>
It also possible to use short form of condition, like:
ruby
condition :trigger, :equal, '42th trigger name'
Attributes for message.
<table>
<tr>
<th>Attribute</th>
<th>Description</th>
<th>Default</th>
</tr>
<tr>
<td>use_default_message</td>
<td>Use default message from action</td>
<td></td>
</tr>
<tr>
<td>subject</td>
<td>Message subject</td>
<td></td>
</tr>
<tr>
<td>message</td>
<td>Message body</td>
<td></td>
</tr>
<tr>
<td>media_type</td>
<td>Name of media type to use</td>
<td>By default all media types are used</td>
</tr>
</table>
Examples
zabbix_action 'Test action' do action :sync event_source :triggers operation do user_groups 'Test group' message do use_default_message false subject 'Test {TRIGGER.SEVERITY}: {HOSTNAME1} {TRIGGER.STATUS}: {TRIGGER.NAME}' message "Trigger: {TRIGGER.NAME}\n"\ "Trigger status: {TRIGGER.STATUS}\n" \ "Trigger severity: {TRIGGER.SEVERITY}\n" \ "\n" \ "Item values:\n" \ '{ITEM.NAME1} ({HOSTNAME1}:{TRIGGER.KEY1}): {ITEM.VALUE1}' media_type 'sms' end end condition :trigger_severity, :gte, :high condition :host_group, :equal, 'Main' condition :maintenance, :not_in, :maintenance end
zabbix_application
Creates application, items and triggers. You should think about items and triggers like nested
resources inside zabbix_application resource.
Actions
<table>
<tr>
<th>Action</th>
<th>Description</th>
</tr>
<tr>
<td>sync</td>
<td>Default action. Sync application description with one's in zabbix server</td>
</tr>
</table>
Attributes
<table>
<tr>
<th>Attribute</th>
<th>Description</th>
<th>Default</th>
</tr>
<tr>
<td>name</td>
<td><strong>Name attribute</strong>. Name of the application (required)</td>
<td></td>
</tr>
<tr>
<td>item</td>
<td>Add an item to application, see below. It's possible to add more then one item</td>
<td></td>
</tr>
<tr>
<td>trigger</td>
<td>Add an trigger to application, see below. It's possible to add more the one trigger</td>
<td></td>
</tr>
</table>
Item attributes
Create/update zabbix item
<table>
<tr>
<th>Attribute</th>
<th>Description</th>
<th>Default</th>
</tr>
<tr>
<td>key</td>
<td><strong>Name attribute</strong>. Zabbix key for an item, should be unique.</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>Type of zabbix check, possible values
:zabbix, :trapper, :active, :calculated
</td>
<td></td>
</tr>
<tr>
<td>name</td>
<td>Descriptive name of zabbix check, shown in web-interface
</td>
<td></td>
</tr>
<tr>
<td>frequency</td>
<td>How often zabbix checks this item in seconds</td>
<td>60</td>
</tr>
<tr>
<td>history</td>
<td>How many days store item's history</td>
<td>7 days</td>
</tr>
<tr>
<td>multiplier</td>
<td>Set a multiplier for item</td>
<td>0</td>
</tr>
<tr>
<td>trends</td>
<td>How many days store item's trends (archived history)</td>
<td>365</td>
</tr>
<tr>
<td>units</td>
<td>Set a unit for item</td>
<td></td>
</tr>
<tr>
<td>value_type</td>
<td>Type of gathered value, possible values
:float, :character, :log_line, :unsigned_int, :text
</td>
<td>:unsigned_int</td>
</tr>
</table>
Trigger attributes
<table>
<tr>
<th>Attribute</th>
<th>Description</th>
<th>Default</th>
</tr>
</table>
Examples
zabbix_application "Test application" do action :sync item 'vfs.fs.size[/var/log,free]' do type :active name 'Free disk space on /var/log' frequency 600 value_type :unsigned_int end trigger "Number #{node.fqdn} of free inodes on log < 10%" do expression "{#{node.fqdn}:vfs.fs.size[/var/log,free].last(0)}>0" severity :high end end
zabbix_connect
Examples
zabbix_connect 'default' do action :make apiurl 'http://localhost/api_jsonrpc.php' databag 'zabbix' end
zabbix_database
Examples
zabbix_database db_name do db_user db_user db_pass db_pass db_host db_host db_port db_port action :create end
zabbix_graph
Examples
zabbix_graph 'Test Graph' do action :create width 640 height 480 graph_items [:key => 'vfs.fs.size[/var/log,free]', :color => '111111'] end
zabbix_host
Examples
zabbix_host node['fqdn'] do action :create host_group 'Hosts' use_ip true ip_address node['ipaddress'] end
zabbix_media_type
Examples
zabbix_media_type 'sms' do action :create type :sms modem '/dev/modem' end
zabbix_screen
Examples
zabbix_screen 'Test Screen' do action :sync screen_item 'Test Graph' do resource_type :graph end end
zabbix_template
Actions
<table>
<tr>
<th>Action</th>
<th>Description</th>
</tr>
<tr>
<td>add</td>
<td>Default action. Add a template to node</td>
</tr>
<tr>
<td>import</td>
<td>Import templates from xml file to zabbix server</td>
</tr>
</table>
Attributes
<table>
<tr>
<th>Attribute</th>
<th>Description</th>
<th>Default</th>
</tr>
<tr>
<td>path</td>
<td><strong>Name attribute</strong>. Path to file for :import or name of template for :add action (required)</td>
<td></td>
</tr>
<tr>
<td>host_name</td>
<td>Name of host new template to add</td>
<td>FQDN of current node</td>
</tr>
</table>
Examples
zabbix_template '/opt/zabbix/templates/zbx_templates_linux.xml' do action :import end zabbix_template 'Linux_Template' action :add end
zabbix_user_group
Actions
<table>
<tr>
<th>Action</th>
<th>Description</th>
</tr>
<tr>
<td>create</td>
<td>Default action. Create a new zabbix user group</td>
</tr>
</table>
Attributes
<table>
<tr>
<th>Attribute</th>
<th>Description</th>
<th>Default</th>
</tr>
<tr>
<td>name</td>
<td><strong>Name attribute</strong>. Name of new zabbix user group (required)</td>
<td></td>
</tr>
</table>
Examples
zabbix_user_group 'Test group' do action :create end
zabbix_user_macro
Examples
zabbix_user_macro 'Test_macro' do action :create value 'foobar' end
Usage
To install Zabbix agent just include zabbix_lwrp
default recipe into your node's run_list
:
{ "name":"my_node", "run_list": [ "recipe[zabbix_lwrp]" ] }
This recipe should be included before all usage of LWRP, because connection to zabbix server is established here.
To install Zabbix server include the following recipes:
{ "name":"my_node", "run_list": [ "recipe[zabbix_lwrp::default]", "recipe[zabbix_lwrp::database]", "recipe[zabbix_lwrp::server]", "recipe[zabbix_lwrp::web]" ] }
For examples of LWRP see fixture cookbook in tests/fixtures/cookbooks
.
License and Maintainer
Maintainer:: LLC Express 42 (cookbooks@express42.com)
Source:: https://github.com/express42-cookbooks/zabbix_lwrp
Issues:: https://github.com/express42-cookbooks/zabbix_lwrp/issues
License:: MIT
Dependent cookbooks
apt >= 0.0.0 |
build-essential >= 0.0.0 |
chef_nginx >= 0.0.0 |
chocolatey >= 0.0.0 |
database >= 0.0.0 |
lvm >= 0.0.0 |
php-fpm >= 0.0.0 |
postgresql >= 0.0.0 |
windows_firewall >= 0.0.0 |
Contingent cookbooks
There are no cookbooks that are contingent upon this one.
CHANGELOG for zabbix_lwrp
This file is used to list changes made in each version of zabbix_lwrp.
1.2.1
- Add Zabbix 3.0 support
- Add support for CentOS
- Add zabbix agent for Windows
- Add chef11 compability
- Change repo key url
- Use database and postgresql cookbooks
- Use chef_nginx cookbook
1.1.19
- Add start_servers attributes to php-fpm configuration
- Change repo key url
- Fix issues
1.1.18
- (change) official repo key url
1.1.17
- Fix rubocop and foodcritic issues
- Install zabbixapi gem at compile time
1.1.16
- Add compile_time workaround for chef 11
- Add test suite for chef 11
1.1.15
- Fix installation of zabbixapi gem
1.1.14
- Update zabbix api version
1.1.13
- Fix default serverhost for agent
1.1.12
- Do not update hosts on each chef run, because in some cases it leads to error with items linked with interfaces.
1.1.11:
- Fix bug with empty attributes
- Fix rubocop issues
- Add official nginx repo to fixture cookbook
1.1.10:
- Remove official nginx repository setup
1.1.9:
- Remove setup official postgresql repository setup
1.1.8:
- Fix run under Chef 11
1.1.7:
- Update docs
1.1.6:
- Use the latest Chef client
- Fix compatibility with Chef 12.4.0
1.1.5:
- Fix issues
1.1.4:
- Remove chef search from server and web recipes
1.1.3:
- Switch to php-fpm cookbook
- Fix issues
1.1.2:
- Add partition, host and connect recipes
- Add build-essential cookbook
- Fix issues
1.1.1:
- Remove express42 helpers dependencies
1.1.0:
- Change name for all zabbix resources from zabbix_lwrp_* to zabbix_*
1.0.1:
- Fix import triggers from xml template
- Remove postgresql and nginx repos
1.0.0:
- Initial release of zabbix_lwrp cookbook
Check the Markdown Syntax Guide for help with Markdown.
The Github Flavored Markdown page describes the differences between markdown on github and standard markdown.
Collaborator Number Metric
1.2.1 failed this metric
Failure: Cookbook has 0 collaborators. A cookbook must have at least 2 collaborators to pass this metric.
Contributing File Metric
1.2.1 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must contain a CONTRIBUTING.md file
Foodcritic Metric
1.2.1 passed this metric
License Metric
1.2.1 passed this metric
No Binaries Metric
1.2.1 passed this metric
Testing File Metric
1.2.1 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must contain a TESTING.md file
Version Tag Metric
1.2.1 passed this metric
1.2.1 failed this metric
1.2.1 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must contain a CONTRIBUTING.md file
Foodcritic Metric
1.2.1 passed this metric
License Metric
1.2.1 passed this metric
No Binaries Metric
1.2.1 passed this metric
Testing File Metric
1.2.1 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must contain a TESTING.md file
Version Tag Metric
1.2.1 passed this metric
1.2.1 passed this metric
1.2.1 passed this metric
No Binaries Metric
1.2.1 passed this metric
Testing File Metric
1.2.1 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must contain a TESTING.md file
Version Tag Metric
1.2.1 passed this metric
1.2.1 passed this metric
1.2.1 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must contain a TESTING.md file
Version Tag Metric
1.2.1 passed this metric
1.2.1 passed this metric