This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/ozone-site.git
The following commit(s) were added to refs/heads/asf-site by this push:
new b98b8b50 [auto] Generated docs from Apache Ozone master
5fdf2d2d0bd0ac0edb1fd1f1bb1d382e17e0584c
b98b8b50 is described below
commit b98b8b50e87fad0d78777561942a936382fad735
Author: Github Actions <[email protected]>
AuthorDate: Thu Oct 16 12:47:09 2025 +0000
[auto] Generated docs from Apache Ozone master
5fdf2d2d0bd0ac0edb1fd1f1bb1d382e17e0584c
---
docs/edge/design.html | 10 +
docs/edge/design/distributed-tracing-flow.png | Bin 0 -> 589655 bytes
.../design/distributed-tracing-opentelemetry.html | 1063 ++++++++++++++++++++
docs/edge/design/distributed-tracing-sample.png | Bin 0 -> 292240 bytes
docs/edge/design/index.xml | 9 +-
docs/edge/en/sitemap.xml | 5 +-
docs/edge/index.xml | 7 +
docs/edge/interface/ofs.html | 2 +-
docs/edge/sitemap.xml | 2 +-
docs/edge/zh/interface/ofs.html | 2 +-
10 files changed, 1095 insertions(+), 5 deletions(-)
diff --git a/docs/edge/design.html b/docs/edge/design.html
index 3fd16d63..17ceffe8 100644
--- a/docs/edge/design.html
+++ b/docs/edge/design.html
@@ -593,6 +593,16 @@ s=d.getElementsByTagName('script')[0];
</thead>
<tbody>
+ <tr>
+ <td>2025-09-19</td>
+ <td>
+ <a
href="https://issues.apache.org/jira/browse/HDDS-13679">HDDS-13679</a>
+ </td>
+ <td><a
href="./design/distributed-tracing-opentelemetry.html">Distributed Tracing
using OpenTelemetry for Ozone</a></td>
+ <td>Use of OpenTelemetry for distributed tracing
in Ozone.</td>
+ <td>draft</td>
+ </tr>
+
<tr>
<td>2025-08-27</td>
<td>
diff --git a/docs/edge/design/distributed-tracing-flow.png
b/docs/edge/design/distributed-tracing-flow.png
new file mode 100644
index 00000000..812169a6
Binary files /dev/null and b/docs/edge/design/distributed-tracing-flow.png
differ
diff --git a/docs/edge/design/distributed-tracing-opentelemetry.html
b/docs/edge/design/distributed-tracing-opentelemetry.html
new file mode 100644
index 00000000..b8fa7e83
--- /dev/null
+++ b/docs/edge/design/distributed-tracing-opentelemetry.html
@@ -0,0 +1,1063 @@
+
+
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <meta name="description" content="Apache Ozone Documentation">
+
+ <title>Documentation for Apache Ozone</title>
+
+
+ <link href="../css/bootstrap.min.css" rel="stylesheet">
+
+
+ <link href="../css/ozonedoc.css" rel="stylesheet">
+
+
+
+ <link href="../swagger-resources/swagger-ui.css" rel="stylesheet">
+
+
+ <script>
+ var _paq = window._paq = window._paq || [];
+
+
+
+ _paq.push(['disableCookies']);
+
+
+ _paq.push(['trackPageView']);
+ _paq.push(['enableLinkTracking']);
+ (function() {
+ var u="//analytics.apache.org/";
+ _paq.push(['setTrackerUrl', u+'matomo.php']);
+ _paq.push(['setSiteId', '34']);
+ var d=document, g=d.createElement('script'),
+s=d.getElementsByTagName('script')[0];
+ g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+ })();
+ </script>
+
+
+ </head>
+
+
+ <body>
+
+<nav class="navbar navbar-inverse navbar-fixed-top">
+ <div class="container-fluid">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#sidebar" aria-expanded="false"
aria-controls="navbar">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a href="../index.html" class="navbar-left ozone-logo">
+ <img src="../ozone-logo-small.png"/>
+ </a>
+ <a class="navbar-brand hidden-xs" href="../index.html">
+ Apache Ozone/HDDS Documentation
+ </a>
+ <a class="navbar-brand visible-xs-inline" href="#">Apache Ozone</a>
+ </div>
+ <div id="navbar" class="navbar-collapse collapse">
+ <ul class="nav navbar-nav navbar-right">
+ <li><a href="https://github.com/apache/ozone">Source</a></li>
+ <li><a href="https://ozone.apache.org">Apache Ozone</a></li>
+ <li><a href="https://apache.org">ASF</a></li>
+ </ul>
+ </div>
+ </div>
+</nav>
+
+ <div class="container-fluid">
+ <div class="row">
+
+<div class="col-sm-2 col-md-2 sidebar" id="sidebar">
+ <ul class="nav nav-sidebar">
+
+
+
+ <li class="">
+
+ <a href="../index.html">
+
+
+
+ <span>An Introduction to Apache Ozone</span>
+ </a>
+ </li>
+
+
+
+ <li class="">
+ <a href="../start.html">
+
+ <span>Getting Started</span>
+ </a>
+ <ul class="nav">
+
+ <li class="">
+
+ <a
href="../start/productiondeployment.html">Production Deployment</a>
+
+ </li>
+
+ </ul>
+ </li>
+
+
+
+ <li class="">
+ <a href="../concept.html">
+
+ <span>Architecture</span>
+ </a>
+ <ul class="nav">
+
+ <li class="">
+
+ <a href="../concept/overview.html">Overview</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../concept/ozonemanager.html">
+
+ <span>Ozone Manager</span>
+ </a>
+ <ul class="nav">
+
+ <li class="">
+ <a
href="../concept/volumesbucketskeys.html">Volumes, Buckets, and Keys</a>
+ </li>
+
+ </ul>
+
+ </li>
+
+ <li class="">
+
+ <a
href="../concept/storagecontainermanager.html">Storage Container Manager</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../concept/containers.html">Containers</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../concept/datanodes.html">Datanodes</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../concept/ozones3gateway.html">Ozone S3
Gateway</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../concept/recon.html">Recon</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../concept/networkports.html">Network
Ports</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../concept/comparison.html">Comparison
with Other Storage Technologies</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../concept/rocksdb.html">RocksDB in Apache
Ozone</a>
+
+ </li>
+
+ </ul>
+ </li>
+
+
+
+ <li class="">
+ <a href="../feature.html">
+
+ <span>Features</span>
+ </a>
+ <ul class="nav">
+
+ <li class="">
+
+ <a
href="../feature/decommission.html">Decommissioning</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/om-ha.html">OM High
Availability</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/erasurecoding.html">Ozone
Erasure Coding</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/snapshot.html">
+
+ <span>Ozone Snapshot</span>
+ </a>
+ <ul class="nav">
+
+ <li class="">
+ <a
href="../feature/snapshot-configuration-properties.html">Snapshot Configuration
Properties</a>
+ </li>
+
+ </ul>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/scm-ha.html">SCM High
Availability</a>
+
+ </li>
+
+ <li class="">
+
+ <a
href="../feature/streaming-write-pipeline.html">Streaming Write Pipeline</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/dn-merge-rocksdb.html">Merge
Container RocksDB in DN</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/prefixfso.html">Prefix based
File System Optimization</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/topology.html">Topology
awareness</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/quota.html">Quota in Ozone</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/recon.html">Recon Server</a>
+
+ </li>
+
+ <li class="">
+
+ <a
href="../feature/observability.html">Observability</a>
+
+ </li>
+
+ <li class="">
+
+ <a
href="../feature/nonrolling-upgrade.html">Non-Rolling Upgrades and
Downgrades</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/s3-multi-tenancy.html">
+
+ <span>S3 Multi-Tenancy</span>
+ </a>
+ <ul class="nav">
+
+ <li class="">
+ <a
href="../feature/s3-multi-tenancy-setup.html">Setup</a>
+ </li>
+
+ <li class="">
+ <a
href="../feature/s3-tenant-commands.html">Tenant commands</a>
+ </li>
+
+ <li class="">
+ <a
href="../feature/s3-multi-tenancy-access-control.html">Access Control</a>
+ </li>
+
+ </ul>
+
+ </li>
+
+ <li class="">
+
+ <a
href="../feature/reconfigurability.html">Reconfigurability</a>
+
+ </li>
+
+ <li class="">
+
+ <a
href="../feature/containerbalancer.html">Container Balancer</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/maintenance.html">Maintenance
Mode</a>
+
+ </li>
+
+ <li class="">
+
+ <a
href="../feature/multi-raft-support.html">Multi-Raft Support in Ozone</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../feature/trash.html">Trash</a>
+
+ </li>
+
+ </ul>
+ </li>
+
+
+
+ <li class="">
+ <a href="../integration.html">
+
+ <span>Application Integrations</span>
+ </a>
+ <ul class="nav">
+
+ <li class="">
+
+ <a href="../integration/distcp.html">Hadoop
DistCp</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../integration/hive.html">Hive</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../integration/impala.html">Impala</a>
+
+ </li>
+
+ </ul>
+ </li>
+
+
+
+ <li class="">
+ <a href="../interface.html">
+
+ <span>Client Interfaces</span>
+ </a>
+ <ul class="nav">
+
+ <li class="">
+
+ <a href="../interface/ofs.html">Ofs (Hadoop
compatible)</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../interface/o3fs.html">O3fs (Hadoop
compatible)</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../interface/s3.html">
+
+ <span>S3 Protocol</span>
+ </a>
+ <ul class="nav">
+
+ <li class="">
+ <a
href="../interface/cyberduckozones3.html">Accessing Ozone S3 via CyberDuck</a>
+ </li>
+
+ </ul>
+
+ </li>
+
+ <li class="">
+
+ <a href="../interface/cli.html">Command Line
Interface</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../interface/reconapi.html">Recon API</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../interface/javaapi.html">Java API</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../interface/python.html">Accessing Apache
Ozone from Python</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../interface/csi.html">CSI Protocol</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../interface/httpfs.html">HttpFS
Gateway</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../interface/native-cpp.html">Native
C/C++ Client Access to Ozone</a>
+
+ </li>
+
+ </ul>
+ </li>
+
+
+
+ <li class="">
+ <a href="../security.html">
+
+ <span>Security</span>
+ </a>
+ <ul class="nav">
+
+ <li class="">
+
+ <a href="../security/secureozone.html">Securing
Ozone</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../security/securingtde.html">Transparent
Data Encryption</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../security/gdpr.html">GDPR in Ozone</a>
+
+ </li>
+
+ <li class="">
+
+ <a
href="../security/securingdatanodes.html">Securing Datanodes</a>
+
+ </li>
+
+ <li class="">
+
+ <a
href="../security/securingozonehttp.html">Securing HTTP</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../security/securings3.html">Securing
S3</a>
+
+ </li>
+
+ <li class="">
+
+ <a href="../security/securityacls.html">Ozone
ACLs</a>
+
+ </li>
+
+ <li class="">
+
+ <a
href="../security/protect-in-transit-traffic.html">Protect In-Transit
Traffic</a>
+
+ </li>
+
+ <li class="">
+
+ <a
href="../security/securitywithranger.html">Apache Ranger</a>
+
+ </li>
+
+ </ul>
+ </li>
+
+
+
+ <li class="">
+
+ <a href="../tools.html">
+
+
+
+ <span>Tools</span>
+ </a>
+ </li>
+
+
+
+ <li class="">
+
+ <a href="../recipe.html">
+
+
+
+ <span>Recipes</span>
+ </a>
+ </li>
+
+
+
+ <li class="">
+
+ <a href="../troubleshooting.html">
+
+
+
+ <span>Troubleshooting</span>
+ </a>
+ </li>
+
+
+ <li><a href="../design.html"><span><b>Design docs</b></span></a></li>
+ <li class="visible-xs"><a href="#">References</a>
+ <ul class="nav">
+ <li><a href="https://github.com/apache/ozone"><span class="glyphicon
glyphicon-new-window" aria-hidden="true"></span> Source</a></li>
+ <li><a href="https://ozone.apache.org"><span class="glyphicon
glyphicon-new-window" aria-hidden="true"></span> Apache Ozone</a></li>
+ <li><a href="https://apache.org"><span class="glyphicon
glyphicon-new-window" aria-hidden="true"></span> ASF</a></li>
+ </ul></li>
+ </ul>
+
+</div>
+
+ <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2
main-content">
+ <div class="col-md-9">
+ <h1><a
href="https://issues.apache.org/jira/browse/HDDS-13679">[HDDS-13679]</a>
Distributed Tracing using OpenTelemetry for Ozone (draft) </h1>
+ <div><i>Authors: </i><div
class="pull-right">2025-09-19</div></div>
+ <p> </p>
+
+ <div class="panel panel-success">
+ <div class="panel-heading">Summary</div>
+ <div class="panel-body">
+ Use of OpenTelemetry for distributed tracing in Ozone.
+ </div>
+ </div>
+
+ <!--
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. See accompanying LICENSE file.
+-->
+<h1 id="distributed-tracing-with-opentelemetry">Distributed Tracing with
OpenTelemetry</h1>
+<h1 id="1-introduction">1. Introduction</h1>
+<p>Ozone currently utilizes OpenTracing with Jaeger for distributed
+tracing. However, the OpenTracing project is deprecated and no longer
+actively supported. This document proposes migrating from OpenTracing to
+OpenTelemetry, which is a standardized and actively maintained project
+supporting various tracing tools, including Jaeger.</p>
+<p>The primary scope of this document is to detail the integration of
+OpenTelemetry for traces within the Ozone ecosystem.</p>
+<h1 id="2-opentelemetry-integration">2. OpenTelemetry Integration</h1>
+<p>This section outlines key OpenTelemetry concepts and their application
+within Ozone.</p>
+<h2 id="21-opentelemetry-concepts">2.1. OpenTelemetry Concepts</h2>
+<h3 id="211-context">2.1.1. Context</h3>
+<p>Context in OpenTelemetry keeps span and other information in the
+context. Context is set to thread-local using
<code>context.makeCurrent()</code>. And
+the same can be retrieved using <code>context.current()</code>.</p>
+<p><strong>Context Creation:</strong></p>
+<ul>
+<li>Creating a span with noParent().</li>
+<li>Importing a trace from an external request.</li>
+<li>Manually creating a Context with parameters:</li>
+</ul>
+<pre tabindex="0"><code>// Manual trace context creation
+Context rootContext = Context.root();
+Context newContextFromRoot = rootContext.with(myKey, "anotherValue");
+</code></pre><p><strong>Inter-thread Transfer:</strong> Context can be
transferred between threads by
+explicitly setting the context in the target thread using
+context.makeCurrent().</p>
+<p><strong>Inter-process Transfer</strong>: Context needs to be retrieved and
set to
+headers for HTTP or message body in gRpc to transfer. Further details are
+provided in <strong><a
href="../design/distributed-tracing-opentelemetry.html#216-trace-propagation">Trace
Propagation</a></strong>.</p>
+<h3 id="212-span">2.1.2. Span</h3>
+<p>An OpenTelemetry span represents a single, logical unit of work within a
+distributed system. It captures essential details of an operation.</p>
+<ul>
+<li>Name</li>
+<li>Parent span ID (absent for root spans)</li>
+<li>Start and End Timestamps</li>
+<li>Span Context</li>
+<li>Attributes</li>
+<li>Span Events</li>
+<li>Span Links</li>
+<li>Span Status</li>
+</ul>
+<p>A span is initiated with <code>startSpan()</code> and concluded with
<code>end()</code>. Spans are
+organized hierarchically within a context, allowing for the creation of
+child spans. For a span to be active and allow the creation of child
+spans, it must be set to the current context using
<code>span.makeCurrent()</code>.</p>
+<p><strong>Example Span Structure:</strong></p>
+<table>
+ <thead>
+ <tr>
+ <th>Field</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>name</td>
+ <td>The name of the operation.</td>
+ </tr>
+ <tr>
+ <td>context</td>
+ <td>Contains trace_id and span_id.</td>
+ </tr>
+ <tr>
+ <td>parent_id</td>
+ <td>The ID of the parent span, or null for a root span.</td>
+ </tr>
+ <tr>
+ <td>start_time</td>
+ <td>Timestamp when the span began.</td>
+ </tr>
+ <tr>
+ <td>end_time</td>
+ <td>Timestamp when the span ended.</td>
+ </tr>
+ <tr>
+ <td>attributes</td>
+ <td>Key-value pairs providing additional details about the span.</td>
+ </tr>
+ <tr>
+ <td>events</td>
+ <td>An array of events that occurred during the span’s
lifetime. Each event has a name, timestamp, and optional attributes.</td>
+ </tr>
+ </tbody>
+</table>
+<p>Upon completion (<code>end()</code>), span information is transmitted to the
+OpenTelemetry Collector. This transmission occurs in batches for
+performance optimization.</p>
+<p><strong>Sample:</strong></p>
+<div class="highlight"><pre tabindex="0"
style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code
class="language-json" data-lang="json"><span style="display:flex;"><span>{
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"name"</span>: <span
style="color:#e6db74">"hello"</span>,
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"context"</span>: {
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"trace_id"</span>: <span
style="color:#e6db74">"5b8aa5a2d2c872e8321cf37308d69df2"</span>,
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"span_id"</span>: <span
style="color:#e6db74">"051581bf3cb55c13"</span>
+</span></span><span style="display:flex;"><span> },
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"parent_id"</span>: <span
style="color:#66d9ef">null</span>,
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"start_time"</span>: <span
style="color:#e6db74">"2022-04-29T18:52:58.114201Z"</span>,
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"end_time"</span>: <span
style="color:#e6db74">"2022-04-29T18:52:58.114687Z"</span>,
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"attributes"</span>: {
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"http.route"</span>: <span
style="color:#e6db74">"some_route1"</span>
+</span></span><span style="display:flex;"><span> },
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"events"</span>: [
+</span></span><span style="display:flex;"><span> {
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"name"</span>: <span
style="color:#e6db74">"Guten Tag!"</span>,
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"timestamp"</span>: <span
style="color:#e6db74">"2022-04-29T18:52:58.114561Z"</span>,
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"attributes"</span>: {
+</span></span><span style="display:flex;"><span> <span
style="color:#f92672">"event_attributes"</span>: <span
style="color:#ae81ff">1</span>
+</span></span><span style="display:flex;"><span> }
+</span></span><span style="display:flex;"><span> }
+</span></span><span style="display:flex;"><span> ]
+</span></span><span style="display:flex;"><span>}
+</span></span></code></pre></div><h3 id="213-scope">2.1.3. Scope</h3>
+<p>Scope in OpenTelemetry defines which span is considered “active”
+within a given thread or execution context.</p>
+<ul>
+<li>
+<p><code>context.makeCurrent()</code> returns a Scope object, setting the
context as thread-local. This context can be retrieved via
<code>Context.current()</code>.</p>
+</li>
+<li>
+<p><code>span.makeCurrent() </code>returns a Scope object, setting the span
within the context. This span can be retrieved via
<code>Span.current()</code>.</p>
+</li>
+</ul>
+<p>It is crucial to close the <code>Scope</code> object to release associated
memory from the context or thread-local storage.</p>
+<div class="highlight"><pre tabindex="0"
style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code
class="language-java" data-lang="java"><span style="display:flex;"><span><span
style="color:#66d9ef">try</span> (Scope scope <span
style="color:#f92672">=</span> context.<span
style="color:#a6e22e">makeCurrent</span>()) {
+</span></span><span style="display:flex;"><span> Span span; <span
style="color:#75715e">// = get the space from context</span>
+</span></span><span style="display:flex;"><span> <span
style="color:#66d9ef">try</span> (Scope spanScope <span
style="color:#f92672">=</span> span.<span
style="color:#a6e22e">makeCurrent</span>()) {
+</span></span><span style="display:flex;"><span> }
+</span></span><span style="display:flex;"><span>}
+</span></span></code></pre></div><h3 id="214-attributes">2.1.4. Attributes</h3>
+<p>An OpenTelemetry span can include various attributes, which are
+key-value pairs that provide additional information about the operation
+being traced. Attributes enhance the observability of spans by adding
+context and detail that are crucial for debugging and performance
+analysis. They can represent anything from HTTP method and URL to
+database query parameters and user IDs.</p>
+<p><strong>Key Characteristics of Attributes:</strong></p>
+<ul>
+<li>
+<p><strong>Key-Value Pairs:</strong> Attributes are always stored as key-value
pairs. Keys are typically strings,
+and values can be strings, booleans, numbers, or arrays of these types.</p>
+</li>
+<li>
+<p><strong>Semantic Conventions:</strong> OpenTelemetry defines a set of
semantic conventions for common attributes (e.g., http.method,
+db.statement, error.type). Adhering to these conventions ensures consistency
and improves compatibility with various tracing backends.</p>
+</li>
+<li>
+<p><strong>Immutability:</strong> Once set on a span, attributes are generally
immutable. While new attributes can be added,
+existing ones are not typically modified.</p>
+</li>
+</ul>
+<p><strong>Usage:</strong></p>
+<p>Attributes are typically added to a span during its creation or at any
+point before it ends.</p>
+<div class="highlight"><pre tabindex="0"
style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code
class="language-java" data-lang="java"><span style="display:flex;"><span>Span
span <span style="color:#f92672">=</span> tracer.<span
style="color:#a6e22e">spanBuilder</span>(<span
style="color:#e6db74">"myOperation"</span>).<span
style="color:#a6e22e">startSpan</span>();
+</span></span><span style="display:flex;"><span><span
style="color:#66d9ef">try</span> (Scope scope <span
style="color:#f92672">=</span> span.<span
style="color:#a6e22e">makeCurrent</span>()) {
+</span></span><span style="display:flex;"><span> span.<span
style="color:#a6e22e">setAttribute</span>(<span
style="color:#e6db74">"http.method"</span>, <span
style="color:#e6db74">"GET"</span>);
+</span></span><span style="display:flex;"><span> span.<span
style="color:#a6e22e">setAttribute</span>(<span
style="color:#e6db74">"http.url"</span>, <span
style="color:#e6db74">"/api/v1/data"</span>);
+</span></span><span style="display:flex;"><span> span.<span
style="color:#a6e22e">setAttribute</span>(<span
style="color:#e6db74">"user.id"</span>, <span
style="color:#e6db74">"12345"</span>);
+</span></span><span style="display:flex;"><span> <span
style="color:#75715e">// ... application logic ...</span>
+</span></span><span style="display:flex;"><span>} <span
style="color:#66d9ef">finally</span> {
+</span></span><span style="display:flex;"><span> span.<span
style="color:#a6e22e">end</span>();
+</span></span><span style="display:flex;"><span>}
+</span></span></code></pre></div><p>Attributes are essential for filtering,
querying, and analyzing traces
+in a tracing visualization tool like Jaeger, allowing developers to
+quickly pinpoint issues or understand the behavior of their distributed
+applications.</p>
+<h3 id="215-events">2.1.5. Events</h3>
+<p>Events are timestamped messages that provide a more granular view of
+what happened within a span’s lifetime. They can be used to mark
+significant moments, record errors, or capture specific data points
+during an operation.</p>
+<p><strong>Key Characteristics of Events:</strong></p>
+<ul>
+<li>
+<p><strong>Timestamped:</strong> Every event is associated with a specific
timestamp, indicating when it occurred within the span.</p>
+</li>
+<li>
+<p><strong>Name:</strong> Each event has a descriptive name that summarizes
what happened (e.g., “Cache hit,” “Database query
started,” “Error”).</p>
+</li>
+<li>
+<p><strong>Attributes (Optional):</strong> Events can also include key-value
attributes to provide additional context, similar to span attributes.</p>
+</li>
+</ul>
+<p><strong>Usage:</strong></p>
+<p>Events are added to a span at the exact point in the code where the
+notable occurrence happens.</p>
+<div class="highlight"><pre tabindex="0"
style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code
class="language-java" data-lang="java"><span style="display:flex;"><span>Span
span <span style="color:#f92672">=</span> tracer.<span
style="color:#a6e22e">spanBuilder</span>(<span
style="color:#e6db74">"myOperation"</span>).<span
style="color:#a6e22e">startSpan</span>();
+</span></span><span style="display:flex;"><span><span
style="color:#66d9ef">try</span> (Scope scope <span
style="color:#f92672">=</span> span.<span
style="color:#a6e22e">makeCurrent</span>()) {
+</span></span><span style="display:flex;"><span> <span
style="color:#75715e">// ... application logic ...</span>
+</span></span><span style="display:flex;"><span> span.<span
style="color:#a6e22e">addEvent</span>(<span
style="color:#e6db74">"Processing started"</span>);
+</span></span><span style="display:flex;"><span> <span
style="color:#75715e">// ... more application logic ...</span>
+</span></span><span style="display:flex;"><span> span.<span
style="color:#a6e22e">addEvent</span>(<span
style="color:#e6db74">"Intermediate data generated"</span>,
Attributes.<span style="color:#a6e22e">of</span>(<span
style="color:#e6db74">"data.size"</span>, 1024L));
+</span></span><span style="display:flex;"><span> <span
style="color:#75715e">// ... further application logic ...</span>
+</span></span><span style="display:flex;"><span>} <span
style="color:#66d9ef">finally</span> {
+</span></span><span style="display:flex;"><span> span.<span
style="color:#a6e22e">end</span>();
+</span></span><span style="display:flex;"><span>}
+</span></span></code></pre></div><p>Events are particularly useful for
understanding the sequence of
+operations within a span, especially when debugging complex workflows or
+analyzing performance characteristics at a micro-level.</p>
+<h3 id="216-trace-propagation">2.1.6. Trace Propagation</h3>
+<p>Trace propagation facilitates the transfer of trace context information
+within and across service boundaries.</p>
+<p><strong>Between Threads (within a single process):</strong></p>
+<ul>
+<li>
+<p><strong>Manual Transfer:</strong> The Context object can be manually
transferred to a new thread, and makeCurrent() can be called on that thread.</p>
+</li>
+<li>
+<p><strong>Context Wrapping for Executor Services:</strong>
Context.taskWrapping() can be used to wrap an ExecutorService,
+automatically propagating context to tasks executed by the service.</p>
+</li>
+</ul>
+<div class="highlight"><pre tabindex="0"
style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code
class="language-java" data-lang="java"><span
style="display:flex;"><span>ExecutorService wrappedExecutor <span
style="color:#f92672">=</span>
+</span></span><span style="display:flex;"><span>Context.<span
style="color:#a6e22e">taskWrapping</span>(Executors.<span
style="color:#a6e22e">newFixedThreadPool</span>(1));
+</span></span></code></pre></div><p><strong>Across a Network (between
different services):</strong></p>
+<ul>
+<li>
+<p><strong>W3CTraceContextPropagator:</strong> This standard mechanism encodes
trace information (Trace ID, Span ID, etc.)
+for transmission over a network, typically using HTTP headers. This can be
used to write to StringBuilder or other output.</p>
+</li>
+<li>
+<p><strong>gRPC Integration for Ozone:</strong> For gRPC communications in
Ozone, trace context can be encoded into a string and embedded within a
+Proto field (e.g., “traceId”). The receiving server can then
decode this string back into a <code>Context</code> object to continue the
+trace using <code>W3CTraceContextPropagator</code>.</p>
+</li>
+</ul>
+<h3 id="217-trace-failure-handling">2.1.7. Trace Failure Handling</h3>
+<p>Failures within a traced operation can be recorded within the span by
+setting its status. The <code>SpanStatus</code> enum provides predefined
states like
+<code>OK</code>, <code>ERROR</code>, and <code>UNSET</code>. Setting the
status explicitly marks the span’s
+outcome, which is critical for quick identification of issues in tracing
+UIs. <code>UNSET</code> status is treated as success.</p>
+<p>Normally below can be done to report failure:</p>
+<ol>
+<li>
+<p><strong>Adding Events:</strong> <code>span.addEvent("Failure has
occurred" + ex.getMessage)</code> can be used to log a specific failure
+event with a descriptive message. This is timestamped information when failure
occurred.</p>
+</li>
+<li>
+<p><strong>Setting Status:</strong>
<code>span.setStatus(StatusCode.ERROR)</code> explicitly marks the span as
having encountered an error.</p>
+</li>
+</ol>
+<p><strong>Alternative</strong>, <code>span.setStatus(StatusCode.ERROR,
"error message")</code> can be used but it will lack the
timestamp.</p>
+<p>Correctly setting the span status helps in filtering and aggregating error
traces, providing a clear overview
+of system health and facilitating debugging efforts.</p>
+<h2 id="22-integration-with-ozone">2.2. Integration with Ozone</h2>
+<p>
+
+<img src="distributed-tracing-flow.png" alt='distributed-tracing-flow.png'
class="img-responsive" /></p>
+<p>The OpenTelemetry SDK is integrated with Ozone Manager,
leveraging<code>Context</code>, <code>Span</code>, and <code>Scope</code>
concepts,
+and configured to send traces to a Collector.</p>
+<p>Ozone utilizes OTLP (OpenTelemetry Protocol) to transmit traces to a
Collector, which can be an OpenTelemetry Collector,
+Jaeger, or any other collector supporting OpenTelemetry standards.</p>
+<p>For Ozone, data can be <strong>exported directly to the Jaeger
collector</strong>, as no processing is required.
+But the above approach can help in exporting to different vendors in multiple
formats for visualization and other purposes.</p>
+<p>The following environment variables are used for Collector
configuration:</p>
+<ul>
+<li>OTEL_EXPORTER_OTLP_ENDPOINT: Specifies the endpoint of the OTLP receiver.
Default: http://localhost:4317.</li>
+<li>OTEL_TRACES_SAMPLER_ARG: Configures the trace sampler argument. Default:
1.0 (all traces are reported).</li>
+</ul>
+<h2 id="23-how-opentelemetry-tracing-works">2.3. How OpenTelemetry Tracing
Works</h2>
+<p>Tracing in OpenTelemetry involves a hierarchy of spans. A parent span
+(e.g., span1) can contain one or more child spans (e.g., span2). Upon
+completion, each span sends its details to the configured Collector
+endpoint. This process is batched by the SDK for performance.</p>
+<p>Scenarios:</p>
+<ul>
+<li><strong>Single-Node (Parent-Child):</strong></li>
+</ul>
+<div class="highlight"><pre tabindex="0"
style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code
class="language-java" data-lang="java"><span
style="display:flex;"><span>span1.<span style="color:#a6e22e">start</span>()
+</span></span><span style="display:flex;"><span> span2.<span
style="color:#a6e22e">start</span>()
+</span></span><span style="display:flex;"><span> <span
style="color:#75715e">// application code</span>
+</span></span><span style="display:flex;"><span> span2.<span
style="color:#a6e22e">end</span>() <span
style="color:#960050;background-color:#1e0010">→</span> Sends span information
to <span style="color:#a6e22e">Collector</span> (1)
+</span></span><span style="display:flex;"><span>span1.<span
style="color:#a6e22e">end</span>() <span
style="color:#960050;background-color:#1e0010">→</span> Sends span information
to <span style="color:#a6e22e">Collector</span> (2)
+</span></span></code></pre></div><ul>
+<li><strong>Two-Node (Parent-Child with gRPC):</strong></li>
+</ul>
+<blockquote>
+<p><strong>Node 1:</strong></p>
+<pre tabindex="0"><code> span1.start()
+ Generate trace context as String
+ Add to gRPC Message and send message, then wait
+</code></pre><blockquote>
+<p><strong>Node 2:</strong></p>
+<pre tabindex="0"><code>Receive gRPC message and retrieve trace context as
String
+Convert to Context object and create span2 as child
+
+span2.start()
+ // application code
+span2.end() → Sends span information to Collector (1)
+</code></pre></blockquote>
+<p><strong>Node 1:</strong></p>
+<div class="highlight"><pre tabindex="0"
style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code
class="language-java" data-lang="java"><span
style="display:flex;"><span>span1.<span style="color:#a6e22e">end</span>()
<span style="color:#960050;background-color:#1e0010">→</span> Sends span
information to <span style="color:#a6e22e">Collector</span> (2)
+</span></span></code></pre></div></blockquote>
+<h1 id="3-tracing-hierarchy">3. Tracing Hierarchy</h1>
+<p>The current tracing implementation in Ozone initiates traces for:</p>
+<ul>
+<li>Every remote call from the Ozone client and shell.</li>
+<li>Ozone Manager’s <code>get blocks</code> calls to SCM.</li>
+<li>Remote calls from the Ozone client to DataNode for put block.</li>
+</ul>
+<p>This approach often results in disjoint traces or limited hierarchical
+representation, which does not provide a comprehensive view of
+end-to-end operational flows.</p>
+<h2 id="31-goal-for-enhanced-call-hierarchy">3.1. Goal for Enhanced Call
Hierarchy</h2>
+<p>The objective is to unify disjoint remote calls into a single, cohesive
+parent trace, providing a complete flow representation. Specific goals
+include:</p>
+<ul>
+<li>Combining all disjoint remote calls from the client into a single parent
trace (e.g., for file create, write, and commit operations).</li>
+<li>Including communication with SCM during file creation or allocation
flows.</li>
+<li>Integrating DataNode write operations into the same end-to-end trace.</li>
+</ul>
+<p><strong>Example End-to-End Trace Flow:</strong></p>
+<ol>
+<li>Application starts “create key” operation
+<ol>
+<li>Ozone client “create key”
+<ol>
+<li>Ozone Manager receives “create key”
+<ul>
+<li>Executed on all 3 Ozone Managers</li>
+</ul>
+</li>
+</ol>
+</li>
+<li>Ozone client “put block for write”
+<ul>
+<li>DataNode “put block”</li>
+</ul>
+</li>
+<li>Ozone Client “commit key”
+<ol>
+<li>Ozone Manager receives “commit key”
+<ul>
+<li>Executed on all 3 Ozone Managers</li>
+</ul>
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li>Finishes “create key” operation</li>
+</ol>
+<p>
+
+<img src="distributed-tracing-sample.png" alt='distributed-tracing-sample.png'
class="img-responsive" /></p>
+<h2 id="32-integration-of-more-flows">3.2. Integration of More Flows</h2>
+<p>For comprehensive performance analysis and debugging, tracing can be
+extended to various additional flows:</p>
+<ul>
+<li><strong>DataNode Heartbeat to SCM:</strong> Trace recording should only
occur when the DataNode initiates the trace context.</li>
+<li><strong>Recon:</strong> Trace all requests from the Recon UI to Ozone
components, such as the Recon Server.</li>
+<li><strong>Internal Services (e.g., OM connecting to SCM):</strong> These
calls, initiated under a timer thread, should also be traced.</li>
+</ul>
+<p>For internal Ozone calls, the trace should be initiated by the caller as a
<code>Client</code> span, not a <code>Server</code> span,
+as these are not remote calls crossing service boundaries but rather
operations controlled within Ozone components.</p>
+<h2 id="33-use-case">3.3. Use Case</h2>
+<p>This enhanced tracing capability can be integrated with applications such
as HBase, Iceberg, and Impala, which support OpenTelemetry.
+This enables detailed visualization of time taken at each step of an
operation, facilitating the identification of performance bottlenecks.</p>
+<h1 id="4-opentelemetry-span-kind">4. OpenTelemetry Span Kind</h1>
+<p>When a span is created, it is assigned a <code>SpanKind</code> to provide
context to
+the tracing backend regarding how the trace should be assembled.</p>
+<ul>
+<li><strong>Client:</strong> Represents a synchronous outgoing remote call
(e.g., an outgoing HTTP request or database query).</li>
+<li><strong>Server:</strong> Represents a synchronous incoming remote call
(e.g., an incoming HTTP request or remote procedure call).</li>
+<li><strong>Internal:</strong> Represents operations that do not cross a
process boundary (e.g., instrumenting a function call within the same
service).</li>
+<li><strong>Producer:</strong> Represents the creation of a job that may be
processed asynchronously later (e.g., enqueueing a message into a message
queue).</li>
+<li><strong>Consumer:</strong> Represents the processing of a job initiated by
a producer.</li>
+</ul>
+<h1 id="5-opentracing-control-level">5. OpenTracing Control Level</h1>
+<p>Tracing of call flows can be categorized to enable fine-grained control:</p>
+<ul>
+<li><strong>External Request Tracing:</strong> Traces initiated by external
remote servers, such as those originating from the Ozone Client or the Recon
UI.</li>
+<li><strong>Internal Requests:</strong> Traces within Ozone components (e.g.,
OM to SCM), often initiated as part of a timer task.</li>
+</ul>
+<p>A control flag is necessary to selectively enable tracing for external,
internal, or other future categorizations, thereby managing the tracing
overhead within Ozone services.</p>
+<h1 id="5-dynamic-tracing-configuration">5. Dynamic Tracing Configuration</h1>
+<p>The following configuration property will control tracing:</p>
+<ul>
+<li>Ozone.tracing.enabled (default: false)</li>
+</ul>
+<p>Existing environment variables for OpenTelemetry configuration are:</p>
+<ul>
+<li>OTEL_EXPORTER_OTLP_ENDPOINT: Specifies the OTLP receiver endpoint
(default: http://localhost:4317/).</li>
+<li>OTEL_TRACES_SAMPLER_ARG: Sampler argument for traces (default: 1.0,
meaning every trace is reported).</li>
+</ul>
+<p>Since environment variables cannot be updated dynamically, dedicated
configuration properties will be provided for dynamic control:</p>
+<ul>
+<li>ozone.tracing.endpoint</li>
+<li>ozone.tracing.sampler</li>
+</ul>
+<p>These <code>ozone.tracing</code> configurations can be dynamically updated
for Ozone Manager (OM), Storage Container Manager (SCM), and DataNode (DN) via
the Ozone CLI.</p>
+<p><strong>Note:</strong> Dynamic updates are not feasible for the Ozone
client as it is part of application code.</p>
+<h1 id="6-tracing-support-for-client">6. Tracing Support for Client</h1>
+<p>The Ozone client needs the flexibility to either initiate a new span or
continue an existing application-level trace by creating a child span.
+A specific scenario arises when the Ozone client should only trace if
it’s explicitly enabled to continue an application’s existing
trace.</p>
+<ul>
+<li><strong>Application with Active Trace:</strong>
+<ul>
+<li>The Ozone client checks for an active span from the application’s
context.</li>
+<li>If an active span is found, the Ozone client continues that trace as a
child span, using the application’s existing trace context.</li>
+</ul>
+</li>
+<li><strong>Application Without Active Trace:</strong>
+<ul>
+<li>If the application has not initiated a trace, the Ozone client will not
create a new trace independently when <code>ozone.tracing.enabled</code> is
false.</li>
+</ul>
+</li>
+</ul>
+<p>Typically, <code>ozone.tracing.enabled</code> is <code>false</code>,
indicating that no tracing should occur by default. However, for Ozone clients,
dynamically
+updating this configuration based on the application’s implementation is
often not feasible.</p>
+<p>To address this, the Ozone client will leverage the application’s
tracer to continue tracing as a child span.
+This specific behavior will be controlled by an additional flag:</p>
+<ul>
+<li><code>ozone.tracing.client.application-aware</code> (default: true)</li>
+</ul>
+<p>When Ozone.client.tracing.provider.application.enabled is true, the Ozone
client will utilize tracers provided by the application context.
+This allows the Ozone client to trace even if the ozone.tracing.enabled
configuration is false, provided the application has configured and enabled its
own tracing.</p>
+<p><strong>Mechanism for Client-Side Trace Continuation:</strong></p>
+<div class="highlight"><pre tabindex="0"
style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code
class="language-java" data-lang="java"><span style="display:flex;"><span><span
style="color:#75715e">// In a deep part of the code, get the current active
span from the Context</span>
+</span></span><span style="display:flex;"><span>Span currentSpan <span
style="color:#f92672">=</span> Span.<span
style="color:#a6e22e">current</span>();
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#75715e">//
Get the tracer that created this span</span>
+</span></span><span style="display:flex;"><span>Tracer tracer <span
style="color:#f92672">=</span> currentSpan.<span
style="color:#a6e22e">getTracer</span>();
+</span></span><span style="display:flex;"><span>
+</span></span><span style="display:flex;"><span><span style="color:#75715e">//
Using this tracer, a child span can be created and traced</span>
+</span></span><span style="display:flex;"><span><span style="color:#75715e">//
Example:</span>
+</span></span><span style="display:flex;"><span>tracer.<span
style="color:#a6e22e">spanBuilder</span>(<span
style="color:#e6db74">"OzoneClientOperation"</span>).<span
style="color:#a6e22e">setParent</span>(currentSpan.<span
style="color:#a6e22e">getSpanContext</span>()).<span
style="color:#a6e22e">startSpan</span>();
+</span></span></code></pre></div><h3 id="references">References</h3>
+<ul>
+<li><a href="https://opentelemetry.io/">OpenTelemetry</a></li>
+</ul>
+
+ </div>
+
+ </div>
+ </div>
+ </div>
+
+
+
+<footer class="footer">
+ <div class="container">
+ <span class="small text-muted">
+ Version: 2.1.0-SNAPSHOT, Last Modified: October 16, 2025 <a
class="hide-child link primary-color"
href="https://github.com/apache/ozone/commit/5fdf2d2d0bd0ac0edb1fd1f1bb1d382e17e0584c">5fdf2d2d0b</a>
+ </span>
+ </div>
+</footer>
+
+
+
+<script src="../js/jquery-3.5.1.min.js"></script>
+<script src="../js/ozonedoc.js"></script>
+<script src="../js/bootstrap.min.js"></script>
+
+
+ </body>
+</html>
diff --git a/docs/edge/design/distributed-tracing-sample.png
b/docs/edge/design/distributed-tracing-sample.png
new file mode 100644
index 00000000..c364270a
Binary files /dev/null and b/docs/edge/design/distributed-tracing-sample.png
differ
diff --git a/docs/edge/design/index.xml b/docs/edge/design/index.xml
index ba28b6de..6811b792 100644
--- a/docs/edge/design/index.xml
+++ b/docs/edge/design/index.xml
@@ -6,8 +6,15 @@
<description>Recent content in Designs on Ozone</description>
<generator>Hugo</generator>
<language>en</language>
- <lastBuildDate>Mon, 22 Sep 2025 10:13:03 -0700</lastBuildDate>
+ <lastBuildDate>Thu, 16 Oct 2025 09:06:36 +0530</lastBuildDate>
<atom:link href="/design/index.xml" rel="self" type="application/rss+xml"
/>
+ <item>
+ <title>Distributed Tracing using OpenTelemetry for Ozone</title>
+ <link>/design/distributed-tracing-opentelemetry.html</link>
+ <pubDate>Fri, 19 Sep 2025 00:00:00 +0000</pubDate>
+ <guid>/design/distributed-tracing-opentelemetry.html</guid>
+ <description>Use of OpenTelemetry for distributed tracing in
Ozone.</description>
+ </item>
<item>
<title>Listener Ozone Manager</title>
<link>/design/listener-om.html</link>
diff --git a/docs/edge/en/sitemap.xml b/docs/edge/en/sitemap.xml
index bcb34eb4..41bd857c 100644
--- a/docs/edge/en/sitemap.xml
+++ b/docs/edge/en/sitemap.xml
@@ -711,7 +711,10 @@
/>
</url><url>
<loc>/design.html</loc>
- <lastmod>2025-09-22T10:13:03-07:00</lastmod>
+ <lastmod>2025-10-16T09:06:36+05:30</lastmod>
+ </url><url>
+ <loc>/design/distributed-tracing-opentelemetry.html</loc>
+ <lastmod>2025-10-16T09:06:36+05:30</lastmod>
</url><url>
<loc>/design/listener-om.html</loc>
<lastmod>2025-09-03T11:34:46-07:00</lastmod>
diff --git a/docs/edge/index.xml b/docs/edge/index.xml
index 390c329c..795d7f7f 100644
--- a/docs/edge/index.xml
+++ b/docs/edge/index.xml
@@ -490,6 +490,13 @@
<guid>/start/fromsource.html</guid>
<description><!---
 Licensed to the Apache Software Foundation
(ASF) under one or more
 contributor license agreements. See the NOTICE
file distributed with
 this work for additional information regarding
copyright ownership.
 The ASF licenses this file to You under the Apache
License, Version 2.0
 (the "License"); you may not use this file
except in compliance with
 the License. You may obtain a copy of the
License at

 http: [...]
</item>
+ <item>
+ <title>Distributed Tracing using OpenTelemetry for Ozone</title>
+ <link>/design/distributed-tracing-opentelemetry.html</link>
+ <pubDate>Fri, 19 Sep 2025 00:00:00 +0000</pubDate>
+ <guid>/design/distributed-tracing-opentelemetry.html</guid>
+ <description>Use of OpenTelemetry for distributed tracing in
Ozone.</description>
+ </item>
<item>
<title>Listener Ozone Manager</title>
<link>/design/listener-om.html</link>
diff --git a/docs/edge/interface/ofs.html b/docs/edge/interface/ofs.html
index 33f55251..061d3182 100644
--- a/docs/edge/interface/ofs.html
+++ b/docs/edge/interface/ofs.html
@@ -670,7 +670,7 @@ For example:</p>
<p>Or use the put command to write a file to the bucket.</p>
<div class="highlight"><pre tabindex="0"
style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code
class="language-bash" data-lang="bash"><span style="display:flex;"><span>hdfs
dfs -put /etc/hosts /volume1/bucket1/test</span></span></code></pre></div>
<p>For more usage, see: <a
href="https://issues.apache.org/jira/secure/attachment/12987636/Design%20ofs%20v1.pdf">https://issues.apache.org/jira/secure/attachment/12987636/Design%20ofs%20v1.pdf</a></p>
-<h2 id="differences-from-o3fshahahugoshortcode116s5hbhb">Differences from <a
href="../interface/o3fs.html">o3fs</a></h2>
+<h2 id="differences-from-o3fshahahugoshortcode117s5hbhb">Differences from <a
href="../interface/o3fs.html">o3fs</a></h2>
<h3 id="creating-files">Creating files</h3>
<p>OFS doesn’t allow creating keys(files) directly under root or volumes.
Users will receive an error message when they try to do that:</p>
diff --git a/docs/edge/sitemap.xml b/docs/edge/sitemap.xml
index f4dcdcef..83cb1794 100644
--- a/docs/edge/sitemap.xml
+++ b/docs/edge/sitemap.xml
@@ -4,7 +4,7 @@
<sitemap>
<loc>/en/sitemap.xml</loc>
- <lastmod>2025-10-15T16:16:50+05:30</lastmod>
+ <lastmod>2025-10-16T09:06:36+05:30</lastmod>
</sitemap>
diff --git a/docs/edge/zh/interface/ofs.html b/docs/edge/zh/interface/ofs.html
index 6f9a5c47..86c81507 100644
--- a/docs/edge/zh/interface/ofs.html
+++ b/docs/edge/zh/interface/ofs.html
@@ -484,7 +484,7 @@ ofs://omservice/tmp/key1
<p>或者使用 put 命令向桶中写入一个文件</p>
<div class="highlight"><pre tabindex="0"
style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code
class="language-bash" data-lang="bash"><span style="display:flex;"><span>hdfs
dfs -put /etc/hosts /volume1/bucket1/test</span></span></code></pre></div>
<p>有关更多用法,请参见: <a
href="https://issues.apache.org/jira/secure/attachment/12987636/Design%20ofs%20v1.pdf">https://issues.apache.org/jira/secure/attachment/12987636/Design%20ofs%20v1.pdf</a></p>
-<h2 id="与-o3fshahahugoshortcode115s5hbhb-的区别">与 <a
href="../../zh/interface/o3fs.html">o3fs</a> 的区别</h2>
+<h2 id="与-o3fshahahugoshortcode116s5hbhb-的区别">与 <a
href="../../zh/interface/o3fs.html">o3fs</a> 的区别</h2>
<h3 id="创建文件">创建文件</h3>
<p>OFS 不允许直接在根目录或卷下创建键(文件)。
当用户尝试这样做时,他们将收到一个错误消息:</p>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]