{"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:09:17","modified_gmt":"2026-10-23T11:09:17","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 decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/2026\/10\/001_me-genprop-filled.png\" alt=\"\" class=\"wp-image-47636\" \/><\/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 decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/2026\/10\/002_me-columns-value-added-1024x246.png\" alt=\"\" class=\"wp-image-47637\" \/><\/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 decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/2026\/10\/003_me-test-results-value1-1024x224.png\" alt=\"\" class=\"wp-image-47638\" \/><\/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 decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/2026\/10\/004_me-envvar-dialog-filled.png\" alt=\"\" class=\"wp-image-47639\" \/><\/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 decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/2026\/10\/005_me-envvar-list-default.png\" alt=\"\" class=\"wp-image-47640\" \/><\/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 decoding=\"async\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/2026\/10\/006_me-columns-two-added-1024x253.png\" alt=\"\" class=\"wp-image-47641\" \/><\/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;&nbsp;<\/p>\n","protected":false},"author":152,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","neve_meta_reading_time":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[3683,59],"tags":[13434,13435,761],"class_list":["post-47635","post","type-post","status-publish","format-standard","hentry","category-monitoring","category-oracle","tag-emcli","tag-enterprise-manager","tag-oem"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.8 (Yoast SEO v28.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Anatomy of an Enterprise Manager metric extension - dbi services | 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 services | Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/dbiservices\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-23T11:09:17+00:00\" \/>\n<meta name=\"author\" content=\"Julien Delattre\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@dbiservices\" \/>\n<meta name=\"twitter:site\" content=\"@dbiservices\" \/>\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\\\/0e990b04385bd7ff84b414bb8d92c544\"},\"headline\":\"Anatomy of an Enterprise Manager metric extension\",\"datePublished\":\"2026-10-23T11:09:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/metric-extension-export-format-enterprise-manager\\\/\"},\"wordCount\":831,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#organization\"},\"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\\\/2026\\\/10\\\/001_me-genprop-filled.png\",\"keywords\":[\"emcli\",\"enterprise manager\",\"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 services | 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\\\/2026\\\/10\\\/001_me-genprop-filled.png\",\"datePublished\":\"2026-10-23T11:09:17+00:00\",\"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\":\"\",\"contentUrl\":\"\"},{\"@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 services Blog\",\"description\":\"#BeSharing\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#organization\"},\"alternateName\":\"dbi Blog\",\"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\":\"Organization\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#organization\",\"name\":\"dbi services\",\"alternateName\":\"dbi\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/dbi-services-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/dbi-services-logo.png\",\"width\":512,\"height\":512,\"caption\":\"dbi services\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/dbiservices\\\/\",\"https:\\\/\\\/x.com\\\/dbiservices\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/dbi-services\\\/\",\"https:\\\/\\\/www.youtube.com\\\/user\\\/dbiservices\"],\"description\":\"Swiss IT consulting and services company specialised in efficient data infrastructures and platforms: databases, application servers, cloud, DevOps, digitalization, analytics, data quality and monitoring. Headquartered in Del\u00e9mont with offices in Nyon, Basel, Bern and Zurich.\",\"email\":\"info@dbi-services.com\",\"telephone\":\"+41 32 422 96 00\",\"legalName\":\"dbi services SA\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/0e990b04385bd7ff84b414bb8d92c544\",\"name\":\"Julien Delattre\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/JDE_Web-1-scaled.jpg\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/JDE_Web-1-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/JDE_Web-1-scaled.jpg\",\"caption\":\"Julien Delattre\"},\"description\":\"Julien Delattre, member of the Oracle Team Zurich, has more than five years of experience specializing in Oracle databases, plus expertise in MariaDB and MongoDB. Prior to dbi services, he was a Database Administrator at Atos in Angers, France, and a Data Scientist at Air France in Paris and Apurata in Lima. Julien holds a Master's degree in Computer Science, Data Science, and Statistics from Centrale Paris \\\/ Universit\u00e9 Paris-Saclay.\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/julien-delattre\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Anatomy of an Enterprise Manager metric extension - dbi services | 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 services | Blog","article_publisher":"https:\/\/www.facebook.com\/dbiservices\/","article_published_time":"2026-10-23T11:09:17+00:00","author":"Julien Delattre","twitter_card":"summary_large_image","twitter_creator":"@dbiservices","twitter_site":"@dbiservices","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\/0e990b04385bd7ff84b414bb8d92c544"},"headline":"Anatomy of an Enterprise Manager metric extension","datePublished":"2026-10-23T11:09:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/metric-extension-export-format-enterprise-manager\/"},"wordCount":831,"commentCount":0,"publisher":{"@id":"https:\/\/www.dbi-services.com\/blog\/#organization"},"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\/2026\/10\/001_me-genprop-filled.png","keywords":["emcli","enterprise manager","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 services | 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\/2026\/10\/001_me-genprop-filled.png","datePublished":"2026-10-23T11:09:17+00:00","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":"","contentUrl":""},{"@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 services Blog","description":"#BeSharing","publisher":{"@id":"https:\/\/www.dbi-services.com\/blog\/#organization"},"alternateName":"dbi Blog","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":"Organization","@id":"https:\/\/www.dbi-services.com\/blog\/#organization","name":"dbi services","alternateName":"dbi","url":"https:\/\/www.dbi-services.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/2026\/09\/dbi-services-logo.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/2026\/09\/dbi-services-logo.png","width":512,"height":512,"caption":"dbi services"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/dbiservices\/","https:\/\/x.com\/dbiservices","https:\/\/www.linkedin.com\/company\/dbi-services\/","https:\/\/www.youtube.com\/user\/dbiservices"],"description":"Swiss IT consulting and services company specialised in efficient data infrastructures and platforms: databases, application servers, cloud, DevOps, digitalization, analytics, data quality and monitoring. Headquartered in Del\u00e9mont with offices in Nyon, Basel, Bern and Zurich.","email":"info@dbi-services.com","telephone":"+41 32 422 96 00","legalName":"dbi services SA"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/0e990b04385bd7ff84b414bb8d92c544","name":"Julien Delattre","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/2025\/05\/JDE_Web-1-scaled.jpg","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/2025\/05\/JDE_Web-1-scaled.jpg","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/2025\/05\/JDE_Web-1-scaled.jpg","caption":"Julien Delattre"},"description":"Julien Delattre, member of the Oracle Team Zurich, has more than five years of experience specializing in Oracle databases, plus expertise in MariaDB and MongoDB. Prior to dbi services, he was a Database Administrator at Atos in Angers, France, and a Data Scientist at Air France in Paris and Apurata in Lima. Julien holds a Master's degree in Computer Science, Data Science, and Statistics from Centrale Paris \/ Universit\u00e9 Paris-Saclay.","url":"https:\/\/www.dbi-services.com\/blog\/author\/julien-delattre\/"}]}},"_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":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/47635\/revisions"}],"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"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}