{"id":47635,"date":"2026-10-23T13:09:17","date_gmt":"2026-10-23T11:09:17","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=47635"},"modified":"2026-10-23T13:15:46","modified_gmt":"2026-10-23T11:15:46","slug":"metric-extension-export-format-enterprise-manager","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/","title":{"rendered":"Anatomy of an Enterprise Manager metric extension"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Recently, I was working on deploying Metric Extensions automatically in Enterprise Manager, but the more I looked into it, the more it turned into a different question: what does a Metric Extension look like ? In a <a href=\"https:\/\/www.dbi-services.com\/blog\/listing-and-querying-oracle-enterprise-manager-metric-extensions\/\" target=\"_blank\" rel=\"noopener noreferrer\">previous blog<\/a>, I presented the <code>SYSMAN<\/code> tables containing the metric extensions definitions. I also showed how to retrieve the targets where a metric extension is deployed. Now, it\u2019s time to look at <strong>formatting metric extensions<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once again, <code>emcli help<\/code> does not show any verb for creating metric extensions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ emcli help | grep -i metric_extension\n    export_metric_extension           -- Export a metric extension to an archive file\n    get_unused_metric_extensions      -- Get a list of unused metric extensions\n    import_metric_extension           -- Import a metric extension archive file\n    publish_metric_extension          -- Publish a metric extension for use by all administrators\n    save_metric_extension_draft       -- Save a deployable draft of a metric extension<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Unfortunately, nothing in the documentation will help us to create a metric extension outside of the web UI. So let\u2019s reverse engineer them. The plan is the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create metric extensions in the web UI<\/li>\n\n\n\n<li>Export the XML files with <code>emcli<\/code><\/li>\n\n\n\n<li>Later, create new metric extensions or update existing metrics more easily, directly with <code>emcli<\/code><\/li>\n<\/ul>\n\n\n\n<h2 id=\"building-a-minimal-metric-extension\" class=\"wp-block-heading\">Building a minimal metric extension<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s build the most basic metric extension first, with <code>Host<\/code> as the target type. I will choose the <code>OS Command - Multiple Columns<\/code> adapter, and just an <code>echo<\/code> command.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"405\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/001_me-genprop-filled.png\" alt=\"\" class=\"wp-image-47636\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/001_me-genprop-filled.png 720w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/001_me-genprop-filled-300x169.png 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">The adapter itself is <code>\/bin\/echo<\/code> with <code>em_result=1<\/code> as its argument and <code>em_result=<\/code> as the <em>Starts With<\/em> prefix. It is the same <code>em_result=<\/code>-prefixed, delimiter-tokenized convention the OEM plugin\u2019s <code>OSLineToken<\/code> fetchlet uses, which turned out not to be a coincidence (more on that below). One column, <code>value<\/code>, type Number:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"246\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/002_me-columns-value-added-1024x246.png\" alt=\"\" class=\"wp-image-47637\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/002_me-columns-value-added-1024x246.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/002_me-columns-value-added-300x72.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/002_me-columns-value-added-1536x369.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/002_me-columns-value-added-765x184.png 765w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/002_me-columns-value-added.png 1580w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">The <em><strong>Test<\/strong><\/em> step lets you run the metric job for real against a live target before committing to anything. Since the idea is to have a valid archive that we can play with, it should definitely be tested.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"224\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/003_me-test-results-value1-1024x224.png\" alt=\"\" class=\"wp-image-47638\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/003_me-test-results-value1-1024x224.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/003_me-test-results-value1-1536x335.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/003_me-test-results-value1-300x66.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/003_me-test-results-value1-765x167.png 765w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/003_me-test-results-value1.png 1580w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h2 id=\"exporting-the-metric-extension\" class=\"wp-block-heading\">Exporting the metric extension<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You cannot export an <em>Editable<\/em> metric. The docs restrict <code>export_metric_extension<\/code> to <em>Production, Deployable Draft, and Published<\/em> versions. So the first step is promoting it, either via the UI or with <code>emcli<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ emcli save_metric_extension_draft -target_type=host -name='ME$minimal_uptime_check' -version=1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Don\u2019t worry if you receive no output, this is expected. Then, you can export the metric:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ emcli export_metric_extension -file_name=\/tmp\/minimal_uptime_check_v1.zip -target_type=host -name='ME$minimal_uptime_check' -version=1\nMetric extension &#091;host, ME$minimal_uptime_check, 1] exported successfully to file \/tmp\/minimal_uptime_check_v1.zip<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">There are three files in the archive:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>metadata\/ME#24#minimal_uptime_check.xml\ncollection\/ME#24#minimal_uptime_check.xml\nmea.xml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The first one is the manifest, <code>mea.xml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;MetricExtensionArchive name=\"MEAME$minimal_uptime_check\"&gt;\n&lt;MetricExtension name=\"ME$minimal_uptime_check\" type=\"host\" version=\"1\" is_repos=\"FALSE\" display_name=\"Minimal Uptime Check\" description=\"Minimal test ME - single OS command column, no credentials.\" version_comment=\" \" metadata_digest=\"18147044f9d9fab88c8ebbee213d2e1e\" coll_digest=\"e1a287a6df820c5e7d7fda0bd0bfcb3f\" attach_digest=\"d41d8cd98f00b204e9800998ecf8427e\"&gt;\n&lt;\/MetricExtension&gt;\n&lt;\/MetricExtensionArchive&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The metric definition is in <code>metadata\/ME#24#minimal_uptime_check.xml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;TargetMetadataExt EXT_NAME=\"ME$minimal_uptime_check\" EXT_VERSION=\"1\" TARGET_TYPE=\"host\"&gt;&lt;Metric NAME=\"ME$minimal_uptime_check\" TYPE=\"TABLE\"&gt;\n&lt;Display&gt;\n&lt;Label NLSID=\"NLS_METRIC_hostME$minimal_uptime_check\"&gt;Minimal Uptime Check&lt;\/Label&gt;\n&lt;Description NLSID=\"NLS_DESCRIPTION_hostME$minimal_uptime_check\"&gt;Minimal test ME - single OS command column, no credentials.&lt;\/Description&gt;\n&lt;\/Display&gt;\n&lt;TableDescriptor&gt;\n&lt;ColumnDescriptor NAME=\"value\" TYPE=\"NUMBER\"&gt;\n&lt;Display&gt;\n&lt;Label NLSID=\"NLS_COLUMN_hostME$minimal_uptime_checkvalue\"&gt;Value&lt;\/Label&gt;\n&lt;\/Display&gt;\n&lt;\/ColumnDescriptor&gt;\n&lt;\/TableDescriptor&gt;\n&lt;QueryDescriptor FETCHLET_ID=\"OSLineToken\"&gt;\n&lt;Property NAME=\"command\" SCOPE=\"GLOBAL\"&gt;\/bin\/echo&lt;\/Property&gt;\n&lt;Property NAME=\"scriptLoc\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;%scriptsDir%&lt;\/Property&gt;\n&lt;Property NAME=\"args\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;em_result=1&lt;\/Property&gt;\n&lt;Property NAME=\"delimiter\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;|&lt;\/Property&gt;\n&lt;Property NAME=\"startsWith\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;em_result=&lt;\/Property&gt;\n&lt;Property NAME=\"ENVEM_TARGET_NAME\" SCOPE=\"INSTANCE\" OPTIONAL=\"TRUE\"&gt;NAME&lt;\/Property&gt;\n&lt;CredentialRef NAME=\"OSCreds\"&gt;&lt;\/CredentialRef&gt;\n&lt;\/QueryDescriptor&gt;\n&lt;\/Metric&gt;\n&lt;\/TargetMetadataExt&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here, we can see that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>FETCHLET_ID=\"OSLineToken\"<\/code> is the <strong>same fetchlet<\/strong> a full OEM plugin\u2019s <code>TargetMetadata<\/code> XML uses for its <code>OSLineToken<\/code>-based collectors. The wizard is just generating the same fetchlet configuration.<\/li>\n\n\n\n<li><code>command<\/code>, <code>args<\/code>, <code>delimiter<\/code> and <code>startsWith<\/code> are the <strong>basic properties<\/strong> fields the adapter step.<\/li>\n\n\n\n<li><code>ENVEM_TARGET_NAME<\/code> is set even though I did not alter the Environment Variables section. This is the default.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The last file, <code>collection\/ME#24#minimal_uptime_check.xml<\/code>, is the schedule:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;TargetCollectionExt EXT_NAME=\"ME$minimal_uptime_check\" EXT_VERSION=\"1\" TARGET_TYPE=\"host\"&gt;&lt;CollectionItem NAME=\"ME$minimal_uptime_check\" UPLOAD=\"YES\"&gt;\n\t&lt;Schedule&gt;\n\t\t&lt;IntervalSchedule INTERVAL=\"15\" TIME_UNIT=\"Min\"\/&gt;\n\t&lt;\/Schedule&gt;\n\t&lt;MetricColl NAME=\"ME$minimal_uptime_check\"&gt;\n\t&lt;\/MetricColl&gt;\n&lt;\/CollectionItem&gt;\n&lt;\/TargetCollectionExt&gt;<\/code><\/pre>\n\n\n\n<h2 id=\"adding-a-second-column-and-a-real-environment-variable\" class=\"wp-block-heading\">Adding a second column and a real environment variable<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s build a second metric extension from the UI with the same command, but with two columns instead of one. I will also add a custom environment variable this time.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"350\" height=\"200\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/004_me-envvar-dialog-filled.png\" alt=\"\" class=\"wp-image-47639\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/004_me-envvar-dialog-filled.png 350w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/004_me-envvar-dialog-filled-300x171.png 300w\" sizes=\"auto, (max-width: 350px) 100vw, 350px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">For comparison, this is what the Environment Variables table looks like before you add anything to it: <code>EM_TARGET_NAME<\/code> is already there.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"340\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/005_me-envvar-list-default.png\" alt=\"\" class=\"wp-image-47640\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/005_me-envvar-list-default.png 720w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/005_me-envvar-list-default-300x142.png 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">And the second column added on the <em>Columns<\/em> step:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"253\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/006_me-columns-two-added-1024x253.png\" alt=\"\" class=\"wp-image-47641\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/006_me-columns-two-added-1024x253.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/006_me-columns-two-added-766x189.png 766w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/006_me-columns-two-added-300x74.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/006_me-columns-two-added-1536x379.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/006_me-columns-two-added.png 1580w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Exporting this metric extension and comparing the metadata against the first archive shows exactly what each choice changes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ diff unpacked\/metadata\/*.xml unpacked_v2\/metadata\/*.xml\n1c1\n&lt; &lt;TargetMetadataExt EXT_NAME=\"ME$minimal_uptime_check\" EXT_VERSION=\"1\" TARGET_TYPE=\"host\"&gt;&lt;Metric NAME=\"ME$minimal_uptime_check\" TYPE=\"TABLE\"&gt;\n---\n&gt; &lt;TargetMetadataExt EXT_NAME=\"ME$minimal_uptime_check_v2\" EXT_VERSION=\"1\" TARGET_TYPE=\"host\"&gt;&lt;Metric NAME=\"ME$minimal_uptime_check_v2\" TYPE=\"TABLE\"&gt;\n3,4c3,4\n&lt; &lt;Label NLSID=\"NLS_METRIC_hostME$minimal_uptime_check\"&gt;Minimal Uptime Check&lt;\/Label&gt;\n&lt; &lt;Description NLSID=\"NLS_DESCRIPTION_hostME$minimal_uptime_check\"&gt;Minimal test ME - single OS command column, no credentials.&lt;\/Description&gt;\n---\n&gt; &lt;Label NLSID=\"NLS_METRIC_hostME$minimal_uptime_check_v2\"&gt;Minimal Uptime Check V2&lt;\/Label&gt;\n&gt; &lt;Description NLSID=\"NLS_DESCRIPTION_hostME$minimal_uptime_check_v2\"&gt;Variant with env var and 2 columns, for archive-format comparison.&lt;\/Description&gt;\n9c9,14\n&lt; &lt;Label NLSID=\"NLS_COLUMN_hostME$minimal_uptime_checkvalue\"&gt;Value&lt;\/Label&gt;\n---\n&gt; &lt;Label NLSID=\"NLS_COLUMN_hostME$minimal_uptime_check_v2value\"&gt;Value&lt;\/Label&gt;\n&gt; &lt;\/Display&gt;\n&gt; &lt;\/ColumnDescriptor&gt;\n&gt; &lt;ColumnDescriptor NAME=\"state\" TYPE=\"STRING\"&gt;\n&gt; &lt;Display&gt;\n&gt; &lt;Label NLSID=\"NLS_COLUMN_hostME$minimal_uptime_check_v2state\"&gt;State&lt;\/Label&gt;\n16c21\n&lt; &lt;Property NAME=\"args\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;em_result=1&lt;\/Property&gt;\n---\n&gt; &lt;Property NAME=\"args\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;em_result=1|running&lt;\/Property&gt;\n19a25\n&gt; &lt;Property NAME=\"ENVMY_CUSTOM_VAR\" SCOPE=\"INSTANCE\" OPTIONAL=\"TRUE\"&gt;hello_world&lt;\/Property&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The second extension was saved under a new name, <code>ME$minimal_uptime_check_v2<\/code>, so every <code>EXT_NAME<\/code>, <code>NAME<\/code> and <code>NLSID<\/code> differs. Removing this noise, there are three changes that matter: the new <code>state<\/code> column, the <code>args<\/code> property, and the environment variable <code>ENVMY_CUSTOM_VAR<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\n&gt; &lt;ColumnDescriptor NAME=\"state\" TYPE=\"STRING\"&gt;\n&gt; &lt;Display&gt;\n&gt; &lt;Label NLSID=\"NLS_COLUMN_hostME$minimal_uptime_checkstate\"&gt;State&lt;\/Label&gt;\n&gt; &lt;\/Display&gt;\n&gt; &lt;\/ColumnDescriptor&gt;\n\n...\n\n&lt; &lt;Property NAME=\"args\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;em_result=1&lt;\/Property&gt;\n---\n&gt; &lt;Property NAME=\"args\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;em_result=1|running&lt;\/Property&gt;\n\n...\n\n&gt; &lt;Property NAME=\"ENVMY_CUSTOM_VAR\" SCOPE=\"INSTANCE\" OPTIONAL=\"TRUE\"&gt;hello_world&lt;\/Property&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The new column is a second <code>ColumnDescriptor<\/code>, in the same order as the pipe-delimited output (<code>em_result=1|running<\/code>). The environment variable becomes <code>ENVMY_CUSTOM_VAR=hello_world<\/code>.<\/p>\n\n\n\n<h2 id=\"adding-an-uploaded-script\" class=\"wp-block-heading\">Adding an uploaded script<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Both examples above run an OS command directly. Let\u2019s create a metric extension that runs an <strong>uploaded script<\/strong> instead of a literal command. Exporting a metric extension with an uploaded Perl script adds a fourth path to the archive, alongside the usual <code>mea.xml<\/code>\/<code>metadata<\/code>\/<code>collection<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mea.xml\nmetadata\/ME#24#script_uptime_check.xml\ncollection\/ME#24#script_uptime_check.xml\nscripts\/uptime_check.pl<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The manifest lists the script by its real name, in a <code>&lt;scripts&gt;<\/code> element, with an updated <code>attach_digest<\/code> parameter.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;MetricExtensionArchive name=\"MEAME$script_uptime_check\"&gt;\n&lt;MetricExtension name=\"ME$script_uptime_check\" type=\"host\" version=\"1\" is_repos=\"FALSE\" display_name=\"Script Uptime Check\" description=\"ME cloned from minimal_uptime_check, adapter modified to run an uploaded script.\" version_comment=\" \" metadata_digest=\"e4778d5b4a756fed3d7e73aa55931d88\" coll_digest=\"bc223105d5b2e6e31d5123eadcbd929b\" attach_digest=\"d04278db542142ccb9a89be64c3e151e\"&gt;\n&lt;scripts name=\"uptime_check.pl\"&gt;\n&lt;\/scripts&gt;\n&lt;\/MetricExtension&gt;\n&lt;\/MetricExtensionArchive&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>QueryDescriptor<\/code> has a new property called <code>script<\/code>, giving the script name. The <code>command<\/code> property is also updated, pointing at <code>perl<\/code> instead of <code>\/bin\/echo<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;QueryDescriptor FETCHLET_ID=\"OSLineToken\"&gt;\n&lt;Property NAME=\"command\" SCOPE=\"GLOBAL\"&gt;%perlBin%\/perl&lt;\/Property&gt;\n&lt;Property NAME=\"script\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;%scriptsDir%\/uptime_check.pl&lt;\/Property&gt;\n&lt;Property NAME=\"scriptLoc\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;%scriptsDir%&lt;\/Property&gt;\n&lt;Property NAME=\"delimiter\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;|&lt;\/Property&gt;\n&lt;Property NAME=\"startsWith\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;em_result=&lt;\/Property&gt;\n&lt;Property NAME=\"ENVEM_TARGET_NAME\" SCOPE=\"INSTANCE\" OPTIONAL=\"TRUE\"&gt;NAME&lt;\/Property&gt;\n&lt;CredentialRef NAME=\"OSCreds\"&gt;&lt;\/CredentialRef&gt;\n&lt;\/QueryDescriptor&gt;<\/code><\/pre>\n\n\n\n<h2 id=\"repository-side-metric-extension\" class=\"wp-block-heading\">Repository-side metric extension<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s conclude by creating a <strong>repository-side<\/strong> metric extension, which runs SQL against the OMS repository. With a <strong>repository-side Metric Extension<\/strong>, the <code>FETCHLET_ID<\/code> is <code>REPOSITORY_SQL<\/code>, and the properties are replaced by a <code>Source<\/code> property containing the SQL query:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;QueryDescriptor FETCHLET_ID=\"REPOSITORY_SQL\"&gt;\n&lt;Property NAME=\"Type\" SCOPE=\"GLOBAL\"&gt;SQL&lt;\/Property&gt;\n&lt;Property NAME=\"Source\" SCOPE=\"GLOBAL\"&gt;SELECT target_guid,\n       target_type,\n       1 AS host_count\nFROM mgmt$target\nWHERE target_type = 'host'&lt;\/Property&gt;\n&lt;\/QueryDescriptor&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In the manifest, <code>is_repos=\"TRUE\"<\/code> is what differentiates this kind of metric extension. The <code>&lt;Metric&gt;<\/code> element itself picks up <code>REPOSITORY=\"TRUE\"<\/code> too, and the columns default to the query <code>SELECT<\/code> list (<code>TARGET_TYPE<\/code>, <code>HOST_COUNT<\/code> here) rather than anything typed by hand on the Columns step.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;MetricExtensionArchive name=\"MEAME$sql_target_count\"&gt;\n&lt;MetricExtension name=\"ME$sql_target_count\" type=\"host\" version=\"1\" is_repos=\"TRUE\" display_name=\"SQL Target Count\" description=\"Test ME using the repository-side SQL adapter: counts targets by status.\" version_comment=\" \" metadata_digest=\"0ca6af88e017fb535ae2d59f7f1b6143\" coll_digest=\"e7be6de5a24037de10846bc29391bf2f\" attach_digest=\"d41d8cd98f00b204e9800998ecf8427e\"&gt;\n&lt;\/MetricExtension&gt;\n&lt;\/MetricExtensionArchive&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With all of this in mind, let\u2019s try to feed the Enterprise Manager a custom metric extension built entirely by hand, using a small Python script as the collector instead of a literal command.<\/p>\n\n\n\n<h2 id=\"import-our-first-custom-metric-extension\" class=\"wp-block-heading\">Import our first custom metric extension<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a script reading the 1-minute load average from <code>\/proc\/loadavg<\/code> and printing it with the same <code>em_result=<\/code> prefix expected by <code>OSLineToken<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3\nwith open(\"\/proc\/loadavg\") as f:\n    load1 = f.read().split()&#091;0]\nprint(f\"em_result={load1}\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">We have three XML files and the script, written by hand rather than exported from the wizard. <code>metadata\/ME#24#python_load_check.xml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;TargetMetadataExt EXT_NAME=\"ME$python_load_check\" EXT_VERSION=\"1\" TARGET_TYPE=\"host\"&gt;&lt;Metric NAME=\"ME$python_load_check\" TYPE=\"TABLE\"&gt;\n&lt;Display&gt;\n&lt;Label NLSID=\"NLS_METRIC_hostME$python_load_check\"&gt;Python Load Check&lt;\/Label&gt;\n&lt;Description NLSID=\"NLS_DESCRIPTION_hostME$python_load_check\"&gt;Runs an uploaded Python script that reads the 1-minute load average from \/proc\/loadavg.&lt;\/Description&gt;\n&lt;\/Display&gt;\n&lt;TableDescriptor&gt;\n&lt;ColumnDescriptor NAME=\"value\" TYPE=\"NUMBER\"&gt;\n&lt;Display&gt;\n&lt;Label NLSID=\"NLS_COLUMN_hostME$python_load_checkvalue\"&gt;Value&lt;\/Label&gt;\n&lt;\/Display&gt;\n&lt;\/ColumnDescriptor&gt;\n&lt;\/TableDescriptor&gt;\n&lt;QueryDescriptor FETCHLET_ID=\"OSLineToken\"&gt;\n&lt;Property NAME=\"command\" SCOPE=\"GLOBAL\"&gt;\/usr\/bin\/python3&lt;\/Property&gt;\n&lt;Property NAME=\"script\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;%scriptsDir%\/load_check.py&lt;\/Property&gt;\n&lt;Property NAME=\"scriptLoc\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;%scriptsDir%&lt;\/Property&gt;\n&lt;Property NAME=\"delimiter\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;|&lt;\/Property&gt;\n&lt;Property NAME=\"startsWith\" SCOPE=\"GLOBAL\" OPTIONAL=\"TRUE\"&gt;em_result=&lt;\/Property&gt;\n&lt;Property NAME=\"ENVEM_TARGET_NAME\" SCOPE=\"INSTANCE\" OPTIONAL=\"TRUE\"&gt;NAME&lt;\/Property&gt;\n&lt;CredentialRef NAME=\"OSCreds\"&gt;&lt;\/CredentialRef&gt;\n&lt;\/QueryDescriptor&gt;\n&lt;\/Metric&gt;\n&lt;\/TargetMetadataExt&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>command<\/code> property points at the interpreter (<code>\/usr\/bin\/python3<\/code> instead of <code>%perlBin%\/perl<\/code>), while <code>script<\/code> points at the uploaded file. Everything else is untouched. Here is the <code>collection\/ME#24#python_load_check.xml<\/code> file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;TargetCollectionExt EXT_NAME=\"ME$python_load_check\" EXT_VERSION=\"1\" TARGET_TYPE=\"host\"&gt;&lt;CollectionItem NAME=\"ME$python_load_check\" UPLOAD=\"YES\"&gt;\n\t&lt;Schedule&gt;\n\t\t&lt;IntervalSchedule INTERVAL=\"15\" TIME_UNIT=\"Min\"\/&gt;\n\t&lt;\/Schedule&gt;\n\t&lt;MetricColl NAME=\"ME$python_load_check\"&gt;\n\t&lt;\/MetricColl&gt;\n&lt;\/CollectionItem&gt;\n&lt;\/TargetCollectionExt&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And the manifest <code>mea.xml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;MetricExtensionArchive name=\"MEAME$python_load_check\"&gt;\n&lt;MetricExtension name=\"ME$python_load_check\" type=\"host\" version=\"1\" is_repos=\"FALSE\" display_name=\"Python Load Check\" description=\"Runs an uploaded Python script that reads the 1-minute load average from \/proc\/loadavg.\" version_comment=\" \" metadata_digest=\"0000000000000000000000000000000\" coll_digest=\"0000000000000000000000000000000\" attach_digest=\"0000000000000000000000000000000\"&gt;\n&lt;scripts name=\"load_check.py\"&gt;\n&lt;\/scripts&gt;\n&lt;\/MetricExtension&gt;\n&lt;\/MetricExtensionArchive&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The digests are just zeroes here. The OMS recomputes and stores new digests when you import the metric.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, let\u2019s build the archive with the same layout <code>export_metric_extension<\/code> produces, assembled by hand instead:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ find build -type f\nbuild\/mea.xml\nbuild\/metadata\/ME#24#python_load_check.xml\nbuild\/collection\/ME#24#python_load_check.xml\nbuild\/scripts\/load_check.py\n\n$ cd build &amp;&amp; zip -rq ..\/python_load_check.zip . &amp;&amp; cd ..\n$ unzip -l python_load_check.zip\nArchive:  python_load_check.zip\n  Length      Date    Time    Name\n---------  ---------- -----   ----\n        0  08-27-2026 14:38   metadata\/\n     1212  08-27-2026 14:38   metadata\/ME#24#python_load_check.xml\n        0  08-27-2026 14:38   collection\/\n      321  08-27-2026 14:38   collection\/ME#24#python_load_check.xml\n        0  08-27-2026 14:38   scripts\/\n      116  08-27-2026 14:38   scripts\/load_check.py\n      529  08-27-2026 14:38   mea.xml\n---------                     -------\n     2178                     7 files<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The last step is to import the metric extension with <code>emcli<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ emcli import_metric_extension -file_name=python_load_check.zip\nMetric extension file python_load_check.zip imported successfully<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You now know how to build metric extensions without going through the web UI.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recently, I was working on deploying Metric Extensions automatically in Enterprise Manager, but the more I looked into it, the more it turned into a different question: what does a Metric Extension look like ? In a previous blog, I presented the SYSMAN tables containing the metric extensions definitions. I also showed how to retrieve [&hellip;]<\/p>\n","protected":false},"author":152,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":"","_members_access_role":[],"_members_access_error":""},"categories":[3683,59],"tags":[4214,4047,4277,761],"type_dbi":[4216,4048,4278,4010],"class_list":["post-47635","post","type-post","status-publish","format-standard","hentry","category-monitoring","category-oracle","tag-emcli","tag-enterprise-manager","tag-metric-extension-2","tag-oem","type-emcli","type-enterprise-manager","type-metric-extension-3","type-oem"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.7 (Yoast SEO v28.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Anatomy of an Enterprise Manager metric extension - dbi Blog<\/title>\n<meta name=\"description\" content=\"The archive format of an Enterprise Manager metric extension: no emcli verb defines one, so I built it by hand and exported it.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Anatomy of an Enterprise Manager metric extension\" \/>\n<meta property=\"og:description\" content=\"The archive format of an Enterprise Manager metric extension: no emcli verb defines one, so I built it by hand and exported it.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-23T11:09:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-23T11:15:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/001_me-genprop-filled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"405\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Julien Delattre\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Julien Delattre\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/\"},\"author\":{\"name\":\"Julien Delattre\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/812297b963933317cfcbbf006a273eec\"},\"headline\":\"Anatomy of an Enterprise Manager metric extension\",\"datePublished\":\"2026-10-23T11:09:17+00:00\",\"dateModified\":\"2026-10-23T11:15:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/\"},\"wordCount\":831,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/10\\\/001_me-genprop-filled.png\",\"keywords\":[\"emcli\",\"enterprise manager\",\"metric extension\",\"OEM\"],\"articleSection\":[\"Monitoring\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/\",\"name\":\"Anatomy of an Enterprise Manager metric extension - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/10\\\/001_me-genprop-filled.png\",\"datePublished\":\"2026-10-23T11:09:17+00:00\",\"dateModified\":\"2026-10-23T11:15:46+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/812297b963933317cfcbbf006a273eec\"},\"description\":\"The archive format of an Enterprise Manager metric extension: no emcli verb defines one, so I built it by hand and exported it.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/10\\\/001_me-genprop-filled.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/10\\\/001_me-genprop-filled.png\",\"width\":720,\"height\":405},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Anatomy of an Enterprise Manager metric extension\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/812297b963933317cfcbbf006a273eec\",\"name\":\"Julien Delattre\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"caption\":\"Julien Delattre\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/juliendelattre\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Anatomy of an Enterprise Manager metric extension - dbi Blog","description":"The archive format of an Enterprise Manager metric extension: no emcli verb defines one, so I built it by hand and exported it.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/","og_locale":"en_US","og_type":"article","og_title":"Anatomy of an Enterprise Manager metric extension","og_description":"The archive format of an Enterprise Manager metric extension: no emcli verb defines one, so I built it by hand and exported it.","og_url":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/","og_site_name":"dbi Blog","article_published_time":"2026-10-23T11:09:17+00:00","article_modified_time":"2026-10-23T11:15:46+00:00","og_image":[{"width":720,"height":405,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/001_me-genprop-filled.png","type":"image\/png"}],"author":"Julien Delattre","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Julien Delattre","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/"},"author":{"name":"Julien Delattre","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/812297b963933317cfcbbf006a273eec"},"headline":"Anatomy of an Enterprise Manager metric extension","datePublished":"2026-10-23T11:09:17+00:00","dateModified":"2026-10-23T11:15:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/"},"wordCount":831,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/001_me-genprop-filled.png","keywords":["emcli","enterprise manager","metric extension","OEM"],"articleSection":["Monitoring","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/","url":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/","name":"Anatomy of an Enterprise Manager metric extension - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/001_me-genprop-filled.png","datePublished":"2026-10-23T11:09:17+00:00","dateModified":"2026-10-23T11:15:46+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/812297b963933317cfcbbf006a273eec"},"description":"The archive format of an Enterprise Manager metric extension: no emcli verb defines one, so I built it by hand and exported it.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/001_me-genprop-filled.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/10\/001_me-genprop-filled.png","width":720,"height":405},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Anatomy of an Enterprise Manager metric extension"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/812297b963933317cfcbbf006a273eec","name":"Julien Delattre","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","caption":"Julien Delattre"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/juliendelattre\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/47635","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/152"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=47635"}],"version-history":[{"count":4,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/47635\/revisions"}],"predecessor-version":[{"id":48059,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/47635\/revisions\/48059"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=47635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=47635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=47635"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=47635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}