<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vinnicius Andrade</title>
    <description>The latest articles on DEV Community by Vinnicius Andrade (@vinnicius_andrade_a0d86e4).</description>
    <link>https://dev.to/vinnicius_andrade_a0d86e4</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1682860%2F78e05e9f-7dc6-416d-810a-74fd1fab34c6.png</url>
      <title>DEV Community: Vinnicius Andrade</title>
      <link>https://dev.to/vinnicius_andrade_a0d86e4</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vinnicius_andrade_a0d86e4"/>
    <language>en</language>
    <item>
      <title>Custom OpenTelemetry Collector for Oracle WebLogic: Bringing Observability to Enterprise Java</title>
      <dc:creator>Vinnicius Andrade</dc:creator>
      <pubDate>Sat, 09 May 2026 17:22:29 +0000</pubDate>
      <link>https://dev.to/vinnicius_andrade_a0d86e4/custom-opentelemetry-collector-for-oracle-weblogic-bringing-observability-to-enterprise-java-1d98</link>
      <guid>https://dev.to/vinnicius_andrade_a0d86e4/custom-opentelemetry-collector-for-oracle-weblogic-bringing-observability-to-enterprise-java-1d98</guid>
      <description>&lt;p&gt;Oracle WebLogic Server powers countless enterprise Java systems. But getting observability out of it has always meant juggling multiple tools, agents, and dashboards with no way to correlate signals across applications and infrastructure.&lt;/p&gt;

&lt;p&gt;I recently worked on standardizing observability across heterogeneous enterprise architectures at Banco do Brasil — from mainframe COBOL to cloud-native systems to on-premises WebLogic. The goal was simple: one semantic convention, one backend, one view of an entire transaction.&lt;/p&gt;

&lt;p&gt;This post walks through building a custom, minimal OpenTelemetry Collector for WebLogic that makes this possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/vinnicius/weblogic-opentelemetry" rel="noopener noreferrer"&gt;github.com/vinnicius/weblogic-opentelemetry&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application (OTel Java Agent)  ──┐
Host (CPU/memory/disk)         ──┼──→  otelcol-weblogic  ──→  Your Backend
WebLogic logs (domain files)   ──┤     (OTLP only)         (Tempo, Loki,
JVM metrics (via JMX)          ──┘                          Jaeger, etc.)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A single container that ingests four signal types and exports unified OTLP.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why a Custom Collector?
&lt;/h2&gt;

&lt;p&gt;The standard OpenTelemetry Collector ships with 80+ components. For WebLogic environments, you typically need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;otlpreceiver&lt;/code&gt; (OTLP gRPC/HTTP ingress)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;filelogreceiver&lt;/code&gt; (tail log files)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hostmetricsreceiver&lt;/code&gt; (CPU, memory, network)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jmxreceiver&lt;/code&gt; (JVM metrics)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;batchprocessor&lt;/code&gt;, &lt;code&gt;memorylimiterprocessor&lt;/code&gt;, and &lt;code&gt;resourcedetectionprocessor&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;otlpexporter&lt;/code&gt; (send to backend)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else is dead weight. The solution: use &lt;a href="https://github.com/open-telemetry/opentelemetry-collector/tree/main/cmd/builder" rel="noopener noreferrer"&gt;OCB (OpenTelemetry Collector Builder)&lt;/a&gt; to compile a minimal binary containing only what you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The philosophy:&lt;/strong&gt; The collector is a &lt;em&gt;base distribution&lt;/em&gt; with the essentials. If you need Prometheus scraping for another app, add &lt;code&gt;prometheusreceiver&lt;/code&gt; to the OCB config and recompile. Want Kafka export? Add &lt;code&gt;kafkaexporter&lt;/code&gt;. Need mTLS? Add extensions. Your large organization compiles its own variant without bloat or dependency conflicts.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Build Config
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# collector/builder-config.yaml&lt;/span&gt;
&lt;span class="na"&gt;dist&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;otelcol-weblogic&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Custom&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;OpenTelemetry&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Collector&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Oracle&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;WebLogic&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Server"&lt;/span&gt;
  &lt;span class="na"&gt;otelcol_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.120.0"&lt;/span&gt;
  &lt;span class="na"&gt;output_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./dist&lt;/span&gt;

&lt;span class="na"&gt;receivers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gomod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go.opentelemetry.io/collector/receiver/otlpreceiver v0.120.0&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gomod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.com/open-telemetry/opentelemetry-collector-contrib/receiver/filelogreceiver v0.120.0&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gomod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver v0.120.0&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gomod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver v0.120.0&lt;/span&gt;

&lt;span class="na"&gt;processors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gomod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go.opentelemetry.io/collector/processor/batchprocessor v0.120.0&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gomod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.120.0&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gomod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.120.0&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gomod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.120.0&lt;/span&gt;

&lt;span class="na"&gt;exporters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gomod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go.opentelemetry.io/collector/exporter/otlpexporter v0.120.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;ocb --config=builder-config.yaml&lt;/code&gt; and you get a static Go binary with only these components.&lt;/p&gt;




&lt;h2&gt;
  
  
  Signal Pipelines
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Application Traces and Metrics
&lt;/h3&gt;

