<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Enterprise Management & OCI Observability | rajeshravi.com]]></title><description><![CDATA[Oracle OEM 24ai, OCI O&M, multicloud monitoring insights from a Senior Technical Architect with 20+ years in enterprise observability and management delivery.]]></description><link>https://www.rajeshravi.com</link><image><url>https://cdn.hashnode.com/uploads/logos/6a19a646ab3131ee6a234d7c/da550282-a202-4423-9666-a9d9b94d05fc.jpg</url><title>Enterprise Management &amp; OCI Observability | rajeshravi.com</title><link>https://www.rajeshravi.com</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 08:45:12 GMT</lastBuildDate><atom:link href="https://www.rajeshravi.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[EM Automation and the Job System ]]></title><description><![CDATA[Oracle observability post #8— the last post covered Compliance Standards and continuous security assurance. This one is about automation: how to use OEM's job system to run routine DBA operations on s]]></description><link>https://www.rajeshravi.com/em-automation-and-the-job-system</link><guid isPermaLink="true">https://www.rajeshravi.com/em-automation-and-the-job-system</guid><dc:creator><![CDATA[Rajesh Ravi]]></dc:creator><pubDate>Sat, 05 Sep 2026 16:42:40 GMT</pubDate><content:encoded><![CDATA[<p><em>Oracle observability post #8— the last post covered Compliance Standards and continuous security assurance. This one is about automation: how to use OEM's job system to run routine DBA operations on schedule across your entire estate, build chained workflows that replace shell scripts, and make failure visible before it becomes a problem.</em></p>
<hr />
<p>Every Oracle environment has a list of tasks that run on a schedule. Statistics gathering. Log archiving. RMAN backup verification. Tablespace usage reports. Health checks before maintenance windows. On a small estate, cron jobs and DBMS_SCHEDULER handle this well enough. On a larger estate — 50 databases, 200 hosts, multiple data centers — that approach creates a coordination problem. The jobs run, but the output is scattered across servers, nobody is watching for failures, and a missed execution goes unnoticed until something breaks downstream.</p>
<p>OEM 24ai's job system solves this by centralizing job scheduling, execution, and monitoring across your entire estate. One place to define what runs, where, and when. One place to see what succeeded and what failed. One place to get paged when something doesn't run. No logging into individual servers, no reconciling output from disparate cron logs.</p>
<hr />
<h2>Job Types in OEM 24ai</h2>
<p>OEM supports several job types, each designed for a specific class of work:</p>
<p><strong>OS Command</strong> — runs a shell script or command on the agent host. Good for host-level maintenance: log rotation, file cleanup, pre/post-patching steps, space management. The script runs in the OS context of the Management Agent user.</p>
<p><strong>SQL Script</strong> — executes SQL against an Oracle database target. Script runs in the database context, output is captured in OEM. Good for statistics operations, data purges, custom health checks, report generation.</p>
<p><strong>RMAN Script</strong> — executes an RMAN script against a database. The job handles connection and output capture. Good for backup validation, image copies, crosschecks, restore testing.</p>
<p><strong>SQL*Plus Script</strong> — runs SQL<em>Plus with a script you supply. More flexible than SQL Script for operations that use SQL</em>Plus-specific commands or complex formatting. Use when you need control over output formatting or SQL*Plus settings.</p>
<p><strong>Multi-Task Job</strong> — a sequence of steps where each step is its own job type. Steps can run serially or in parallel, with pass/fail conditions controlling flow. This is where OEM's job system becomes genuinely powerful for operational automation.</p>
<hr />
<h2>Creating and Scheduling Jobs (EM CLI)</h2>
<p>The console job wizard works for one-off setup. For repeatable, scriptable job management, EM CLI is the right tool.&gt; <strong>Note:</strong> EM CLI syntax below is representative. Exact parameter names vary by OEM version and verb type. Always validate against your environment: <code>emcli help create_job</code> and <code>emcli help get_jobs</code>.</p>
<h3>Create a SQL script job targeting multiple databases</h3>
<pre><code class="language-bash">emcli create_job \
  -name="PROD_STATS_GATHER_WEEKLY" \
  -type="SQL Script" \
  -target_list="PRODDB01:oracle_database,PRODDB02:oracle_database,PRODDB03:oracle_database" \
  -input_file="sql_script:/opt/oracle/scripts/gather_stats.sql" \
  -schedule_type="weekly" \
  -start_time="2026-10-05 02:00:00" \
  -repeat_hours=168 \
  -tz="America/Chicago"
</code></pre>
<h3>Create an OS command job targeting a host group</h3>
<pre><code class="language-bash">emcli create_job \
  -name="PROD_HOST_LOG_CLEANUP" \
  -type="OSCommand" \
  -target_list="Production_Hosts:group" \
  -os_command="/opt/oracle/scripts/cleanup_alert_logs.sh" \
  -schedule_type="daily" \
  -start_time="2026-10-01 01:00:00" \
  -tz="America/Chicago"
</code></pre>
<h3>Submit a job immediately (outside its schedule)</h3>
<pre><code class="language-bash">emcli submit_job \
  -name="PROD_STATS_GATHER_WEEKLY"
</code></pre>
<h3>Get job execution history</h3>
<pre><code class="language-bash">emcli get_jobs \
  -name="PROD_STATS_GATHER_WEEKLY" \
  -status="Succeeded,Failed,Running"
</code></pre>
<p>Output includes execution time, duration, target, and exit status. For failed jobs, use the console to drill into full output and error messages.</p>
<hr />
<h2>Job Libraries: Reusable Templates</h2>
<p>If the same job runs against multiple target sets with minor variations, the Job Library saves you from redefining it each time.</p>
<p>A Job Library entry is a saved job definition without a schedule or specific target list attached. When you need to run it, you create a job from the library entry, add the target list and schedule, and submit.</p>
<p>Console path: <strong>Enterprise → Job → Library</strong></p>
<p>This is particularly useful for:</p>
<ul>
<li><p>Standard maintenance scripts that run against different groups on different cadences (production on Sunday, development on Tuesday)</p>
</li>
<li><p>Jobs that different DBAs submit against their own target subsets</p>
</li>
<li><p>Patching and upgrade pre-checks that get rerun at each patching cycle</p>
</li>
</ul>
<p>Build the library as you build the jobs. By the time you have 10–15 standardized operations in the library, onboarding a new DBA to your team's operational practices becomes significantly easier.</p>
<hr />
<h2>Multi-Task Jobs: Chained Workflows</h2>
<p>A Multi-Task Job is a sequence of steps where each step is its own job type. Steps can be:</p>
<ul>
<li><p><strong>Serial</strong> — step 2 starts only after step 1 completes</p>
</li>
<li><p><strong>Parallel</strong> — steps run concurrently; a final step waits for all to complete</p>
</li>
<li><p><strong>Conditional</strong> — step 3 runs only if step 2 succeeded; step 4 runs only if step 2 failed</p>
</li>
</ul>
<p><strong>Example: pre-maintenance health check workflow</strong></p>
<ol>
<li><p>Run tablespace usage query (SQL Script) — verify no tablespace is above 85%</p>
</li>
<li><p>If step 1 succeeds → run invalid objects check (SQL Script)</p>
</li>
<li><p>If step 1 or 2 fails → generate alert incident (via notification rule)</p>
</li>
<li><p>Run RMAN crosscheck (RMAN Script) — confirm backup catalog is clean</p>
</li>
<li><p>Run listener status check (OS Command) — confirm listeners are up</p>
</li>
</ol>
<p>This kind of workflow would previously live in a shell script that called multiple utilities, parsed exit codes, and had its own error handling. OEM's Multi-Task Job does it natively: per-step status, per-step output capture, conditional branching, and full visibility in the console — no custom orchestration code.</p>
<p>Console path: <strong>Enterprise → Job → Activity → Create Job → Multi-Task</strong></p>
<hr />
<h2>Job Output and Failure Visibility</h2>
<p>Every job execution captures:</p>
<ul>
<li><p>Start and end time</p>
</li>
<li><p>Target name and host</p>
</li>
<li><p>Exit status (Succeeded, Failed, Stopped)</p>
</li>
<li><p>Full output log — stdout/stderr for OS commands, SQL output for database scripts</p>
</li>
</ul>
<p>Console path: <strong>Enterprise → Job → Activity</strong> — filterable by status, target, time range, and job name.</p>
<p>For long-running jobs, you can monitor live output in the console rather than waiting for completion or tailing a log on the host.</p>
<p><strong>Connecting to incident management:</strong> Create incident rules that fire on job failure. A failed RMAN crosscheck at 3am becomes an OEM incident, which triggers your on-call notification via the same infrastructure that handles your performance alerts. One notification framework for both real-time monitoring and scheduled job failures.</p>
<p>Console path for notification rules: <strong>Enterprise → Monitoring → Incident Rules → Create Rule</strong> → select "Job Execution" as the event type → filter on status = Failed and severity = your threshold.</p>
<hr />
<h2>What to Automate First</h2>
<p>If you're starting from scratch with OEM job automation, three categories give the most return for the setup investment:</p>
<p><strong>Statistics gathering.</strong> Most environments still run this ad-hoc or through DBMS_SCHEDULER jobs with no centralized visibility. Moving it to OEM gives you a single place to confirm it ran on every production database, see how long it took, and get paged if it fails. The group targeting approach means one job definition covers your entire production database fleet.</p>
<p><strong>Log and trace file cleanup.</strong> Alert logs, trace files, and audit files accumulate on every Oracle host. An OS Command job targeting your host group, running weekly, keeps disk pressure under control without requiring manual intervention. Schedule it to run before your disk utilization monitoring alerts fire — not after.</p>
<p><strong>RMAN backup verification.</strong> Your backups run. But is someone checking that they succeeded? An RMAN crosscheck job with a failure notification rule turns "I assume the backups are good" into "I know the backups are good, and here's when I last verified." This one change has caught real backup failures in multiple customer environments before the database team realized there was a problem.</p>
<hr />
<h2>The Anti-Patterns</h2>
<p><strong>Using OEM jobs to replace DBMS_SCHEDULER.</strong> For database-internal scheduling — maintenance window management, stats gathering that runs inside a maintenance window, application-layer batch jobs — DBMS_SCHEDULER is the right tool. OEM jobs are for cross-estate coordination and operations that need centralized visibility and failure alerting. Don't duplicate the same job in both systems.</p>
<p><strong>No output retention policy.</strong> OEM stores job output in the Management Repository. Long-running jobs with verbose SQL output accumulate fast. Set a retention period in the job settings (Enterprise → Job → Settings) rather than letting the repository grow unchecked.</p>
<p><strong>Submitting jobs manually when automation is available.</strong> If a DBA is running the same operation by hand every week, it should be scheduled. The manual step adds risk — forgotten runs, inconsistent timing, no output retention — without adding value. If you're doing it more than twice, build the job.</p>
<p><strong>No failure notification on scheduled jobs.</strong> A job that fails silently is worse than no job at all. It gives you false confidence that the task ran. Every scheduled job that matters should have a notification rule on failure. This is a one-time setup cost per job type.</p>
<p><strong>One monolithic OS command job.</strong> Breaking complex operations into Multi-Task Job steps gives you per-step status, per-step output, and conditional branching. A shell script that does everything in sequence tells you "it failed" — a Multi-Task Job tells you which step failed, what its output was, and which subsequent steps were skipped or redirected.</p>
<p><strong>Ignoring duration trends.</strong> Statistics gathering that used to take 45 minutes and now takes 3 hours is a signal. OEM captures job duration for every execution. Review it periodically. An unexplained duration increase is often your first indicator of a growing data volume problem, degraded I/O, or a locking issue.</p>
<hr />
<h2>What Good Looks Like</h2>
<p>In a well-configured estate, the OEM job system handles the operational repetition: statistics, cleanup, verification, health checks, pre-maintenance checks. All of it runs on schedule, against the right target groups, with output captured and failures surfaced as incidents. DBAs aren't logging into servers to run manual checks; they're responding to alerts when automation finds a problem.</p>
<p>The Job Library has reusable templates for the 10–15 standard operations your team runs regularly. Multi-Task Jobs handle workflows that used to live in shell scripts nobody maintained. The job activity view gives you a single answer to "did everything run last night?"</p>
<p>When something fails — and eventually something will — you know immediately, you have the full output, and you can correlate the failure with other events on the same target.</p>
<hr />
<h2>The Bottom Line</h2>
<p>OEM 24ai's job system turns routine DBA operations from manual tasks into managed, monitored automation. OS commands, SQL scripts, RMAN scripts, and chained Multi-Task workflows cover the operational workloads that most teams are still running manually or through undocumented cron jobs.</p>
<p>The investment is upfront: defining the jobs, building the library, wiring up the notification rules. The return is every subsequent execution running automatically, with output retained and failures paged — not discovered days later when someone notices a side effect.</p>
<hr />
<p><em>Coming soon in this series: OEM 24ai Incident Management and Notification Rules — how to build a notification framework that gets the right alert to the right person at the right time, and how to avoid the alert fatigue that makes monitoring systems useless.</em></p>
<hr />
]]></content:encoded></item><item><title><![CDATA[OEM 24ai HA/DR Architecture: What Happens When the Tool Watching Your Estate Goes Down]]></title><description><![CDATA[Oracle observability post #7 — the last post covered the OEM job system and how to turn routine DBA operations into scheduled, monitored automation. This one turns the lens on OEM itself: what happens]]></description><link>https://www.rajeshravi.com/oem-24ai-ha-dr-architecture-what-happens-when-the-tool-watching-your-estate-goes-down</link><guid isPermaLink="true">https://www.rajeshravi.com/oem-24ai-ha-dr-architecture-what-happens-when-the-tool-watching-your-estate-goes-down</guid><category><![CDATA[Oracle]]></category><category><![CDATA[high availability]]></category><category><![CDATA[Disaster recovery]]></category><category><![CDATA[Databases]]></category><category><![CDATA[Devops]]></category><dc:creator><![CDATA[Rajesh Ravi]]></dc:creator><pubDate>Fri, 04 Sep 2026 15:29:36 GMT</pubDate><content:encoded><![CDATA[<p><em>Oracle observability post #7 — the last post covered the OEM job system and how to turn routine DBA operations into scheduled, monitored automation. This one turns the lens on OEM itself: what happens when the tool that watches your Oracle estate goes down, and how to architect it so that doesn't take your monitoring blind.</em></p>
<hr />
<p>Every conversation about OEM eventually gets to the same uncomfortable question: what's the DR plan for OEM itself?</p>
<p>Most teams have a rock-solid answer for their production databases — Data Guard, RAC, tested failover, quarterly drills. Ask the same team about their OMS and OMR, and the answer is usually "we back it up nightly" or, worse, silence. That's a gap. OEM isn't a nice-to-have dashboard. It's the system that pages your on-call team when a production database is in trouble, runs your patching workflows, and enforces your compliance standards. When it goes down, you don't just lose a UI — you lose visibility into everything it was watching, at exactly the moment you're least equipped to notice.</p>
<p>This post covers the reference topologies for making OEM 24ai itself highly available, the mechanics of adding a standby repository, and the failure modes that catch people who treat OEM HA as an afterthought.</p>
<h2>Why OEM HA Is a Different Problem Than Database HA</h2>
<p>An OMS is stateless-ish but not quite stateless — it holds a shared software library, in-flight job state, and an active console session layer. The OMR is a full Oracle database, so RAC and Data Guard apply directly. The Management Agents deployed across your estate are the resilient part almost by accident: they retry, buffer, and re-upload, so a short OMS outage doesn't lose monitoring data, it just delays it.</p>
<p>The design question isn't "can we make this resilient" — every component here is buildable with standard Oracle HA/DR patterns. The question is which combination of RTO and RPO your estate actually needs, because the complexity curve is steep once you move past a single OMS.</p>
<h2>Four Reference Topologies</h2>
<table>
<thead>
<tr>
<th>#</th>
<th>Topology</th>
<th>RTO</th>
<th>RPO</th>
<th>Complexity</th>
<th>When to use</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Single OMS / Single OMR</td>
<td>Hours</td>
<td>Last backup</td>
<td>Low</td>
<td>Lab, dev, under 500 targets</td>
</tr>
<tr>
<td>2</td>
<td>Multi-OMS HA / Single OMR</td>
<td>Minutes (OMS) / Hours (OMR)</td>
<td>Last backup</td>
<td>Medium</td>
<td>Most production estates</td>
</tr>
<tr>
<td>3</td>
<td>Multi-OMS HA + Standby OMR (Data Guard)</td>
<td>Minutes</td>
<td>Seconds (sync)</td>
<td>High</td>
<td>Regulated, mission-critical</td>
</tr>
<tr>
<td>4</td>
<td>Active/Active across regions</td>
<td>Seconds</td>
<td>Near-zero</td>
<td>Very high</td>
<td>Global 24/7 ops, rare</td>
</tr>
</tbody></table>
<p>For the vast majority of enterprise customers I work with, Topology 3 is the right landing spot. It's the point where the RTO/RPO numbers actually match what the business expects from "our monitoring platform," without dragging in the operational overhead of a full active/active design that almost nobody needs for a management tier.</p>
<p>If you're still on Topology 1, that's fine for a lab. If it's your production OMS, you're one hardware failure away from flying blind on your entire Oracle estate until someone restores from backup.</p>
<h2>Topology 2: Multi-OMS HA, in Practice</h2>
<p>This is the minimum bar for a production-grade OEM deployment. The pieces:</p>
<ul>
<li><p><strong>Two or more OMS nodes</strong> behind a Server Load Balancer</p>
</li>
<li><p><strong>Shared software library</strong> on NFS or DBFS — writable by every OMS node</p>
</li>
<li><p><strong>Single OMR</strong>, typically a 2-node RAC database</p>
</li>
</ul>
<p>The part that trips people up isn't the OMS nodes themselves — it's the load balancer configuration. The SLB has to terminate TLS, support sticky sessions for console traffic, and — this is the one that actually causes incidents — provide persistence on the Agent Upload channel.</p>
<p><strong>SLB ports that need to be load balanced correctly:</strong></p>
<table>
<thead>
<tr>
<th>Port</th>
<th>Purpose</th>
</tr>
</thead>
<tbody><tr>
<td>443</td>
<td>Console HTTPS</td>
</tr>
<tr>
<td>4903</td>
<td>Agent Upload</td>
</tr>
<tr>
<td>.......</td>
<td></td>
</tr>
</tbody></table>
<p>If Agent Upload isn't load balanced with proper persistence, agents don't fail over gracefully — they pile onto whichever OMS answered first, and you get a silent, uneven load skew that looks like a performance problem until someone traces it back to the SLB config. This is the single most common misconfiguration I see in multi-OMS deployments.</p>
<h2>Topology 3: Adding a Standby OMR with Data Guard</h2>
<p>Once the OMS tier is resilient, the repository is the remaining single point of failure. A backup-and-restore RTO measured in hours is not acceptable for most production OEM deployments — that's hours of no monitoring, no incident rules firing, no patching visibility, during whatever event took the OMR down in the first place.</p>
<p>Adding Data Guard closes that gap:</p>
<ul>
<li><p>Primary OMR at the production site, standby at the DR site</p>
</li>
<li><p><strong>Sync transport</strong> where the network supports it — aim for round-trip latency under 10ms</p>
</li>
<li><p><strong>Async transport</strong> for cross-continent DR pairs</p>
</li>
<li><p>The standby stays read-only. Do not point OMS at it during normal operations — that's a Data Guard misconfiguration waiting to cause split-brain-style confusion, not a valid load-balancing shortcut.</p>
</li>
</ul>
<h3>Switchover, at a High Level</h3>
<blockquote>
<p><strong>Note:</strong> EM CLI syntax below is representative. Exact parameter names vary by OEM version and job type. Always validate against your environment: <code>emcli help &lt;verb&gt;</code> and Oracle's official EM CLI reference.</p>
</blockquote>
<pre><code class="language-bash"># 1. Stop OMS on all nodes
emctl stop oms -all

# 2. Switch over the OMR (run from the standby side once it's ready)
# SQL*Plus / DGMGRL:
# ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

# 3. Update the OMS connect descriptor to point at the new primary
emctl config oms -store_repos_details \
  -repos_conndesc "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dr-omr-scan)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=EMREP_DR)))" \
  -repos_user sysman

# 4. Restart OMS
emctl start oms

# 5. Verify agent uploads are resuming
emctl status agent
emctl status oms -details
</code></pre>
<p>A well-rehearsed switchover is a 20-to-30-minute operation. The keyword is <em>rehearsed</em>. I've sat in more than one post-incident review where the DR runbook for OEM hadn't been touched in over a year, and step 4 referenced a hostname that had since changed. Rehearse the switchover at minimum twice a year — treat it exactly like you'd treat a database DR drill, because functionally, that's what it is.</p>
<h2>Agent Resilience Isn't Something You Build — It's Something You Configure Correctly</h2>
<p>Here's the good news: Management Agents don't need their own HA design. They're effectively stateless from a monitoring-continuity standpoint — if they can't reach an OMS, they buffer locally and retry, then catch up once connectivity returns. No monitoring data is lost during a short OMS interruption, only delayed.</p>
<p>What does need attention is <strong>agent failover across OMS nodes</strong>:</p>
<ul>
<li><p>Agents can be configured with a comma-separated list of OMS URLs, so a single agent knows about more than one management server</p>
</li>
<li><p>If you're using an SLB VIP as the single agent-facing URL, failover is automatic — the SLB handles routing, and the agent never needs to know a specific OMS node went down</p>
</li>
</ul>
<blockquote>
<p><strong>Note:</strong> EM CLI syntax below is representative. Exact parameter names vary by OEM version and verb type. Always validate against your environment: <code>emcli help &lt;verb&gt;</code> and Oracle's official EM CLI reference.</p>
</blockquote>
<pre><code class="language-bash"># Check which OMS URLs an agent currently knows about
emctl getemhome
emctl status agent | grep -i "OMS URL"

# Re-secure an agent against a new OMS/VIP after a DR cutover
emctl secure agent -emdWalletSrcUrl https://dr-oms-vip.example.com:4903/em
</code></pre>
<p>The pitfall shows up specifically at DR cutover, when the DR site uses a <em>different</em> VIP than production. If your DR runbook doesn't include a mass agent re-secure step, every agent in the estate silently stops reporting the moment you fail over — and nobody notices until someone asks why a target has been "green" for six hours with no data behind it. Where possible, use the same VIP DNS name across sites so cutover doesn't require touching every agent.</p>
<h2>The Anti-Patterns</h2>
<p><strong>Software library on local disk.</strong> Works fine for a single OMS. The moment you add a second OMS node, a local software library means only one node can actually run software-library-dependent jobs correctly. Validate shared storage before you validate anything else in a multi-OMS build.</p>
<p><strong>No SLB persistence on Agent Upload.</strong> Covered above, but worth repeating because it's the most common production issue: without it, you get a "thundering herd" onto one OMS during heartbeat cycles, and it presents as a mysterious performance problem instead of the load balancer misconfiguration it actually is.</p>
<p><strong>OMR backups without Data Guard.</strong> A backup strategy is not a DR strategy for a system whose entire job is real-time visibility. A 4-hour restore window is a long time to have zero eyes on a production Oracle estate.</p>
<p><strong>DR site with different OMS hostnames.</strong> This forces certificate and wallet rebuilds on cutover, on top of everything else you're already dealing with during a DR event. Standardize the VIP DNS name across sites during initial design, not during the incident.</p>
<p><strong>Skipping the bi-annual DR drill.</strong> Every runbook I've reviewed that hadn't been drilled in the last six months had at least one stale step. Not most — every one. The drill is what finds the stale step before a real event does.</p>
<h2>What Good Looks Like</h2>
<p>A well-architected OEM HA/DR setup looks boring, which is exactly the point. Two or more OMS nodes sit behind a properly configured SLB that load-balances console, agent upload, agent registration, and BI Publisher traffic correctly. The software library lives on shared storage every node can write to. The OMR runs as a 2-node RAC primary with a Data Guard standby at the DR site, sync or async depending on network distance. Agents are configured to fail over automatically through the SLB VIP, and the DR runbook — switchover steps, connect descriptor updates, mass agent re-secure if needed — has been rehearsed within the last six months, not just written once and filed away.</p>
<p>When someone asks "what happens if we lose the OMS," the answer is "nothing, the second node picks it up," not a long pause.</p>
<h2>The Bottom Line</h2>
<p>OEM watches your Oracle estate, which means OEM's own availability is a Tier 1 concern, not an operational nice-to-have. Multi-OMS HA behind a correctly configured load balancer is the production floor. Adding a Data Guard standby OMR gets you from a backup-restore RTO measured in hours to a switchover measured in minutes. None of the individual pieces are exotic — it's standard Oracle MAA thinking applied to the management tier instead of the application tier. The part that actually determines whether it works during a real event is whether you've rehearsed it.</p>
<hr />
<p><em>Next in this series: OEM 24ai Patch Management and Fleet Patching — how Gold Images and Database Lifecycle Management turn a 50-database patch cycle from a multi-week fire drill into a scheduled, repeatable operation.</em></p>
]]></content:encoded></item><item><title><![CDATA[OEM 24ai Compliance Standards and Security Frameworks: Continuous Assurance Across Your Oracle Estate]]></title><description><![CDATA[Oracle observability post #6 — the last post covered Monitoring Templates and how to stop configuration drift. This post focuses on compliance: using Enterprise Manager’s Compliance Management framewo]]></description><link>https://www.rajeshravi.com/oem-24ai-compliance-standards-and-security-frameworks-continuous-assurance-across-your-oracle-estate</link><guid isPermaLink="true">https://www.rajeshravi.com/oem-24ai-compliance-standards-and-security-frameworks-continuous-assurance-across-your-oracle-estate</guid><dc:creator><![CDATA[Rajesh Ravi]]></dc:creator><pubDate>Fri, 14 Aug 2026 02:39:59 GMT</pubDate><content:encoded><![CDATA[<p><em>Oracle observability post #6 — the last post covered Monitoring Templates and how to stop configuration drift. This post focuses on compliance: using Enterprise Manager’s Compliance Management framework to assess managed targets continuously against Oracle-provided and internal standards, then turning the results into remediation work.</em></p>
<hr />
<p>Most Oracle environments have a “we ran a security assessment once” problem. A hardening checklist is applied at provisioning time. An auditor samples controls annually. In between, parameters drift, accounts accumulate, and privileges expand — and nobody knows until the next review.</p>
<p>Oracle Enterprise Manager 24ai Compliance Management gives you a repeatable way to evaluate managed targets against defined configuration, security, storage, and operational standards. It does not make a database secure by itself, and it is not a substitute for a security assessment. What it does provide is continuous evidence: defined rules, target associations, evaluation results, and a documented exception process.</p>
<hr />
<h2>Start with the Compliance Library</h2>
<p>OEM ships with Oracle-provided compliance frameworks and standards for Oracle hardware and software. The exact content installed in your environment depends on the Enterprise Manager release updates and Self Update content you have applied, so treat the <strong>Compliance Library</strong> as the source of truth rather than assuming a particular benchmark or database release is present.</p>
<p>For database security work, common starting points include:</p>
<ul>
<li><strong>CIS Compliance Standards</strong> — self-update-enabled standards, with availability and supported database versions defined by the current Compliance Standards Reference.</li>
<li><strong>Security Technical Implementation Guide (STIG)</strong> standards — also delivered through the compliance content lifecycle; use the version that matches your database platform and release.</li>
<li><strong>Security Configuration for Oracle Database</strong> and other Oracle-provided standards — baseline configuration checks supplied with Enterprise Manager.</li>
<li><strong>Your internal standards</strong> — organization-specific requirements for parameters, auditing, privileged accounts, encryption, backup, and operational controls.</li>
</ul>
<p>Before associating a security standard, enable the required database security configuration metric collections. Oracle documents an Oracle Certified monitoring template for this purpose: <strong>Oracle Certified-Enable Database Security Configuration Metrics</strong>.</p>
<p>Two practical cautions:</p>
<ol>
<li>Do not claim CIS, STIG, GDPR, or any other framework coverage until you have verified the actual standard, version, and rules in your own Compliance Library.</li>
<li>A passed rule means the target met that rule as evaluated. It is not a blanket statement that the database is secure or compliant with a regulation.</li>
</ol>
<hr />
<h2>Associate a Standard and Evaluate It</h2>
<p>A compliance standard is associated with managed targets from <strong>Enterprise → Compliance → Library</strong>. Select the standard, click <strong>Associate Target</strong>, select the eligible targets, and save the association. The initial evaluation runs as a background job; results normally appear after the evaluation completes.</p>
<p>For a small number of targets, use the documented EM CLI verb. First identify the standard’s internal name, author, and version with emcli list_standards; Oracle-provided standards require those exact values.</p>
<pre><code class="language-bash">emcli associate_cs_targets   -name="&lt;standard_internal_name&gt;"   -version="&lt;standard_version&gt;"   -author="&lt;standard_author&gt;"   -target_list="PRODDB01"
</code></pre>
<p>You can include a group in the target list by appending :Group:</p>
<pre><code class="language-bash">emcli associate_cs_targets   -name="&lt;standard_internal_name&gt;"   -version="&lt;standard_version&gt;"   -author="&lt;standard_author&gt;"   -target_list="Production_DBs:Group"
</code></pre>
<p>For a large estate, group association is the useful operating model. When eligible new targets are added to an associated group and meet the target property filter, OEM can associate them automatically. This is a group-association capability — it is not the same thing as assuming every Administration Group will automatically apply a compliance standard.</p>
<hr />
<h2>Read the Results Correctly</h2>
<p>Console path: <strong>Enterprise → Compliance → Results</strong></p>
<p>OEM lets you view results by compliance framework, standard, and target. The Target Compliance view is especially useful for identifying the least-compliant targets across the standards currently associated with them.</p>
<p>The score is a computed result. It considers factors such as violations, rule severity, and the importance assigned to rules and folders in the standard. That means scores are most useful for trending the <em>same standard against a comparable population</em> — not for declaring that an 88% score on one standard is intrinsically better than an 82% score on another.</p>
<p>When reviewing results, prioritize:</p>
<ol>
<li>Violations with the highest security or operational impact.</li>
<li>New violations and unexpected changes in the score trend.</li>
<li>Evaluation errors — an error is not a pass and can leave you with an incomplete picture.</li>
<li>Rules marked manual, where the evidence and decision must be recorded outside an automated check.</li>
</ol>
<hr />
<h2>Remediation and Exceptions</h2>
<p>Each violation should lead to one of two outcomes:</p>
<p><strong>Remediate it.</strong> The rule details can include description, impact, recommendation, and corrective-action guidance. Corrective actions in OEM are scripts that fix a violation; they can be manual or automatic when configured through incident rules. Test every corrective action in a representative non-production environment before broad use.</p>
<p><strong>Document a time-bound exception.</strong> OEM’s documented mechanism is <strong>violation suppression</strong>, not a generic “waiver.” The suppression workflow records a reason and can include a suppress_until date. Use it only for an approved exception, and track the business owner, compensating control, review date, and expiration in your security governance process.</p>
<p>For automation, the documented EM CLI verb is:</p>
<pre><code class="language-bash">emcli suppress_compliance_rule_violations   -cs_iname="&lt;standard_internal_name&gt;"   -author="&lt;standard_author&gt;"   -version="&lt;standard_version&gt;"   -rule_iname="&lt;rule_internal_name&gt;"   -target_type="oracle_database"   -target_name="PRODDB01"   -suppress_until="12-31-2026"   -reason="Approved exception; compensating control documented"
</code></pre>
<p>A suppressed violation is still a signal that the rule failed. Suppression makes the risk decision explicit; it does not make the underlying control compliant.</p>
<hr />
<h2>Create Standards That Match Your Environment</h2>
<p>Oracle-provided standards are a useful baseline, but they will not represent every internal requirement. Create a user-defined standard when you need to continuously check requirements such as mandated initialization parameters, audit configuration, approved account patterns, or environment-specific configuration rules.</p>
<p>Console path: <strong>Enterprise → Compliance → Library → Compliance Standards → Create</strong></p>
<p>A standard applies to a single target type and can contain rules, rule folders, and included standards. OEM supports several rule types, including repository, agent-side, monitoring, configuration drift, configuration consistency, manual, and missing-patch rules. Choose the lightest rule type that can reliably collect the evidence you need.</p>
<p>For a quick starting point, use <strong>Create Like</strong> to copy an existing standard and then tailor it. In 24.1.0.3 and later, Oracle also documents an export/import path for enhancing eligible out-of-box CIS content. Do not directly edit an Oracle-provided standard in the library; preserve the vendor baseline and keep your variation clearly identified.</p>
<hr />
<h2>An Operating Model That Holds Up</h2>
<p>A practical production model is:</p>
<ul>
<li>Associate the relevant, verified standards with the right target population.</li>
<li>Review results on a defined cadence — monthly is a reasonable starting point; use a shorter cadence for high-change environments.</li>
<li>Triage new and material violations first.</li>
<li>Remediate, or record a time-bound approved exception with compensating controls.</li>
<li>Investigate score drops and evaluation errors promptly.</li>
<li>Reassess associations after Enterprise Manager release updates that change standards or rules; Oracle notes that re-association can be required for updated compliance content.</li>
</ul>
<p>The anti-pattern is running compliance only before an audit. The value is not a point-in-time score. It is the operating history: what was checked, what changed, what failed, who accepted an exception, and when it expires.</p>
<hr />
<h2>The Bottom Line</h2>
<p>Compliance Management in OEM 24ai turns configuration and security assurance into an operational process. It gives you a framework for Oracle-provided and internal standards, target-level evaluations, score and result analysis, and corrective-action or exception workflows.</p>
<p>Use it as evidence, not as a certification. Validate the standards installed in your environment, align them with your security team’s control objectives, and make the review-and-remediation cadence part of normal database operations.</p>
<hr />
<h3>References</h3>
<ul>
<li><a href="https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/24.1/emlcm/overview-compliance-management.html">Oracle Enterprise Manager 24ai — Overview of Compliance Management</a></li>
<li><a href="https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/24.1/emlcm/configure-compliance-management.html">Oracle Enterprise Manager 24ai — Configure Compliance Management</a></li>
<li><a href="https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/24.1/emcli/associate-cs-targets.html">EM CLI: associate_cs_targets</a></li>
<li><a href="https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/24.1/emcli/suppress-compliance-rule-violations.html">EM CLI: suppress_compliance_rule_violations</a></li>
</ul>
<p><em>Next in this series: OEM 24ai Jobs and Automation Framework — how to use OEM’s job system to automate routine DBA tasks, schedule maintenance operations across your estate, and build multi-step workflows that run without manual intervention.</em></p>
]]></content:encoded></item><item><title><![CDATA[OEM 24ai Metric Templates and Monitoring Profiles: Stop the Configuration Drift Before It Starts]]></title><description><![CDATA[*EM observability post #5 — the last post covered blackouts and maintenance windows. This one is about why your monitoring thresholds are probably inconsistent across your estate, and how Monitoring T]]></description><link>https://www.rajeshravi.com/oem-24ai-metric-templates-and-monitoring-profiles-stop-the-configuration-drift-before-it-starts</link><guid isPermaLink="true">https://www.rajeshravi.com/oem-24ai-metric-templates-and-monitoring-profiles-stop-the-configuration-drift-before-it-starts</guid><dc:creator><![CDATA[Rajesh Ravi]]></dc:creator><pubDate>Sat, 25 Jul 2026 01:00:40 GMT</pubDate><content:encoded><![CDATA[<p>*EM observability post #5 — the last post covered blackouts and maintenance windows. This one is about why your monitoring thresholds are probably inconsistent across your estate, and how Monitoring Templates fix that permanently.*</p>
<p>---</p>
<p>Here's what monitoring drift looks like in practice.</p>
<p>A DBA tunes the tablespace warning threshold on a production database from 85% to 90% because the application has a regular purge cycle and 85% generates weekly noise. Makes sense. Six months later, that DBA has tuned 12 databases the same way — all done manually through the OEM console, all slightly different because someone had a different idea of the right value on a different day. Meanwhile, 40 other databases still have the OEM default of 85%. And the three databases added last quarter? They have whatever was in the default profile, which nobody reviewed.</p>
<p>This is monitoring drift. And it shows up on every large Oracle estate I've worked with that doesn't have Monitoring Templates configured.</p>
<p>The problem isn't that people are making bad decisions about these thresholds. The problem is that there's no mechanism to make those decisions once and apply them everywhere.</p>
<p>---</p>
<p>## What Monitoring Templates Control</p>
<p>A Monitoring Template in OEM 24ai is a named collection of monitoring settings for a specific target type. It can define:</p>
<ul>
<li><p><strong>Warning and critical thresholds</strong> — numeric values or pattern matches, depending on the metric type</p>
</li>
<li><p><strong>Collection schedule</strong> — how frequently the metric is sampled</p>
</li>
<li><p><strong>Number of occurrences</strong> before an alert triggers — prevents single-sample spikes from generating incidents</p>
</li>
<li><p><strong>Corrective actions</strong> — automated responses when a threshold is crossed</p>
</li>
<li><p><strong>Template description</strong> — documentation for the standard and its intended scope</p>
</li>
</ul>
<p>When you apply a template, its metric settings are copied to the target. Be deliberate about the apply options: the default preserves thresholds for metrics that are not in the template; using <code>-replace_metrics=1</code> clears those thresholds and can stop alerting for them.</p>
<h2>Creating and Applying Templates (EM CLI)</h2>
<p>OEM 24ai supports template management through the console and EM CLI. For anything at scale — more than a handful of targets, or anything you'll repeat — EM CLI is the right path.</p>
<p>### Create from a tuned target, then export the template</p>
<p>To create a baseline from an already tuned target, use the Monitoring Template wizard and choose the option to copy that target's settings. Once the template exists, export it with EM CLI:</p>
<pre><code class="language-bash">emcli export_template \
-name="Prod_DB_Standard" \
-target_type="oracle_database" \
-output_file="/tmp/prod_db_standard.xml"
</code></pre>
<p>Use <code>-archive</code> instead when the template includes a Metric Extension.</p>
<h3>Apply a template to specific targets</h3>
<pre><code class="language-bash">emcli apply_template \
-name="Prod_DB_Standard" \
-targets="PRODDB01:oracle_database;PRODDB02:oracle_database;PRODDB03:oracle_database"
</code></pre>
<h3>Apply to all members of a group</h3>
<pre><code class="language-bash">emcli apply_template \
-name="Prod_DB_Standard" \
-targets="Production_DBs:composite"
</code></pre>
<p>This is where the leverage kicks in. A single command applies your standard configuration to every database in the group. When you update the template and reapply, every target gets the new values in one operation.</p>
<h3>Validate a target against its standard</h3>
<p>EM CLI provides <code>list_templates</code> to inventory templates, but it does not provide a <code>get_template_applied</code> verb. For a target-level check, use the console's <strong>Compare Monitoring Template</strong> workflow or inspect the affected metric settings and template-override flags. That shows whether the target is aligned with the intended standard and whether a documented exception is in effect.</p>
<h2>Administration Groups: Automatic Template Assignment</h2>
<p>Manual template application works. Administration Groups (AdGroups) make it automatic.</p>
<p>An AdGroup is a dynamic group that uses target-property criteria to enroll targets. When a target joins the group, OEM applies the monitoring templates in the group's associated <strong>template collection</strong>; synchronization can run on a schedule or be started on demand.</p>
<p>Membership criteria use supported target properties such as Lifecycle Status, Line of Business, Location, Target Type, Target Version, Contact, Cost Center, Department, and Customer Support Identifier. Use the hierarchy to model combinations and exceptions; Administration Group membership is mutually exclusive.</p>
<p><strong>Example AdGroup structure for a typical enterprise:</strong></p>
<table>
<thead>
<tr>
<th>AdGroup</th>
<th>Criteria</th>
<th>Template Applied</th>
</tr>
</thead>
<tbody><tr>
<td>Prod_DBs_AdGroup</td>
<td>Lifecycle = Production</td>
<td>Prod_DB_Standard</td>
</tr>
<tr>
<td>Stage_DBs_AdGroup</td>
<td>Lifecycle = Stage</td>
<td>Stage_DB_Standard</td>
</tr>
<tr>
<td>Dev_DBs_AdGroup</td>
<td>Lifecycle = Development</td>
<td>Dev_DB_Standard</td>
</tr>
</tbody></table>
<p>When a new production database is discovered and its Lifecycle Status is set to "Production," it joins the appropriate Administration Group and receives the template collection's monitoring settings at synchronization. The template collection can include a database template plus templates for other target types.</p>
<h3>Setting Up Administration Groups</h3>
<p>Administration Groups are configured from <strong>Setup -&gt; Add Target -&gt; Administration Groups</strong>.</p>
<p>Setup sequence:</p>
<ol>
<li><p>Create the Administration Group hierarchy and membership criteria</p>
</li>
<li><p>Create the monitoring templates</p>
</li>
<li><p>Create a template collection and add the required templates (one template per target type)</p>
</li>
<li><p>Associate the template collection with the applicable Administration Group</p>
</li>
<li><p>Synchronize the group or configure the synchronization schedule</p>
</li>
</ol>
<p>A target belongs to at most one Administration Group. Within the hierarchy, settings inherited from a higher level apply to lower levels; for duplicate metric settings, the lower-level template collection takes precedence.</p>
<h2>Exceptions and Precedence</h2>
<p>OEM does not use a universal four-tier priority stack for monitoring templates. A direct <code>apply_template</code> operation writes the selected template settings to its targets. In an Administration Group hierarchy, lower-level template-collection settings override inherited higher-level settings only where the same metric setting is defined.</p>
<p>For a documented target-specific exception, set the metric's <strong>Template Override</strong>. A metric marked as a template override is protected from subsequent template applies. Review those overrides regularly, because they are intentional exceptions to the standard.</p>
<h2>Separating Templates by Environment Tier</h2>
<p>One template for all environments is a common mistake. Dev and production should have meaningfully different configurations:</p>
<p>**Production template characteristics:**</p>
<p>- Tighter thresholds — alert sooner because degradation has user impact</p>
<p>- Shorter collection intervals on critical metrics (CPU, active sessions, availability)</p>
<p>- Corrective actions enabled (automated recovery is appropriate in production)</p>
<p>- Number of occurrences = 2-3 for volatile metrics to suppress transient spikes</p>
<p>**Development template characteristics:**</p>
<p>- Looser thresholds — developers expect heavy workloads during testing</p>
<p>- Longer collection intervals — less frequent sampling reduces agent overhead on shared dev infrastructure</p>
<p>- No automated corrective actions — a script that restarts a dev database will interrupt someone's active session</p>
<p>- Higher occurrence counts before alerting — less urgency for transient states</p>
<p>**Stage template:** closer to production thresholds (you want to catch real issues in staging), but no corrective actions that would interfere with planned test runs.</p>
<p>---</p>
<p>## Metric Extensions: When Built-in Metrics Aren't Enough</p>
<p>OEM 24ai ships with hundreds of built-in metrics for Oracle targets. For cases the built-in set doesn't cover, Metric Extensions let you define custom metrics.</p>
<p>Custom metric sources:</p>
<p>- **OS command** — run a shell script on the agent host, parse the output as metric values</p>
<p>- **SQL query** — query the Oracle database directly; the result set becomes the metric data</p>
<p>- **JMX** — pull from Java MBeans (for WebLogic and Java application targets)</p>
<p>Once created, a Metric Extension behaves exactly like any built-in metric — it can be included in a Monitoring Template, thresholded, and pushed across your estate.</p>
<p>Common use cases: checking for specific initialization parameters your team requires (e.g., `ARCHIVELOG` mode, `ENABLE_DDL_LOGGING`), monitoring application schema objects (queue depths, custom job status tables, application-specific row counts), verifying backup catalog state that OEM doesn't track natively.</p>
<p>Create in console: Enterprise -&gt; Monitoring -&gt; Metric Extensions -&gt; Create.</p>
<p>---</p>
<p>## The Anti-Patterns</p>
<p><strong>Relying on OEM default thresholds in production.</strong> Oracle-supplied defaults are recommended baselines, not a substitute for thresholds calibrated to your workload and service objectives. If normal operation regularly crosses a default threshold, tune it to the environment instead of masking the alerts with suppression rules.</p>
<p><strong>Applying templates manually without AdGroups.</strong> Every new target added to OEM becomes an exception to your standard. The longer you run without AdGroups, the more targets fall outside your standard configuration. Manual application is better than nothing; AdGroups are better than manual.</p>
<p><strong>One template for all environments.</strong> If dev, stage, and production share the same thresholds and collection intervals, you'll either over-alert in dev or under-alert in production. Separate templates per lifecycle tier are non-negotiable on a large estate.</p>
<p><strong>Setting "occurred 1 time" for volatile metrics.</strong> CPU, active sessions, redo generation, and similar metrics can spike transiently during normal operations. If your policy fires on a single sample, you'll generate incidents for events that resolve in the next collection cycle. Set occurrences to 2-3 for performance metrics.</p>
<p><strong>Not documenting threshold rationale.</strong> Six months later, nobody remembers why <code>Physical Reads</code> is set to 500K instead of the default. Record the reason in the template description and your operational runbook or change record. "Set to 90% per 2026-03 review — PURGE_JOB runs weekly and fills to 88% before clearing" is useful. "Updated" is not.</p>
<p><strong>Forgetting to synchronize after template updates.</strong> Editing a template changes the repository definition, not the target's active settings. Reapply a directly assigned template with <code>apply_template</code>. For Administration Groups, run synchronization on demand or confirm the configured synchronization schedule.</p>
<h2>What Good Looks Like</h2>
<p>In a well-configured estate, every target type has a template tuned by the team that understands what those metrics mean in that environment. Production, staging, and dev have separate templates. Administration Groups handle enrollment automatically.</p>
<p>When a DBA provisions a new database, registers it with OEM, and sets the appropriate target properties, it is enrolled automatically. When application behavior changes, update the template and synchronize the Administration Group—or reapply the template directly—to propagate the new setting.</p>
<p>Monitoring drift stops being a problem because there is no easy mechanism for it to accumulate. Individual overrides are documented and intentional. The default state for any target in OEM is "correctly configured," not "whatever the agent shipped with."</p>
<p>And when you're asked in an audit or incident review "what is the warning threshold for tablespace usage on production databases?" — the answer is in the template, documented, and consistent across every production database in the relevant Administration Group.</p>
<h2>The Bottom Line</h2>
<p>Monitoring Templates are the difference between a configuration that was set up once and slowly drifted, and one that's actively managed. The template is the source of truth. AdGroups make application automatic. Metric Extensions handle what the built-in set doesn't cover.</p>
<p>The investment is a few hours upfront for a typical estate. The return is years of consistent, trustworthy alerting — and the end of "why is this threshold different on this database" conversations during an incident.</p>
<p>Get the templates right, and the monitoring system becomes something the ops team can actually rely on.</p>
<p>---</p>
<p>*Next in this series: OEM 24ai Compliance Standards and Security Frameworks — how to use OEM's built-in compliance library to continuously assess your Oracle estate against CIS benchmarks, Oracle security baselines, and custom standards, and how to turn compliance scores into actionable remediation workflows.*</p>
<p>---</p>
]]></content:encoded></item><item><title><![CDATA[OEM 24ai Blackouts and Maintenance Windows: Stop the Alert Storm Before It Starts]]></title><description><![CDATA[Oracle observability post #4 — the last post covered incident rules and alert routing. This one is about what happens when you need to take systems down for maintenance and why skipping this step turn]]></description><link>https://www.rajeshravi.com/oem-24ai-blackouts-and-maintenance-windows-stop-the-alert-storm-before-it-starts</link><guid isPermaLink="true">https://www.rajeshravi.com/oem-24ai-blackouts-and-maintenance-windows-stop-the-alert-storm-before-it-starts</guid><dc:creator><![CDATA[Rajesh Ravi]]></dc:creator><pubDate>Sat, 04 Jul 2026 20:14:51 GMT</pubDate><content:encoded><![CDATA[<p><em>Oracle observability post #4 — the last post covered incident rules and alert routing. This one is about what happens when you need to take systems down for maintenance and why skipping this step turns every planned window into an unplanned incident.</em></p>
<hr />
<p>Here's a scenario I've walked into more than once.</p>
<p>A DBA team schedules a Saturday night patching window for a cluster of production databases. Work goes cleanly — patches applied, systems restarted, services confirmed up. Team wraps at midnight. Then the alerts start. Tablespace thresholds that were crossed during startup. Archive log space triggered during the redo application phase. Listener availability events from the restart sequence. By the time the on-call engineer processes the volume, it's 1am, and the team has spent 45 minutes triaging alerts that have already resolved themselves.</p>
<p>This is what a patching window without a configured blackout looks like. And it's the most common thing I clean up on day one of an OEM engagement.</p>
<p>Blackouts and maintenance windows aren't optional configuration. They're the difference between a monitoring system that the ops team trusts and one that they've learned to ignore.</p>
<hr />
<h2>The Two Types of Blackout: Make the Right Choice Before You Click</h2>
<p>The most important thing to understand before configuring anything is that OEM 24ai has two fundamentally different blackout types, and picking the wrong one causes exactly the kind of problem you're trying to avoid.</p>
<p><strong>Full Blackout</strong> — suspends everything. The OEM Agent stops collecting metrics entirely. No data flows to the OMS during the window. No events are generated. No incidents open. No notifications fire. When the blackout ends, metric collection resumes, but any threshold crossings that happened during the window are permanently gone — not retroactively evaluated, not queued. The slate is clean.</p>
<p>Use Full Blackout when: the target is genuinely offline (hardware replacement, OS-level maintenance, network isolation), or you're performing work that would generate meaningless metric noise regardless — firmware updates, storage migrations, full system rebuilds. The key signal is that you don't need to know what happened to the system during the window.</p>
<p><strong>Notification Blackout</strong> — keeps the OEM Agent running and collecting metrics. Threshold crossings generate events. Events promote to incidents in Incident Manager. But notifications don't fire. The data is all there; it just doesn't ring anyone's phone.</p>
<p>Use Notification Blackout when: you're performing in-place maintenance (patching, configuration changes, rolling restarts) where you still want visibility into what the system is doing, but you don't want to page the on-call for transient states that are expected during the work. You want the audit trail; you don't want the noise.</p>
<hr />
<h2>Notification Blackout Subtypes: The SLA Detail That Trips People Up</h2>
<p>Within Notification Blackout, there's a second decision that has compliance implications.</p>
<p><strong>Maintenance type</strong> (<code>-notification_only</code> without <code>-is_sla_required</code>) — the blackout window is explicitly excluded from OEM's availability calculations. Your system's uptime percentage doesn't take a hit for a planned maintenance window. This is correct for scheduled patching, planned upgrades, and any work on the maintenance calendar.</p>
<p><strong>Notification-only type</strong> (<code>-notification_only -is_sla_required</code>) — the window is <em>not</em> excluded from availability calculations. OEM still computes downtime against SLA during this period. This is the right choice for unplanned situations where the system is degraded but you need to suppress alert noise while the team works — because that downtime <em>should</em> count against your availability metrics.</p>
<p>The default behavior most teams get wrong: they use Maintenance type for everything, including unplanned outages. Their availability reports look cleaner than reality. That's a reporting integrity issue.</p>
<hr />
<h2>EM CLI: The Right Way to Configure Blackouts</h2>
<p>The OEM Console blackout wizard works, but EM CLI is what you want for anything you'll run more than once. It's repeatable, scriptable, and auditable.</p>
<h3>Basic Notification Blackout (the most common case)</h3>
<pre><code class="language-bash">emcli create_blackout \
  -name="Sat_Patch_Window" \
  -targets="PRODDB01:oracle_database,PRODDB02:oracle_database" \
  -notification_only \
  -schedule="startTime:2026-06-21 22:00;duration:04:00;tzinfo:US/Central"
</code></pre>
<p>This creates a 4-hour Notification Blackout (Maintenance type) for two specific database targets starting Saturday night at 22:00 Central. Metric collection stays live; no pages fire during the window.</p>
<h3>Full Blackout for Hardware Maintenance</h3>
<pre><code class="language-bash">emcli create_blackout \
  -name="Storage_Migration_BK" \
  -targets="DBHOST01:host" \
  -schedule="startTime:2026-06-28 06:00;duration:08:00;tzinfo:US/Central"
</code></pre>
<p>Host-level target with Full Blackout. All targets managed by the agent on that host are automatically suspended.</p>
<h3>Group Blackout with Target Type Exclusions</h3>
<p>When you're patching a large group but need to exclude certain target types:</p>
<pre><code class="language-bash">emcli create_blackout \
  -name="Prod_Group_Patch" \
  -targets="Production_DBs:group" \
  -propagate_targets \
  -exclude_types="oracle_dbsys,weblogic_domain" \
  -notification_only \
  -schedule="startTime:2026-07-05 21:00;duration:06:00;tzinfo:US/Central"
</code></pre>
<p><code>-propagate_targets</code> expands the group to all member targets. <code>-exclude_types</code> lets you carve out specific target types — in this case, Oracle DB systems and WebLogic domains stay unblacked while individual database instances go quiet. Useful when patching the DB tier without touching middleware targets in the same group.</p>
<h3>Recurring Scheduled Blackout</h3>
<p>Weekly recurring maintenance window for a regular batch job that generates predictable alert noise:</p>
<pre><code class="language-bash">emcli create_blackout \
  -name="Weekly_Batch_Window" \
  -targets="BATCHDB01:oracle_database" \
  -notification_only \
  -schedule="frequency:weekly;startTime:2026-06-22 23:00;duration:2:00;days:7;tzinfo:US/Central"
</code></pre>
<p><code>days:7</code> = Sunday. Once configured, this runs without intervention. This is the pattern I recommend for any batch-heavy database that generates load and metric spikes on a predictable schedule.</p>
<h3>Stopping a Blackout Early</h3>
<p>Maintenance finished ahead of schedule — stop it immediately rather than letting the window run out:</p>
<pre><code class="language-bash">emcli stop_blackout -name="Sat_Patch_Window"
</code></pre>
<p>Resume monitoring immediately. Don't let a 4-hour blackout continue 90 minutes after the work is done.</p>
<h3>Auditing Blackouts</h3>
<pre><code class="language-bash">emcli list_blackouts -format="name:pretty"
</code></pre>
<p>This shows all active and scheduled blackouts. Run this before any incident response to quickly rule out "the target is in a blackout" as the reason alerts aren't firing.</p>
<hr />
<h2>emctl: Agent-Side Blackout for Simple Cases</h2>
<p>For situations where you need a quick blackout without OMS access — or when you're scripting something at the agent level — <code>emctl</code> provides the agent-side interface.</p>
<pre><code class="language-bash"># Blackout specific targets for 2 hours 30 minutes
emctl start blackout BK_PATCH PRODDB01 PRODDB02 -d 02:30

# Blackout all targets on the host (node-level)
emctl start blackout BK_HOST_MAINT -nodeLevel -d 04:00

# Stop a named blackout
emctl stop blackout BK_PATCH

# Check current blackout status on the agent
emctl status blackout
</code></pre>
<p>One important constraint: <strong>emctl always allows EM jobs to run during a blackout.</strong> If you need to block EM jobs from executing on a target during the maintenance window, you must use the Console or EM CLI — not <code>emctl</code>. Job blocking is configured at the OMS level, not the agent level.</p>
<p>Also note: emctl blackouts can only target the targets managed by that specific agent. For cross-host or group-level blackouts, use EM CLI from the OMS.</p>
<hr />
<h2>Privilege Requirements: Who Can Configure Blackouts</h2>
<p>This trips up teams that have multiple DBAs with different OEM privilege levels.</p>
<p>Creating a blackout on a target requires the <strong>"Create Blackout"</strong> privilege on that target (or the group containing it). This is a named target privilege in OEM, not just a generic role.</p>
<p>Operators with the default "Operator" role can <em>view</em> blackout status but cannot create or stop blackouts on targets they don't explicitly have the privilege for. If your DBAs are reporting that they can't create blackouts on new targets, this is almost always the cause.</p>
<pre><code class="language-bash"># Check who has Blackout Target privilege on a specific target
emcli list_target_privileges -target_name="PRODDB01" -target_type="oracle_database"
</code></pre>
<p>Assign via: <strong>Setup → Security → Administrators</strong> → select user → <strong>Target Privileges</strong> → <strong>Create Blackout</strong>.</p>
<hr />
<h2>ZDT Monitoring: Keeping the OMS Itself Running During Maintenance</h2>
<p>Blackouts address target-side maintenance. There's a different problem on the OMS side: what happens to monitoring when <em>OEM itself</em> needs to be patched?</p>
<p>OEM 24ai introduces <strong>Zero Downtime Monitoring (ZDT)</strong>. When you apply a Release Update to the OMS using the Zero Downtime Patching framework, OEM continues monitoring, alerting, and sending notifications throughout the patching process. The OMS stays operational during the update — no monitoring gap, no blackout needed for the management plane.</p>
<p>ZDT Monitoring replaces the older Always-On Monitoring (AOM) feature from previous releases. If you're still running EM 13.5 or earlier and using AOM during OMR upgrades, this is the EM 24ai equivalent — and it's significantly more capable. AOM required separate setup and had limitations on notification coverage. ZDT is built into the patching workflow.</p>
<p>This matters practically: in EM 24ai, you should no longer need to choose between "patch OEM" and "monitor your production estate." The two can happen simultaneously with proper planning.</p>
<hr />
<h2>The Anti-Patterns (What Causes the 2am Alert Storm)</h2>
<p><strong>No blackout configured for maintenance windows.</strong> The most common failure mode. Work happens, systems restart, transient threshold crossings fire as incidents, on-call gets paged for events that are already resolving. Always create the blackout <em>before</em> starting work, not during it.</p>
<p><strong>Using Full Blackout when Notification Blackout is appropriate.</strong> If you take a Full Blackout for a rolling database patch, you lose metric history during the window. If something actually went wrong — a parameter change caused an issue, a tablespace got miscalculated — you have no data. Notification Blackout gives you the data; you just suppress the pages.</p>
<p><strong>Forgetting to stop the blackout when work finishes early.</strong> A 6-hour blackout window with work done at hour 2 means 4 hours of unmonitored production. Build a checklist step: "stop blackout" before signing off on the maintenance window.</p>
<p><strong>Group blackouts without exclusions.</strong> Blacking out an entire group when you're only patching one target type. If your Production_DBs group contains Oracle databases <em>and</em> WebLogic targets, a full group blackout silences everything. Use <code>-exclude_types</code> to be precise.</p>
<p><strong>Using Maintenance type for unplanned downtime.</strong> If a system goes down unexpectedly and you create a Notification Blackout to suppress the noise while you troubleshoot — that's valid. But use <code>-is_sla_required</code> so the downtime counts against availability. Don't hide an unplanned outage inside what looks like a maintenance window in your reports.</p>
<p><strong>No recurring blackout for predictable noise.</strong> If there's a batch job that runs every Sunday at midnight and spikes CPU and I/O, that generates weekly alert noise. Configure a recurring Notification Blackout for that window. The team should know about it the first time. After that, it shouldn't interrupt anyone.</p>
<hr />
<h2>What Good Looks Like</h2>
<p>When blackout configuration is right, here's the experience:</p>
<p>The maintenance window gets created via <code>emcli create_blackout</code> as part of the change ticket workflow — not as an afterthought five minutes before the work starts. The notification blackout means the DBA team can see in Incident Manager what the system was doing during the window, but no pages fire for expected behavior.</p>
<p>When the window closes or the blackout is stopped early, monitoring resumes cleanly. Any genuine issues that arose — not just transient restart states — generate incidents normally. The difference between "tablespace at 91% because we ran a purge job and it's collecting itself" and "archive log destination actually full and the DB is going read-only" is visible, because the metrics were collected the whole time.</p>
<p>The <code>list_blackouts</code> command is part of every on-call runbook. First thing you check when a target isn't alerting as expected.</p>
<p>And the OEM 24ai ZDT Monitoring means that when the OMS itself gets patched on a quarterly basis, your production monitoring doesn't have a gap. No scramble to set up AOM. No temporary monitoring blind spot while the management plane is updated.</p>
<hr />
<h2>The Bottom Line</h2>
<p>Full Blackout and Notification Blackout serve different purposes. Getting that choice wrong is the difference between a clean maintenance window and either missing real issues (wrong direction) or drowning in false alerts (other direction).</p>
<p>The decision tree is simple: if the system is genuinely offline and you don't need the metric data, use Full Blackout. If you're doing in-place maintenance and want visibility but not noise, use Notification Blackout with Maintenance type. If the downtime is unplanned and you're suppressing while you respond, use Notification Blackout with <code>-is_sla_required</code>.</p>
<p>Configure recurring blackouts for predictable noise sources. Use EM CLI for anything you'll run more than once. Stop the blackout when the work is done.</p>
<p>Alert fatigue and trust in the monitoring system are directly correlated. Every unnecessary 2am page trains the ops team to start ignoring the ones that matter.</p>
<hr />
<p><em>Next in this series: OEM 24ai Metrics, Templates and Monitoring Framework — how to standardize what you monitor across a large Oracle estate, push threshold changes to thousands of targets in minutes, and avoid the drift that turns a well-tuned monitoring setup into an inconsistent mess over time.</em></p>
<hr />
]]></content:encoded></item><item><title><![CDATA[OEM 24ai Incident Rules: Why Your Alerts Are Firing at the Wrong People]]></title><description><![CDATA[Oracle observability post #3 — the last post covered connecting OEM 24ai to OCI Observability services. This one is about what happens when something actually goes wrong and why most OEM deployments r]]></description><link>https://www.rajeshravi.com/oem-24ai-incident-rules-why-your-alerts-are-firing-at-the-wrong-people</link><guid isPermaLink="true">https://www.rajeshravi.com/oem-24ai-incident-rules-why-your-alerts-are-firing-at-the-wrong-people</guid><dc:creator><![CDATA[Rajesh Ravi]]></dc:creator><pubDate>Fri, 19 Jun 2026 22:43:50 GMT</pubDate><content:encoded><![CDATA[<p><em>Oracle observability post #3 — the last post covered connecting OEM 24ai to OCI Observability services. This one is about what happens when something actually goes wrong and why most OEM deployments route that signal badly.</em></p>
<hr />
<p>There's a pattern I see at almost every customer site after a fresh OEM 24ai deployment.</p>
<p>The monitoring is working. Metrics are being collected. Thresholds are set. But six months in, the DBAs have started ignoring the alert emails — because there are too many, half of them don't apply to the person receiving them, and the format tells you something fired but not what to actually do about it.</p>
<p>That's not a monitoring problem. That's an incident rules problem.</p>
<p>Getting an alert is useless if the wrong person gets it, at the wrong time, in the wrong format, with no context about severity. This post is about getting that right in OEM 24ai — the rule set architecture, the common failure patterns I see in the field, and how to connect OEM's notification pipeline into the broader ops toolchain, including OCI Notifications for hybrid environments.</p>
<hr />
<h2>The OEM Incident Pipeline: What Actually Happens</h2>
<p>Before you touch a rule set, you need to understand how OEM moves from a raw metric value to a page on someone's phone. There are four stages:</p>
<p><strong>Metric</strong> → raw data collected by the OEM Agent on the target. CPU utilization, tablespace usage, active sessions, etc. Collected on a polling interval, stored in the OMS.</p>
<p><strong>Event</strong> → a metric threshold crossing. When CPU utilization exceeds your configured warning or critical threshold, OEM generates an event. Events are also generated by target availability changes, compliance violations, and EM jobs. <strong>Incident</strong> → a grouping of related events, managed through Incident Manager. By default OEM creates one incident per event, but you can configure rules to correlate multiple events into a single incident. This is how you avoid 47 separate incidents when an Exadata cell node goes offline and cascades.</p>
<p><strong>Notification</strong> → an action triggered by an incident rule. Email, SNMP trap, PagerDuty webhook, OCI Notifications endpoint, or an EM CLI script. This is the step where routing decisions are made.</p>
<p>The rule set layer sits between incident creation and notification. Rules evaluate: <em>For this incident, at this severity, on this target type — who gets told, how, and what do they see?</em></p>
<hr />
<h2>Rule Sets vs. Rules: The Container Model</h2>
<p>In OEM 24ai, notification routing is controlled by <strong>Incident Rule Sets</strong>. The hierarchy is:</p>
<ul>
<li><p><strong>Rule Set</strong> — a container with an ordered list of rules, evaluated top-to-bottom. Rule sets are assigned to a scope: all targets, a specific group, or a named target list.</p>
</li>
<li><p><strong>Rule</strong> — an individual condition + action pair. "For Severity 1 and 2 incidents on targets in the Production-DBs group, send email to <a href="mailto:dba-oncall@company.com">dba-oncall@company.com</a> and create a PagerDuty incident."</p>
</li>
<li><p><strong>Action</strong> — what happens when the rule matches. Email, SNMP, custom script, OCI endpoint.</p>
</li>
</ul>
<p>The key thing to understand: <strong>rule evaluation stops at the first matching rule within a rule set.</strong> Order matters. If your generic "send all alerts to dba-team" rule is first, your targeted routing rules below it will never fire.</p>
<hr />
<h2>What Ships Out of the Box (and Why It's Not Enough)</h2>
<p>OEM 24ai ships with two out-of-box (System Generated) enterprise rule sets, visible under Setup → Incidents → Incident Rules. Note that these Oracle-supplied rule sets cannot be exported or imported via EM CLI. They are:</p>
<p><strong>Incident management rule set for all targets</strong> — the main system-generated set, scoped to all targets. It bundles roughly twenty rules that create, compress, and clear incidents for events like target-down and agent-unreachable, high-availability events, critical metric alerts, compliance violations, and SLA alerts. Its job is to create and manage incidents in Incident Manager — none of these default rules sends email or any other notification on its own.</p>
<p><strong>A metric-alert rule set</strong> — fires email notifications for all Warning and Critical metric alerts. Default recipient: whatever email address was configured during OMS installation. The second one is the source of most of the alert fatigue I see. It sends everything, to one address, at all hours. Within a few months in a real environment — dozens of targets, hundreds of monitored metrics — that mailbox is noise. DBAs stop reading it.</p>
<p>The fix is to replace the default routing with rule sets that are built around how your team actually works.</p>
<hr />
<h2>Building Rule Sets That Work</h2>
<p>Here's the model I use with enterprise customers. Three rule sets, ordered by specificity:</p>
<h3>Rule Set 1: Production Critical (Severity 1–2)</h3>
<p><strong>Scope:</strong> A named group containing your production Oracle databases, RAC clusters, and Exadata targets.</p>
<p><strong>Rules inside:</strong></p>
<ol>
<li><p>Severity 1 incidents → immediate email + PagerDuty → DBA on-call rotation + database manager</p>
</li>
<li><p>Severity 2 incidents → email → DBA team distribution list, business hours only (06:00–22:00 on weekdays)</p>
</li>
<li><p>All target availability Down events → immediate email + SMS → DBA on-call, any hour</p>
</li>
</ol>
<p><strong>Key configuration detail:</strong> Set <strong>Notification Repeat Interval</strong> for Severity 1 to every 30 minutes until acknowledged. OEM supports this natively — set it in the Advanced section of the notification action. Without it, you get one email when the incident opens and silence afterward.</p>
<h3>Rule Set 2: Non-Production and Dev/Test (Severity 1–3)</h3>
<p><strong>Scope:</strong> Non-prod target group.</p>
<p><strong>Rules inside:</strong></p>
<ol>
<li><p>Severity 1 incidents only → email → DBA team DL, business hours only</p>
</li>
<li><p>Severity 2–3 incidents → email daily digest to team lead (not to individuals)</p>
</li>
</ol>
<p>Non-prod environments don't need paging. A daily digest is enough visibility without generating noise that erodes trust in the alerting system.</p>
<h3>Rule Set 3: Catch-All (Severity 4–5 / Everything Else)</h3>
<p><strong>Scope:</strong> All targets.</p>
<p><strong>Rules inside:</strong></p>
<ol>
<li><p>All Severity 4–5 incidents → log to Incident Manager only, no notification</p>
</li>
<li><p>All unmatched incidents → email to monitoring team alias, low priority flag</p>
</li>
</ol>
<p>Severity 4–5 in OEM are advisory. They should be reviewed periodically, not interrupt anyone's workflow.</p>
<p><strong>Path:</strong> Setup → Incidents → Incident Rules → Create Rule Set</p>
<hr />
<h2>Notification Templates: Stop Sending Raw Alerts</h2>
<p>Default OEM email notifications look like this:</p>
<pre><code class="language-plaintext">Target: PRODDB01
Metric: CPU Utilization
Value: 94.3
Threshold: 90
</code></pre>
<p>That tells you <em>what</em> fired. It doesn't tell you whether this is normal weekend batch behavior, whether this same alert fired last Tuesday, or what the on-call engineer should look at first.</p>
<p>OEM 24ai supports custom notification message templates. Use them.</p>
<p><strong>Path:</strong> Setup → Notifications → Notification Methods → Manage Notification Methods → OS Command or Email → Edit Message Template</p>
<p>A better template includes:</p>
<ul>
<li><p>Target name and type</p>
</li>
<li><p>Metric name, current value, threshold breached</p>
</li>
<li><p>Severity level</p>
</li>
<li><p>Time of event</p>
</li>
<li><p>Direct link to the incident in Incident Manager (via the URL substitution variables available in OEM notification templates)</p>
</li>
<li><p>Last 3 occurrences of this metric alert on the same target (query from EM CLI)</p>
</li>
</ul>
<p>The last point requires a small wrapper script — but a message that says "this is the 4th time this week" changes how urgently an on-call DBA responds versus "CPU was high one time."</p>
<hr />
<h2>Escalation Rules: What Happens When No One Responds</h2>
<p>OEM supports <strong>escalation rules</strong> within a rule set. An escalation rule fires when an incident has been open (or acknowledged but unresolved) for a defined time window.</p>
<p>Common pattern:</p>
<ul>
<li><p>Severity 1 incident not acknowledged within 15 minutes → escalate to DBA manager</p>
</li>
<li><p>Severity 1 incident acknowledged but not resolved within 2 hours → escalate to database team lead + incident bridge</p>
</li>
</ul>
<p>Configure this under the rule's <strong>Actions → Add Escalation</strong> section. The escalation target is a separate notification method, so you can route initial alerts to individuals and escalations to a group.</p>
<p>This is the piece most teams skip — and it's the piece that matters at 2am when the primary on-call is unavailable.</p>
<hr />
<h2>EM CLI: Audit and Manage Rules Programmatically</h2>
<p>If you're managing more than one OMS or handing rule sets across environments, EM CLI is the right approach. You don't want to manually replicate a 15-rule set through the console.</p>
<p>Note: EM CLI has no verb that lists incident rules. You review rule sets in the console under Setup → Incidents → Incident Rules. To capture a rule set's full definition for review or backup, export it to XML:</p>
<pre><code class="language-bash">emcli export_incident_rule_set -rule_set_name="Production Critical" -rule_set_owner=sysman -export_file="/tmp/"
</code></pre>
<p>Import the rule set into another OMS (for multi-OMS HA environments):</p>
<pre><code class="language-bash">emcli import_incident_rule_set -import_file="/tmp/Production_Critical.xml" -alt_rule_set_name="Production Critical"
</code></pre>
<p>This is especially useful in OEM 24ai HA environments where you run multiple OMS nodes behind a load balancer. Rule sets replicate through the OMR, but having version-controlled exports in a git repo means you can always roll back a bad rule change without hunting through Incident Manager history.</p>
<hr />
<h2>Connecting OEM to the Broader Notification Stack</h2>
<p>For teams running hybrid environments — which, as I covered in the last post, is most Oracle shops today — OEM's notification pipeline needs to connect to the same tools the rest of the ops team uses. The DBA team might live in OEM and email. The cloud ops team is in Slack and PagerDuty. Leadership wants a dashboard, not an inbox.</p>
<p>Three patterns I've seen work well:</p>
<p><strong>Pattern 1: OEM → SNMP → PagerDuty</strong> OEM has native SNMP trap support. PagerDuty's generic webhook integration can receive SNMP traps via a bridge like OpsGenie's SNMP integration or a lightweight snmptrapd → HTTP relay. Lower latency than email, works without custom code. <strong>Pattern 2: OEM → EM CLI Custom Notification → OCI Notifications</strong> Set up a custom OS command notification that calls a Python script. That script POSTs the incident payload to an OCI Notifications topic via the OCI SDK. From there, the topic fans out to Slack, PagerDuty, email — whatever your cloud ops team uses. I covered the OEM REST API endpoint for this in the last post:</p>
<pre><code class="language-plaintext">https://&lt;OMS_HOST&gt;:&lt;OMS_PORT&gt;/em/api/v1/incidents   # verify the exact host, port, and path for your OMS install
</code></pre>
<p>The same endpoint works in reverse — your notification script can pull full incident details and include them in the payload, not just the sparse EM notification defaults.</p>
<p><strong>Pattern 3: OCI Notifications as the Single Alerting Plane</strong> If you've already set up OCI Monitoring alarms (as described in Step 4 of the last post), consider routing OEM Severity 1–2 notifications <em>and</em> OCI Monitoring alarms to the same OCI Notifications topic. One topic, one subscriber list, one PagerDuty service. Your on-call doesn't need to know whether the alert originated from OEM or OCI — they need to know something's broken and where to look.</p>
<p>This pattern requires some discipline: you need to deduplicate. If both OEM and OCI Monitoring are watching CPU on the same host and both alert, you get double pages. Split the responsibility by layer — OEM monitors Oracle process-level metrics, OCI Monitoring handles host-level infrastructure metrics. Don't overlap.</p>
<hr />
<h2>The Anti-Patterns (What I Fix First at New Customer Sites)</h2>
<p><strong>Alert on everything = alert on nothing.</strong> When the DBA team has 200 unread alert emails, the one that matters gets missed. Start by auditing which alerts have fired more than 50 times in the last 30 days. If it's that frequent, it's either a false positive or a chronic issue that needs a fix, not a repeated notification.</p>
<p><strong>No severity segmentation.</strong> Warning and Critical going to the same mailbox, at the same priority, with the same notification format. If an on-call can't distinguish a "hey watch this" from a "wake up now," the severity system is broken. <strong>No escalation path.</strong> A single point of contact for Severity 1 alerts with no escalation rule is a production risk. People travel, phones die, PagerDuty apps get removed. If your monitoring system has no fallback when the primary path fails, you've created a single point of failure in your incident response.</p>
<p><strong>Notification bloat on test environments.</strong> Non-prod alerts drowning prod alerts in the same inbox is one of the most common problems I fix on day one of an engagement. Separate rule sets, separate distribution lists, or at minimum separate email subjects that let filters do the work.</p>
<p><strong>No blackouts configured.</strong> Maintenance windows with no blackout = alert storms at 2am. Post #4 will cover OEM blackout configuration in detail — because this is its own topic worth getting right.</p>
<hr />
<h2>What Good Looks Like</h2>
<p>When OEM 24ai's incident routing is working correctly, here's the experience:</p>
<ul>
<li><p>Severity 1 fires → the right on-call engineer gets paged within 60 seconds, with enough context (target, metric, value, link to Incident Manager) to act immediately</p>
</li>
<li><p>Severity 2 fires → the DBA team distribution list gets an email during business hours, formatted with enough detail to triage without opening OEM first</p>
</li>
<li><p>Non-prod fires → a daily digest review, not individual notifications</p>
</li>
<li><p>A 15-minute silence from the paged engineer → the manager gets a follow-up automatically</p>
</li>
<li><p>Post-incident → Incident Manager has a full audit trail, linked to the original metric event, with timestamps for acknowledgment and resolution</p>
</li>
</ul>
<p>That's not a complex setup. It's around three rule sets, a handful of rules each, and a couple of notification methods — scale that up or down to fit your environment. The complexity isn't in the implementation — it's in taking the time to think through how your specific team works before clicking through the console.</p>
<hr />
<h2>The Bottom Line</h2>
<p>OEM 24ai's monitoring is only as effective as its notification routing. An alert that goes to the wrong person, arrives with no context, or gets buried in noise from lower-severity events might as well not exist.</p>
<p>Start with a rule set audit: review your rule sets in the console (Setup → Incidents → Incident Rules), exporting them with export_incident_rule_set if you want a full offline copy, and map what you have against what your team actually receives and responds to. In most environments I've seen, there's a significant gap between what OEM is configured to send and what the ops team treats as actionable.</p>
<p>Fix the routing first. The rest of the observability work in this series depends on people trusting that when OEM fires, it means something real.</p>
<hr />
<p><em>Next in this series: OEM 24ai Blackouts and Maintenance Windows — how to suppress alerts during planned maintenance without creating monitoring blind spots or drowning your team when the window ends.</em></p>
]]></content:encoded></item><item><title><![CDATA[OEM 24ai and OCI Observability Services: Stop Choosing. Start Connecting.]]></title><description><![CDATA[Oracle observability post #2 — picking up from where we left off on the configuration gaps most teams miss after an OEM 24ai install.

There's a debate that comes up in almost every Oracle architectur]]></description><link>https://www.rajeshravi.com/oem-24ai-and-oci-observability-services-stop-choosing-start-connecting</link><guid isPermaLink="true">https://www.rajeshravi.com/oem-24ai-and-oci-observability-services-stop-choosing-start-connecting</guid><category><![CDATA[Oracle]]></category><category><![CDATA[Oracle Cloud]]></category><category><![CDATA[Oracle Database]]></category><category><![CDATA[Oraclecloudinfrastructure]]></category><dc:creator><![CDATA[Rajesh Ravi]]></dc:creator><pubDate>Sun, 07 Jun 2026 16:49:20 GMT</pubDate><content:encoded><![CDATA[<p><em>Oracle observability post #2 — picking up from where we left off on the configuration gaps most teams miss after an OEM 24ai install.</em></p>
<hr />
<p>There's a debate that comes up in almost every Oracle architecture conversation I have these days.</p>
<p>"Should we use OEM or OCI for monitoring?"</p>
<p>The short answer: both. The right answer: they're not doing the same job.</p>
<blockquote>
<p><strong>A quick note on OCI Stack Monitoring:</strong> If you've been using OCI Stack Monitoring, you need to know it's officially deprecated with End of Life on January 23, 2027. Oracle's guidance is to migrate to OCI Monitoring (infrastructure metrics), OCI Logging Analytics (log correlation), and OCI Database Management (DB fleet performance) before that date. This post is written against the current OCI Observability stack — the tools you should be building on right now.</p>
</blockquote>
<p>Treating OEM 24ai and the OCI Observability suite as alternatives is like choosing between a hospital and an ambulance. One is purpose-built for a specific, deep function. The other gets you connected to a broader system. You need both, and you need them talking to each other.</p>
<p>After 17 years of Oracle deployments — from pure on-prem Oracle estates to hybrid cloud migrations and full OCI lifts — this is one of the architectural decisions I've seen teams get wrong most consistently. And the cost shows up later: blind spots in production, duplicate alerting, and two disconnected dashboards that no one trusts.</p>
<p>Let's fix that.</p>
<hr />
<h2>What OEM 24ai Actually Does Well</h2>
<p>Oracle Enterprise Manager 24ai is a deep-stack tool. Its core strength is native Oracle target management at a level nothing else matches.</p>
<p><strong>Where OEM is irreplaceable:</strong></p>
<ul>
<li><p><strong>Oracle Database internals</strong> — AWR, ASH, SQL monitoring, blocking sessions, undo usage, buffer cache hit ratios. OEM reads internal Oracle metrics that no third-party tool can access without significant custom work.</p>
</li>
<li><p><strong>Lifecycle management</strong> — Patching, provisioning, compliance standards, gold image management. This is not monitoring, it's <em>management</em>. OCI doesn't do this.</p>
</li>
<li><p><strong>EM Jobs</strong> — Scheduled scripts, backup jobs, RMAN management, DB cloning. These are operational workflows, not just observability.</p>
</li>
<li><p><strong>Exadata and RAC</strong> — Cell server metrics, smart scan offload efficiency, InfiniBand/RoCE interconnect health, ASM disk group monitoring. OEM 24ai has native Exadata awareness no other product can replicate.</p>
</li>
<li><p><strong>Target hierarchy</strong> — OEM's concept of a monitoring hierarchy (RAC → Instance → PDB → Service) with inheritance and override is sophisticated. You can apply a single metric template to 5,000 targets and push threshold changes in minutes.</p>
</li>
<li><p><strong>EM CLI + REST API</strong> — Automation-first. You can script everything: target discovery, job execution, template application, incident management.</p>
</li>
</ul>
<p>If you're running Oracle Database on-prem or on Oracle Cloud Infrastructure Dedicated Infrastructure, OEM 24ai is the right primary tool for that layer. Full stop.</p>
<hr />
<h2>What OCI Observability Services Do That OEM Can't</h2>
<p>The OCI Observability and Management suite was designed to answer a different question: <em>How does your full application stack look from the cloud?</em></p>
<p>The suite covers four distinct functions, each a separate service:</p>
<p><strong>OCI Monitoring</strong> handles infrastructure-level telemetry — host CPU, memory, disk, network — through the Management Agent. It's where you create alarms, set thresholds, and wire notifications to PagerDuty, Slack, or OCI Functions. For OCI Compute instances, coverage is near-instant after agent deployment.</p>
<p><strong>OCI Logging Analytics</strong> handles log ingestion, parsing, and correlation at scale. If your Oracle Database alert logs, listener logs, OS syslogs, and application logs need to be correlated into a single query surface — this is where that happens. The ML-based anomaly detection finds patterns in log data that threshold-based monitoring misses entirely.</p>
<p><strong>OCI Database Management</strong> covers Oracle Database fleet performance from the cloud plane. SQL performance analytics, wait event analysis, AWR data aggregation across multiple databases, and space management — all accessible without needing OEM Console access. For your cloud ops team, this eliminates the need for OEM credentials to diagnose a DB performance issue.</p>
<p><strong>OCI Ops Insights</strong> handles capacity analytics and long-range SQL trend analysis. It answers questions like "which databases will run out of tablespace in 90 days" or "which SQL statement has degraded most in the last 30 days across our fleet." This is planning intelligence that OEM generates per-target but doesn't aggregate across the estate the way Ops Insights does.</p>
<p>The key point: none of these services are trying to replace OEM. They're giving you observability <em>above</em> the database layer and <em>around</em> the cloud boundary that OEM was never designed to cover.</p>
<hr />
<h2>The Architecture That Actually Works</h2>
<p>Here's how I recommend structuring this for a hybrid Oracle environment — which is 90% of what customers are running today:</p>
<pre><code class="language-plaintext">On-Premises                              OCI
─────────────────────────────────────    ────────────────────────────────────
Oracle DB (19c/21c/23ai)                 Oracle DB@Azure / ExaCS / BaseDB
  └── OEM 24ai Agent                       └── OCI Management Agent
        │                                        │
        ▼                                        ▼
    OEM OMS ───────────────────────────► OCI Monitoring
    (OMR on Data Guard)                  (Infrastructure alarms + notifications)
        │                                        │
        ▼                                        ▼
    EM CLI / REST API                    OCI Database Management
                                         (Fleet SQL analytics + wait events)
                                                 │
                                                 ▼
                                         OCI Logging Analytics
                                         (Log correlation + ML anomaly detection)
                                                 │
                                                 ▼
                                         OCI Ops Insights
                                         (Capacity planning + SQL trends)
</code></pre>
<p>The bridge is the <strong>OCI Management Agent</strong> running on your on-prem Oracle hosts. Once deployed, it streams host metrics into OCI Monitoring and enables Database Management's external database feature for on-prem Oracle DBs — giving you cloud-plane visibility into databases that live on-premises.</p>
<hr />
<h2>The Decision Table: Which Tool Monitors What</h2>
<table>
<thead>
<tr>
<th>Use Case</th>
<th>OEM 24ai</th>
<th>OCI Observability Suite</th>
</tr>
</thead>
<tbody><tr>
<td>Oracle Database AWR/ASH</td>
<td>✅ Primary</td>
<td>✅ Database Management</td>
</tr>
<tr>
<td>DB patching and compliance</td>
<td>✅ Primary</td>
<td>❌</td>
</tr>
<tr>
<td>Exadata cell server metrics</td>
<td>✅ Primary</td>
<td>⚠️ Limited</td>
</tr>
<tr>
<td>RAC and Data Guard monitoring</td>
<td>✅ Primary</td>
<td>✅ Database Management</td>
</tr>
<tr>
<td>Host infrastructure metrics</td>
<td>✅ Agent-based</td>
<td>✅ OCI Monitoring (primary for OCI)</td>
</tr>
<tr>
<td>OCI-native alerting (Notifications, Events)</td>
<td>❌</td>
<td>✅ OCI Monitoring</td>
</tr>
<tr>
<td>Log ingestion and correlation</td>
<td>⚠️ EM Log viewer only</td>
<td>✅ Logging Analytics (primary)</td>
</tr>
<tr>
<td>ML-based log anomaly detection</td>
<td>❌</td>
<td>✅ Logging Analytics</td>
</tr>
<tr>
<td>SQL performance analytics at scale</td>
<td>✅ SQL Monitor</td>
<td>✅ Ops Insights + DB Management</td>
</tr>
<tr>
<td>Capacity planning across cloud+on-prem</td>
<td>⚠️ Limited</td>
<td>✅ Ops Insights (primary)</td>
</tr>
<tr>
<td>Third-party targets (Apache, MySQL, Nginx)</td>
<td>❌</td>
<td>✅ OCI Monitoring (custom metrics)</td>
</tr>
<tr>
<td>Custom dashboards in OCI Console</td>
<td>❌</td>
<td>✅ All four services</td>
</tr>
<tr>
<td>Fleet-wide SQL trend analysis</td>
<td>❌</td>
<td>✅ Ops Insights</td>
</tr>
</tbody></table>
<p>The pattern is clear: OEM owns the Oracle stack deeply. The OCI Observability suite owns breadth, log intelligence, fleet analytics, and cloud-native alerting.</p>
<hr />
<h2>Step-by-Step: Connecting Your On-Prem Oracle Targets to OCI Observability</h2>
<p>Here's the practical path to get both tools working together. These steps assume you already have OEM 24ai running on-prem.</p>
<h3>Step 1: Deploy the OCI Management Agent on Your Oracle Hosts</h3>
<p>The Management Agent is distinct from the OEM Agent. It runs alongside it without conflict.</p>
<ol>
<li><p>Download the Management Agent from OCI Console → Observability &amp; Management → Management Agents</p>
</li>
<li><p>Deploy to your Oracle DB hosts (requires JDK 8u261+ or JDK 11)</p>
</li>
<li><p>Agent key: each agent registers against an Agent Install Key you generate in OCI — scope this to a compartment that mirrors your on-prem environment</p>
</li>
</ol>
<pre><code class="language-bash"># Example install on Oracle Linux
chmod +x oracle.mgmt_agent-&lt;version&gt;.rpm
sudo rpm -ivh oracle.mgmt_agent-&lt;version&gt;.rpm
sudo /opt/oracle/mgmt_agent/bin/setup.sh -f /tmp/input.rsp
</code></pre>
<p>The <code>input.rsp</code> file contains your agent install key and compartment OCID. Scope to the correct compartment — don't use root compartment for production.</p>
<h3>Step 2: Enable OCI Database Management for On-Prem Databases</h3>
<p>With the Management Agent running, you can connect your on-prem Oracle databases to OCI Database Management as "external databases."</p>
<ol>
<li><p>OCI Console → Observability &amp; Management → Database Management</p>
</li>
<li><p><strong>Create External Database</strong> → Provide connection details and credentials</p>
</li>
<li><p>Use a read-only monitoring user — <code>dbsnmp</code> or a custom low-privilege role</p>
</li>
<li><p>Assign the compartment that aligns with your on-prem environment segmentation</p>
</li>
</ol>
<p>Once connected, Database Management gives your cloud ops team AWR summaries, top SQL, wait event analysis, and space trends — without OEM Console access.</p>
<h3>Step 3: Set Up OCI Logging Analytics for Oracle Log Ingestion</h3>
<p>This is the step most teams skip. Don't.</p>
<ol>
<li><p>OCI Console → Observability &amp; Management → Logging Analytics → Log Sources</p>
</li>
<li><p>Enable the pre-built Oracle log parsers: <strong>Oracle Database Alert Log</strong>, <strong>Oracle Listener Log</strong>, <strong>Oracle Audit Log</strong></p>
</li>
<li><p>Configure log collection via the Management Agent's log collection plugin — edit <code>/etc/oracle/mgmt_agent/conf/emd.properties</code> to include log paths</p>
</li>
<li><p>In Logging Analytics, create a <strong>Log Group</strong> per environment (prod, non-prod) and assign retention policies</p>
</li>
</ol>
<p>Within 24 hours you'll have correlated log views across your DB tier that would take days to build manually.</p>
<h3>Step 4: Align OCI Monitoring Alarms with Your OEM Baselines</h3>
<p>This is where most teams skip and regret it later. If OEM already has tuned metric thresholds, align your OCI Monitoring alarms to the same values. Mismatched thresholds = duplicate noise.</p>
<p>In OCI Monitoring: <strong>Alarms → Create Alarm</strong> → reference the same threshold values you've set in OEM metric templates.</p>
<p>For the same metric (e.g., CPU utilization on the DB host), pick one alerting path:</p>
<ul>
<li><p><strong>OEM</strong> → incidents for the Oracle DBA team</p>
</li>
<li><p><strong>OCI Monitoring</strong> → OCI Notifications → ops/cloud team via PagerDuty, Slack, or email</p>
</li>
</ul>
<p>Split by audience, not by metric.</p>
<h3>Step 5: Push OEM Incident Data to OCI (Optional but High Value)</h3>
<p>If you want a single pane across both environments, use the <strong>OEM REST API</strong> to forward incident data to OCI Events or a custom endpoint.</p>
<p>OEM 24ai exposes the Incident Manager API at:</p>
<pre><code class="language-plaintext">https://&lt;OMS_HOST&gt;:7803/em/api/incidents
</code></pre>
<p>A simple poller (Python, cron, or OCI Functions) can sync open OEM incidents into an OCI Notifications stream. This isn't a native integration today — it's a custom bridge — but I've implemented it at several enterprise customers and it's worth the 2-day effort. The payoff is one unified incident view for leadership that doesn't require toggling between tools.</p>
<hr />
<h2>What You Get When It's Connected</h2>
<p>When OEM 24ai and the OCI Observability suite are both running and your data is bridged, here's what actually changes:</p>
<p><strong>For your DBA team:</strong> Nothing changes. OEM is still their primary tool. Same workflows, same console, same EM CLI scripts.</p>
<p><strong>For your cloud ops team:</strong> They get Oracle DB health in OCI Console via Database Management — without needing OEM access. Less friction, fewer permissions headaches.</p>
<p><strong>For security and compliance:</strong> Logging Analytics ingesting Oracle audit logs gives you a queryable, correlated audit trail across the full estate. No more ad-hoc log file archaeology.</p>
<p><strong>For your leadership:</strong> One dashboard showing full-stack health — from Exadata cells to OCI Compute. No more "which screen shows the real status?"</p>
<p><strong>For incident response:</strong> When your application degrades, Logging Analytics' correlation view shows you whether the issue is a DB wait event, a listener failure, or an OS-level resource constraint — in one query, not three separate tools.</p>
<hr />
<h2>The Bottom Line</h2>
<p>OEM 24ai is the best Oracle database monitoring tool that exists. Nothing comes close for deep Oracle internals, lifecycle management, and Exadata coverage.</p>
<p>The OCI Observability suite — Monitoring, Logging Analytics, Database Management, Ops Insights — is the best stack for infrastructure telemetry, log intelligence, fleet analytics, and cloud-native alerting integration.</p>
<p>If you've been running OCI Stack Monitoring, start planning your migration now. EOL is January 23, 2027, which sounds far away until you're mid-fiscal-year trying to retrofit monitoring architecture in production.</p>
<p>The teams that try to pick one tool end up with gaps. The teams that connect OEM with the full OCI Observability stack end up with the kind of visibility that actually lets you sleep at night.</p>
<p>Start with the Management Agent deployment. It's the lightest-weight step and it unlocks everything else.</p>
<hr />
<p><em>Next in this series: Setting up proper incident rules and notification routing in OEM 24ai — because getting an alert is useless if the wrong person gets it at the wrong time in the wrong format.</em></p>
]]></content:encoded></item><item><title><![CDATA[Your Enterprise Manager 24ai Is Installed. Your Oracle Stack Is Still Flying Blind!]]></title><description><![CDATA[After two decades and 250+ enterprise implementations, here's the uncomfortable truth about how most Oracle teams monitor their environments — and what it's actually costing them.

Let me tell you wha]]></description><link>https://www.rajeshravi.com/your-enterprise-manager-24ai-is-installed-your-oracle-stack-is-still-flying-blind</link><guid isPermaLink="true">https://www.rajeshravi.com/your-enterprise-manager-24ai-is-installed-your-oracle-stack-is-still-flying-blind</guid><category><![CDATA[Oracle]]></category><category><![CDATA[monitoring]]></category><category><![CDATA[observability]]></category><category><![CDATA[AI]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[OCI]]></category><category><![CDATA[multi-cloud]]></category><category><![CDATA[#enterprise manager]]></category><dc:creator><![CDATA[Rajesh Ravi]]></dc:creator><pubDate>Fri, 29 May 2026 20:02:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a19a646ab3131ee6a234d7c/d1a5379f-d870-46d9-aa5a-4fcdbf1efc8f.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>After two decades and 250+ enterprise implementations, here's the uncomfortable truth about how most Oracle teams monitor their environments — and what it's actually costing them.</em></p>
<hr />
<p>Let me tell you what I see on almost every other new engagement.</p>
<p>The customer has Oracle Enterprise Manager deployed. Agents are running. The OMS is up. Someone spent real money and real time getting it installed with HA /DR with all other goodies and management packs. And then they show me their alert inbox — hundreds of unacknowledged notifications, thresholds set to defaults from 2016, and a war room that only opens when a database goes down.</p>
<p>That's not monitoring. That's expensive log and metric collection with an alert button.</p>
<p>I've seen this pattern at Fortune 500 banks, global telcos, manufacturing giants, and government agencies across 250+ implementations over 20 years. The tooling is there. The practice isn't. And the gap between those two things is where outages live.</p>
<p>That gap has a name. And closing it is exactly what this blog is about.</p>
<hr />
<h2>Reactive Monitoring Is a Trap — And Most Oracle Shops Are deep In It</h2>
<p>Here's how most Oracle monitoring programs actually work in practice:</p>
<ol>
<li><p>A database slows down or crashes</p>
</li>
<li><p>An alert fires (or a user calls the helpdesk first)</p>
</li>
<li><p>The DBA opens Enterprise Manager, looks at ASH/AWR, finds the cause</p>
</li>
<li><p>The issue gets fixed</p>
</li>
<li><p>Repeat</p>
</li>
</ol>
<p>This is reactive monitoring. It's the industry default. And on the surface it seems fine — you have visibility, you respond to problems, you fix them faster than you used to.</p>
<p>The problem is what you <em>don't</em> see.</p>
<p>You don't see the tablespace that's been growing at 8% per week for three months — until it hits 95% at 2am on a Sunday. You don't see the Redo Log contention building steadily as transaction volume grows. You don't see the Data Guard transport lag creeping up during a network maintenance window until replication is 4 hours behind.</p>
<p>By the time your alert fires, the damage window is already open. You're not preventing incidents. You're reacting to them.</p>
<p><strong>Reacting faster is not the same as observing smarter.</strong> That distinction is everything.</p>
<hr />
<h2>The Journey: From Reactive to AI-Driven Multicloud Observability</h2>
<p>This is the transformation I've been driving for two decades — and the theme that runs through everything I'll write here:</p>
<blockquote>
<p><strong>Elevating reactive monitoring into AI-driven Multicloud Observability.</strong></p>
</blockquote>
<p>It's not a slogan. It's a journey with four distinct stages, and most Oracle shops are stuck at stage one.</p>
<p><strong>Stage 1 — Reactive:</strong> Alerts fire after something breaks. The team responds. Rinse, repeat. Enterprise Manager is installed but used as a post-mortem tool.</p>
<p><strong>Stage 2 — Proactive:</strong> Trends are tracked, not just thresholds. Adaptive baselines replace static defaults. The team <em>anticipates</em> failures before users feel them. Enterprise Manager starts working the way it was designed.</p>
<p><strong>Stage 3 — Intelligent:</strong> OCI Observability — Operations Insights, Logging Analytics, Stack Monitoring — adds machine learning to the picture. Anomaly detection catches the signals humans miss. Capacity planning runs ahead of the resource curve. Correlation rules connect infrastructure events before they cascade into incidents.</p>
<p><strong>Stage 4 — AI-driven Multicloud:</strong> The full Oracle estate — on-premises, OCI, Oracle Database@Azure, OD@AWS, OD@GCP — is observed through a unified, intelligent fabric. AI surfaces recommendations. Automation resolves known patterns without human intervention. The team shifts from firefighting to strategy.</p>
<p>Most enterprises I work with are at Stage 1, with aspirations toward Stage 2. The ones pulling ahead of the pack are building toward Stage 4. The distance between those two positions is becoming a competitive differentiator.</p>
<hr />
<h2>What Proactive Actually Looks Like in Practice</h2>
<p>Proactive observability isn't a product feature. It's an operating model shift.</p>
<p>It means your monitoring environment knows what "normal" looks like for <em>your</em> specific workload — not what Oracle's default thresholds say is normal for some hypothetical system. A 90% buffer cache hit ratio might be a crisis on one database and completely expected on another. Context is everything.</p>
<p>It means tracking trends, not just thresholds. Is this metric trending up? At what rate? When does it cross a line based on historical patterns — not a static number someone typed in during initial setup?</p>
<p>It means your alerting has signal-to-noise discipline. The on-call DBA should receive <em>fewer</em> alerts, not more — but every alert they receive should mean something. An inbox with 300 unacknowledged warnings isn't visibility. It's noise that trains people to ignore monitoring.</p>
<p>In Enterprise Manager 24ai terms: Metric Extensions with corrective actions, Adaptive Thresholds trained on your actual baselines, proactive health check Jobs, and Compliance Standards that flag drift before it becomes a problem.</p>
<p>In OCI Observability terms: Operations Insights Capacity Planning running ahead of your resource curve, Stack Monitoring with custom metric namespaces for your application tier, and Logging Analytics correlation rules that connect infrastructure signals before they cascade into outages.</p>
<p>The tools exist at every stage of the journey. The question is whether anyone has wired them up — and whether the team has the operating model to use them.</p>
<hr />
<h2>The Multicloud Layer Changes Everything</h2>
<p>If your Oracle estate is purely on-premises, the reactive trap is difficult enough to escape. If you're running Oracle Database@Azure, OD@AWS, or Oracle on GCP alongside your on-prem footprint — and most large enterprises are — the problem compounds.</p>
<p>Now you have multiple telemetry streams with different APIs, different latency characteristics, different alert formats, and no unified view of how a workload running split across clouds is actually performing end-to-end. Enterprise Manager agents see one slice. The hyperscaler's native tools see another. OCI Observability sees a third. Nobody has the full picture.</p>
<p>This is the gap at the frontier of the journey I described above. Closing it — building a coherent, intelligent monitoring fabric that spans the entire Oracle estate regardless of where it runs — is the hardest and most valuable thing an Oracle operations team can do right now.</p>
<p>It's also exactly where AI starts earning its keep. Not the AI of marketing decks. The AI of anomaly detection that actually learns your workload patterns, of capacity models that factor in multi-region traffic shifts, of automated remediation that handles known failure modes without waking anyone up at 3am.</p>
<p>That's Stage 4. That's the destination.</p>
<hr />
<h2>Why I'm Writing This</h2>
<p>I've spent nearly 20 years at Oracle as a Senior Technical Architect — implementing, upgrading, and optimizing Enterprise Manager and OCI Observability &amp; Management for 250+ customers across every major industry and every major cloud. I've seen what works, what doesn't, and what the documentation or articles never tells you.</p>
<p>Most of what I know lives in workshop slide decks, customer calls, and implementation runbooks that never see the light of day. That stops now.</p>
<p>Every week I'll publish deep dives on Enterprise Manager 24ai architecture, OCI Observability service patterns, multicloud monitoring design, and real-world implementation cases. Version-specific, technically honest, practitioner-first. No marketing fluff. No generic "best practices" that work in demos but fall apart in production.</p>
<p>The journey from reactive to AI-driven Multicloud Observability is real, achievable, and worth taking. I've walked it with 250 plus organizations. Now I'm documenting the path.</p>
<p><strong>Follow along. The first technical deep dive drops next week.</strong></p>
<hr />
<img src="https://cdn.hashnode.com/uploads/covers/6a19a646ab3131ee6a234d7c/4f7b2bdc-5208-4f2e-8083-4635dc189b5e.png" alt="" style="display:block;margin:0 auto" />

<p><em>Rajesh Ravi is a Senior level Technical Architect at Oracle, based in Chicago. Over two decades he has implemented Enterprise Manager and OCI Observability &amp; Management for hundreds of enterprise customers worldwide — elevating reactive monitoring into AI-driven Multicloud Observability. He writes weekly at</em> <a href="https://www.rajeshravi.com"><em>rajeshravi.com</em></a><em>.</em></p>
]]></content:encoded></item></channel></rss>