&lt;p&gt;The OTel Java Agent auto-instruments WebLogic applications with zero code changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# $DOMAIN_HOME/bin/setUserOverrides.sh&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;JAVA_OPTIONS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JAVA_OPTIONS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  -javaagent:/opt/opentelemetry/opentelemetry-javaagent.jar &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  -Dotel.service.name=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SERVER_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  -Dotel.exporter.otlp.endpoint=http://otelcol:4318 &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  -Dotel.exporter.otlp.protocol=http/protobuf &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  -Dotel.resource.attributes=weblogic.domain=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOMAIN_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  -Dotel.logs.exporter=otlp &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  -Dotel.metrics.exporter=otlp &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  -Dotel.traces.exporter=otlp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent automatically captures HTTP requests, JDBC queries, JMS operations, EJB calls, JVM metrics, and application logs.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;${SERVER_NAME}&lt;/code&gt; resolves at startup — each server gets its own &lt;code&gt;service.name&lt;/code&gt; without per-server configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  WebLogic Logs
&lt;/h3&gt;

&lt;p&gt;WebLogic logs are recognizable by the &lt;code&gt;####&lt;/code&gt; prefix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;####&amp;lt;May 7, 2026 10:00:00,000 AM UTC&amp;gt; &amp;lt;Info&amp;gt; &amp;lt;WebLogicServer&amp;gt; &amp;lt;host&amp;gt; &amp;lt;AdminServer&amp;gt; &amp;lt;main&amp;gt; &amp;lt;&amp;gt; &amp;lt;&amp;gt; &amp;lt;&amp;gt; &amp;lt;BEA-000360&amp;gt; &amp;lt;Server started&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parse them with regex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;filelog/weblogic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/u01/oracle/user_projects/domains/${env:WLS_DOMAIN_NAME}/servers/*/logs/*.log&lt;/span&gt;
  &lt;span class="na"&gt;start_at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;end&lt;/span&gt;
  &lt;span class="na"&gt;multiline&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;line_start_pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;^####'&lt;/span&gt;
  &lt;span class="na"&gt;operators&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;regex_parser&lt;/span&gt;
      &lt;span class="na"&gt;regex&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;^####&amp;lt;(?P&amp;lt;timestamp&amp;gt;[^&amp;gt;]+)&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;(?P&amp;lt;severity&amp;gt;[^&amp;gt;]+)&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;(?P&amp;lt;subsystem&amp;gt;[^&amp;gt;]+)&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;(?P&amp;lt;machine&amp;gt;[^&amp;gt;]+)&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;(?P&amp;lt;server&amp;gt;[^&amp;gt;]+)&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;(?P&amp;lt;thread&amp;gt;[^&amp;gt;]+)&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;[^&amp;gt;]*&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;[^&amp;gt;]*&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;[^&amp;gt;]*&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;(?P&amp;lt;msgid&amp;gt;[^&amp;gt;]*)&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;(?P&amp;lt;message&amp;gt;.+)&amp;gt;'&lt;/span&gt;
      &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;parse_from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;attributes.timestamp&lt;/span&gt;
        &lt;span class="na"&gt;layout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Jan&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2006&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;3:04:05,000&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;PM&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;MST'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logs become structured OTLP records with severity, subsystem, server, and message ID.&lt;/p&gt;

&lt;h3&gt;
  
  
  JVM and Host Metrics
&lt;/h3&gt;

&lt;p&gt;Collect JVM metrics via standard RMI/JMX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jmx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;jar_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/opentelemetry-jmx-metrics.jar&lt;/span&gt;
  &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service:jmx:rmi:///jndi/rmi://weblogic:9999/jmxrmi"&lt;/span&gt;
  &lt;span class="na"&gt;target_system&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jvm&lt;/span&gt;
  &lt;span class="na"&gt;collection_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And host metrics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;hostmetrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;collection_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;
  &lt;span class="na"&gt;scrapers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
    &lt;span class="na"&gt;disk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
    &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Integration Tests with Real WebLogic
&lt;/h2&gt;

&lt;p&gt;The project includes genuine integration tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make test-integration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compiles the collector via OCB&lt;/li&gt;
&lt;li&gt;Starts a real WebLogic 14.1.1 container with OTel Java Agent&lt;/li&gt;
&lt;li&gt;Deploys a test application&lt;/li&gt;
&lt;li&gt;Waits for readiness&lt;/li&gt;
&lt;li&gt;Fires HTTP requests&lt;/li&gt;
&lt;li&gt;Parses the collector's output and asserts traces, metrics, and logs are present&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No mocks. Real JMX, real log files, real OTLP spans. The test result: &lt;strong&gt;4 passed, 0 failed&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Extending the Collector
&lt;/h2&gt;

&lt;p&gt;This is the beauty of the approach. Suppose you also need Prometheus metrics from another application:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Edit &lt;code&gt;collector/builder-config.yaml&lt;/code&gt; and add:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;   &lt;span class="na"&gt;receivers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;gomod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.120.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Update your runtime config (&lt;code&gt;collector/config/collector.yaml&lt;/code&gt;) to include the Prometheus receiver&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recompile: &lt;code&gt;ocb --config=builder-config.yaml&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Same for Kafka export, mTLS extensions, or any other OTel component. You're not stuck with the base distribution; you're just not forced to include everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/vinnicius/weblogic-opentelemetry.git
&lt;span class="nb"&gt;cd &lt;/span&gt;weblogic-opentelemetry
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;span class="c"&gt;# Edit .env with your WebLogic host and backend endpoint&lt;/span&gt;
make build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make up
curl http://localhost:13133/  &lt;span class="c"&gt;# health check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full docs, Java 17 flags, and troubleshooting in the repository.&lt;/p&gt;




&lt;p&gt;If you're running WebLogic in production, give this a try. Questions, issues, and contributions welcome. Let me know what other WebLogic-specific metrics or log formats would be useful to support.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>opentelemetry</category>
      <category>java</category>
      <category>weblogic</category>
    </item>
  </channel>
</rss>
