This is an automated email from the ASF dual-hosted git repository.

mimaison pushed a commit to branch 3.9
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/3.9 by this push:
     new 0969789973e KAFKA-15469: Add documentation for configuration providers 
(#16650)
0969789973e is described below

commit 0969789973ee17b5744c0212828148542cb75a51
Author: PaulRMellor <[email protected]>
AuthorDate: Tue Jul 30 13:46:00 2024 +0100

    KAFKA-15469: Add documentation for configuration providers (#16650)
    
    
    Reviewers: Mickael Maison <[email protected]>
---
 docs/configuration.html | 122 +++++++++++++++++++++++-
 docs/toc.html           | 241 +++++++++++++++++++++++++-----------------------
 2 files changed, 248 insertions(+), 115 deletions(-)

diff --git a/docs/configuration.html b/docs/configuration.html
index 3f2b0121486..cd12dd3ea9a 100644
--- a/docs/configuration.html
+++ b/docs/configuration.html
@@ -308,6 +308,126 @@
   Below are the configuration properties for Tiered Storage.
   <!--#include virtual="generated/remote_log_manager_config.html" -->
   <!--#include virtual="generated/remote_log_metadata_manager_config.html" -->
-</script>
 
+  <h3 class="anchor-heading">
+    <a id="config_providers" class="anchor-link"></a>
+    <a href="#config_providers">3.11 Configuration Providers</a>
+  </h3>
+  
+  <p>
+    Use configuration providers to load configuration data from external 
sources. This might include sensitive information, such as passwords, API keys, 
or other credentials.
+  </p>
+  
+  <p>You have the following options:</p>
+  <ul>
+    <li>
+      Use a custom provider by creating a class implementing the
+      <a 
href="/{{version}}/javadoc/org/apache/kafka/common/config/provider/ConfigProvider.html"><code>ConfigProvider</code></a>
 interface and packaging it into a JAR file.
+    </li>
+    <li>Use a built-in provider:</li>
+    <ul>
+      <li><a 
href="/{{version}}/javadoc/org/apache/kafka/common/config/provider/DirectoryConfigProvider.html"><code>DirectoryConfigProvider</code></a></li>
+      <li><a 
href="/{{version}}/javadoc/org/apache/kafka/common/config/provider/EnvVarConfigProvider.html"><code>EnvVarConfigProvider</code></a></li>
+      <li><a 
href="/{{version}}/javadoc/org/apache/kafka/common/config/provider/FileConfigProvider.html"><code>FileConfigProvider</code></a></li>
+    </ul>
+  </ul>
+  
+  <p>
+    To use a configuration provider, specify it in your configuration using 
the <code>config.providers</code> property. 
+  </p>
+  
+  <h4 class="anchor-heading">
+    <a id="using_config_providers" class="anchor-link"></a>
+    <a href="#using_config_providers">Using Configuration Providers</a>
+  </h4>
+  <p>Configuration providers allow you to pass parameters and retrieve 
configuration data from various sources.</p>
+  <p>To specify configuration providers, you use a comma-separated list of 
aliases and the fully-qualified class names that implement the configuration 
providers:</p>
+  <pre><code>config.providers=provider1,provider2
+config.providers.provider1.class=com.example.Provider1
+config.providers.provider2.class=com.example.Provider2</code></pre>
+  <p>Each provider can have its own set of parameters, which are passed in a 
specific format:</p>
+  
<pre><code>config.providers.&lt;provider_alias&gt;.param.&lt;name&gt;=&lt;value&gt;</code></pre>
+  <p>The <code>ConfigProvider</code> interface serves as a base for all 
configuration providers. 
+    Custom implementations of this interface can be created to retrieve 
configuration data from various sources. 
+    You can package the implementation as a JAR file, add the JAR to your 
classpath, and reference the provider's class in your configuration.</p>
+  <p><b>Example custom provider configuration</b></p>
+  <pre><code>config.providers=customProvider
+config.providers.customProvider.class=com.example.customProvider
+config.providers.customProvider.param.param1=value1
+config.providers.customProvider.param.param2=value2</code></pre>
+  
+  <h4 class="anchor-heading">
+    <a id="directory_config_provider" class="anchor-link"></a>
+    <a href="#directory_config_provider">DirectoryConfigProvider</a>
+  </h4>
+  <p>The <code>DirectoryConfigProvider</code> retrieves configuration data 
from files stored in a specified directory.</p>
+  <p>Each file represents a key, and its content is the value. This provider 
is useful for loading multiple configuration files and for organizing 
configuration data into separate files.</p>
+  <p>To restrict the files that the <code>DirectoryConfigProvider</code> can 
access, use the <code>allowed.paths</code> parameter. 
+    This parameter accepts a comma-separated list of paths that the provider 
is allowed to access. If not set, all paths are allowed.</p>
+  <p><b>Example <code>DirectoryConfigProvider</code> configuration</b></p>
+<pre><code>config.providers=dirProvider
+config.providers.dirProvider.class=org.apache.kafka.common.config.provider.DirectoryConfigProvider
+config.providers.dirProvider.param.allowed.paths=/path/to/dir1,/path/to/dir2</code></pre>
+  <p>
+    To reference a value supplied by the <code>DirectoryConfigProvider</code>, 
use the correct placeholder syntax:
+  </p>
+<pre><code>${dirProvider:&lt;path_to_file&gt;:&lt;file_name&gt;}</code></pre>
+  
+  <h4 class="anchor-heading">
+    <a id="env_var_config_provider" class="anchor-link"></a>
+    <a href="#env_var_config_provider">EnvVarConfigProvider</a>
+  </h4>
+  <p>The <code>EnvVarConfigProvider</code> retrieves configuration data from 
environment variables.</p>
+  <p>No specific parameters are required, as it reads directly from the 
specified environment variables.</p>
+  <p>This provider is useful for configuring applications running in 
containers, for example, to load certificates or JAAS configuration from 
environment variables mapped from secrets.</p>
+  <p>To restrict which environment variables the 
<code>EnvVarConfigProvider</code> can access, use the 
<code>allowlist.pattern</code> parameter. This parameter accepts a regular 
expression that environment variable names must match to be used by the 
provider.</p>
+  <p><b>Example <code>EnvVarConfigProvider</code> configuration</b></p>
+<pre><code>config.providers=envVarProvider
+config.providers.envVarProvider.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider
+config.providers.envVarProvider.param.allowlist.pattern=^MY_ENVAR1_.*</code></pre>
+  <p>
+    To reference a value supplied by the <code>EnvVarConfigProvider</code>, 
use the correct placeholder syntax:
+  </p>
+<pre><code>${envVarProvider:&lt;enVar_name&gt;}</code></pre>
+  
+  <h4 class="anchor-heading">
+    <a id="file_config_provider" class="anchor-link"></a>
+    <a href="#file_config_provider">FileConfigProvider</a>
+  </h4>
+  <p>The <code>FileConfigProvider</code> retrieves configuration data from a 
single properties file.</p>
+  <p>This provider is useful for loading configuration data from mounted 
files.</p>
+  <p>To restrict the file paths that the <code>FileConfigProvider</code> can 
access, use the <code>allowed.paths</code> parameter. This parameter accepts a 
comma-separated list of paths that the provider is allowed to access. If not 
set, all paths are allowed.</p>
+  <p><b>Example <code>FileConfigProvider</code> configuration</b></p>
+<pre><code>config.providers=fileProvider
+config.providers.fileProvider.class=org.apache.kafka.common.config.provider.FileConfigProvider
+config.providers.fileProvider.param.allowed.paths=/path/to/config1,/path/to/config2</code></pre>
+  <p>
+   To reference a value supplied by the <code>FileConfigProvider</code>, use 
the correct placeholder syntax:
+  </p>
+<pre><code>${fileProvider:&lt;path_and_filename&gt;:&lt;property&gt;}</code></pre>
+  
+  <h4 class="anchor-heading">
+    <a id="ref_config_provider" class="anchor-link"></a>
+    <a href="#ref_config_provider">Example: Referencing files</a>
+  </h4>
+  <p>
+    Here’s an example that uses a file configuration provider with Kafka 
Connect to provide authentication credentials to a database for a connector.
+  </p>
+  <p>
+    First, create a <code>connector-credentials.properties</code> 
configuration file with the following credentials:
+  </p>
+  <pre><code>dbUsername=my-username
+dbPassword=my-password</code></pre>
+  <p>
+    Specify a <code>FileConfigProvider</code> in the Kafka Connect 
configuration:
+  </p>
+  <p><b>Example Kafka Connect configuration with a 
<code>FileConfigProvider</code></b></p>
+  <pre><code>config.providers=fileProvider
+config.providers.fileProvider.class=org.apache.kafka.common.config.provider.FileConfigProvider</code></pre>
+  <p>Next, reference the properties from the file in the connector 
configuration.</p>
+  <p><b>Example connector configuration referencing file properties</b></p>
+  
<pre><code>database.user=${fileProvider:/path/to/connector-credentials.properties:dbUsername}
+database.password=${fileProvider:/path/to/connector-credentials.properties:dbPassword}</code></pre>
+  <p>At runtime, the configuration provider reads and extracts the values from 
the properties file.</p>  
+</script>
 <div class="p-configuration"></div>
diff --git a/docs/toc.html b/docs/toc.html
index 24134911488..c05de6d17f0 100644
--- a/docs/toc.html
+++ b/docs/toc.html
@@ -29,7 +29,7 @@
                 <li><a href="#upgrade">1.5 Upgrading</a>
                 <li><a href="#docker">1.6 Docker</a>
             </ul>
-        </li>
+        
         <li><a href="#api">2. APIs</a>
             <ul>
                 <li><a href="#producerapi">2.1 Producer API</a>
@@ -38,7 +38,7 @@
                 <li><a href="#connectapi">2.4 Connect API</a>
                 <li><a href="#adminapi">2.5 Admin API</a>
             </ul>
-        </li>
+        
         <li><a href="#configuration">3. Configuration</a>
             <ul>
                 <li><a href="#brokerconfigs">3.1 Broker Configs</a>
@@ -50,13 +50,22 @@
                         <li><a href="#sourceconnectconfigs">Source Connector 
Configs</a>
                         <li><a href="#sinkconnectconfigs">Sink Connector 
Configs</a>
                     </ul>
+                
                 <li><a href="#streamsconfigs">3.6 Kafka Streams Configs</a>
                 <li><a href="#adminclientconfigs">3.7 AdminClient Configs</a>
                 <li><a href="#mirrormakerconfigs">3.8 MirrorMaker Configs</a>
                 <li><a href="#systemproperties">3.9 System Properties</a>
-                <li><a href="#tieredstorageconfigs">3.10 Tiered Storage 
Configs</a></li>
+                <li><a href="#tieredstorageconfigs">3.10 Tiered Storage 
Configs</a>
+                <li><a href="#config_providers">3.11 Configuration 
Providers</a>
+                    <ul>
+                        <li><a href="#using_config_providers">Using 
Configuration Providers</a>
+                        <li><a 
href="#directory_config_provider">DirectoryConfigProvider</a>
+                        <li><a 
href="#env_var_config_provider">EnvVarConfigProvider</a>    
+                        <li><a 
href="#file_config_provider">FileConfigProvider</a>
+                        <li><a href="#ref_config_provider">Example: 
Referencing Files</a>     
+                    </ul>    
             </ul>
-        </li>
+        
         <li><a href="#design">4. Design</a>
             <ul>
                 <li><a href="#majordesignelements">4.1 Motivation</a>
@@ -69,7 +78,7 @@
                 <li><a href="#compaction">4.8 Log Compaction</a>
                 <li><a href="#design_quotas">4.9 Quotas</a>
             </ul>
-        </li>
+        
         <li><a href="#implementation">5. Implementation</a>
             <ul>
                 <li><a href="#networklayer">5.1 Network Layer</a>
@@ -78,164 +87,168 @@
                 <li><a href="#log">5.4 Log</a>
                 <li><a href="#distributionimpl">5.5 Distribution</a>
             </ul>
-        </li>
+        
         <li><a href="#operations">6. Operations</a>
             <ul>
                 <li><a href="#basic_ops">6.1 Basic Kafka Operations</a>
                     <ul>
-                        <li><a href="#basic_ops_add_topic">Adding and removing 
topics</a></li>
-                        <li><a href="#basic_ops_modify_topic">Modifying 
topics</a></li>
-                        <li><a href="#basic_ops_restarting">Graceful 
shutdown</a></li>
-                        <li><a href="#basic_ops_leader_balancing">Balancing 
leadership</a></li>
-                        <li><a href="#basic_ops_racks">Balancing Replicas 
Across Racks</a></li>
-                        <li><a href="#basic_ops_mirror_maker">Mirroring data 
between clusters</a></li>
-                        <li><a href="#basic_ops_consumer_lag">Checking 
consumer position</a></li>
-                        <li><a href="#basic_ops_consumer_group">Managing 
Consumer Groups</a></li>
-                        <li><a href="#basic_ops_cluster_expansion">Expanding 
your cluster</a></li>
-                        <li><a 
href="#basic_ops_decommissioning_brokers">Decommissioning brokers</a></li>
-                        <li><a 
href="#basic_ops_increase_replication_factor">Increasing replication 
factor</a></li>
-                        <li><a href="#rep-throttle">Limiting Bandwidth Usage 
during Data Migration</a></li>
-                        <li><a href="#quotas">Setting quotas</a></li>
+                        <li><a href="#basic_ops_add_topic">Adding and removing 
topics</a>
+                        <li><a href="#basic_ops_modify_topic">Modifying 
topics</a>
+                        <li><a href="#basic_ops_restarting">Graceful 
shutdown</a>
+                        <li><a href="#basic_ops_leader_balancing">Balancing 
leadership</a>
+                        <li><a href="#basic_ops_racks">Balancing Replicas 
Across Racks</a>
+                        <li><a href="#basic_ops_mirror_maker">Mirroring data 
between clusters</a>
+                        <li><a href="#basic_ops_consumer_lag">Checking 
consumer position</a>
+                        <li><a href="#basic_ops_consumer_group">Managing 
Consumer Groups</a>
+                        <li><a href="#basic_ops_cluster_expansion">Expanding 
your cluster</a>
+                        <li><a 
href="#basic_ops_decommissioning_brokers">Decommissioning brokers</a>
+                        <li><a 
href="#basic_ops_increase_replication_factor">Increasing replication factor</a>
+                        <li><a href="#rep-throttle">Limiting Bandwidth Usage 
during Data Migration</a>
+                        <li><a href="#quotas">Setting quotas</a>
                     </ul>
-                </li>
-                <li><a href="#datacenters">6.2 Datacenters</a></li>
+                
+                <li><a href="#datacenters">6.2 Datacenters</a>
                 <li><a href="#georeplication">6.3 Geo-Replication 
(Cross-Cluster Data Mirroring)</a>
                     <ul>
-                        <li><a href="#georeplication-overview">Geo-Replication 
Overview</a></li>
-                        <li><a href="#georeplication-flows">What Are 
Replication Flows</a></li>
-                        <li><a href="#georeplication-mirrormaker">Configuring 
Geo-Replication</a></li>
-                        <li><a href="#georeplication-starting">Starting 
Geo-Replication</a></li>
-                        <li><a href="#georeplication-stopping">Stopping 
Geo-Replication</a></li>
-                        <li><a 
href="#georeplication-apply-config-changes">Applying Configuration 
Changes</a></li>
-                        <li><a href="#georeplication-monitoring">Monitoring 
Geo-Replication</a></li>
+                        <li><a href="#georeplication-overview">Geo-Replication 
Overview</a>
+                        <li><a href="#georeplication-flows">What Are 
Replication Flows</a>
+                        <li><a href="#georeplication-mirrormaker">Configuring 
Geo-Replication</a>
+                        <li><a href="#georeplication-starting">Starting 
Geo-Replication</a>
+                        <li><a href="#georeplication-stopping">Stopping 
Geo-Replication</a>
+                        <li><a 
href="#georeplication-apply-config-changes">Applying Configuration Changes</a>
+                        <li><a href="#georeplication-monitoring">Monitoring 
Geo-Replication</a>
                     </ul>
-                </li>
+                
                 <li><a href="#multitenancy">6.4 Multi-Tenancy</a>
                     <ul>
-                        <li><a href="#multitenancy-overview">Multi-Tenancy 
Overview</a></li>
-                        <li><a href="#multitenancy-topic-naming">Creating User 
Spaces (Namespaces)</a></li>
-                        <li><a href="#multitenancy-topic-configs">Configuring 
Topics</a></li>
-                        <li><a href="#multitenancy-security">Securing Clusters 
and Topics</a></li>
-                        <li><a href="#multitenancy-isolation">Isolating 
Tenants</a></li>
-                        <li><a href="#multitenancy-monitoring">Monitoring and 
Metering</a></li>
-                        <li><a 
href="#multitenancy-georeplication">Multi-Tenancy and Geo-Replication</a></li>
-                        <li><a href="#multitenancy-more">Further 
considerations</a></li>
+                        <li><a href="#multitenancy-overview">Multi-Tenancy 
Overview</a>
+                        <li><a href="#multitenancy-topic-naming">Creating User 
Spaces (Namespaces)</a>
+                        <li><a href="#multitenancy-topic-configs">Configuring 
Topics</a>
+                        <li><a href="#multitenancy-security">Securing Clusters 
and Topics</a>
+                        <li><a href="#multitenancy-isolation">Isolating 
Tenants</a>
+                        <li><a href="#multitenancy-monitoring">Monitoring and 
Metering</a>
+                        <li><a 
href="#multitenancy-georeplication">Multi-Tenancy and Geo-Replication</a>
+                        <li><a href="#multitenancy-more">Further 
considerations</a>
                     </ul>
-                </li>
+                
                 <li><a href="#config">6.5 Important Configs</a>
                     <ul>
                         <li><a href="#clientconfig">Important Client 
Configs</a>
                         <li><a href="#prodconfig">A Production Server 
Configs</a>
                     </ul>
-                </li>
+                
                 <li><a href="#java">6.6 Java Version</a>
                 <li><a href="#hwandos">6.7 Hardware and OS</a>
                     <ul>
-                        <li><a href="#os">OS</a></li>
-                        <li><a href="#diskandfs">Disks and Filesystems</a></li>
-                        <li><a href="#appvsosflush">Application vs OS Flush 
Management</a></li>
-                        <li><a href="#linuxflush">Linux Flush Behavior</a></li>
-                        <li><a href="#filesystems">Filesystem 
Selection</a></li>
-                        <li><a href="#replace_disk">Replace KRaft Controller 
Disk</a></li>
+                        <li><a href="#os">OS</a>
+                        <li><a href="#diskandfs">Disks and Filesystems</a>
+                        <li><a href="#appvsosflush">Application vs OS Flush 
Management</a>
+                        <li><a href="#linuxflush">Linux Flush Behavior</a>
+                        <li><a href="#filesystems">Filesystem Selection</a>
+                        <li><a href="#replace_disk">Replace KRaft Controller 
Disk</a>
                     </ul>
-                </li>
+                
                 <li><a href="#monitoring">6.8 Monitoring</a>
                     <ul>
-                        <li><a href="#remote_jmx">Security Considerations for 
Remote Monitoring using JMX</a></li>
-                        <li><a href="#tiered_storage_monitoring">Tiered 
Storage Monitoring</a></li>
-                        <li><a href="#kraft_monitoring">KRaft 
Monitoring</a></li>
-                        <li><a href="#selector_monitoring">Selector 
Monitoring</a></li>
-                        <li><a href="#common_node_monitoring">Common Node 
Monitoring</a></li>
-                        <li><a href="#producer_monitoring">Producer 
Monitoring</a></li>
-                        <li><a href="#consumer_monitoring">Consumer 
Monitoring</a></li>
-                        <li><a href="#connect_monitoring">Connect 
Monitoring</a></li>
-                        <li><a href="#kafka_streams_monitoring">Streams 
Monitoring</a></li>
-                        <li><a href="#others_monitoring">Others</a></li>
+                        <li><a href="#remote_jmx">Security Considerations for 
Remote Monitoring using JMX</a>
+                        <li><a href="#tiered_storage_monitoring">Tiered 
Storage Monitoring</a>
+                        <li><a href="#kraft_monitoring">KRaft Monitoring</a>
+                        <li><a href="#selector_monitoring">Selector 
Monitoring</a>
+                        <li><a href="#common_node_monitoring">Common Node 
Monitoring</a>
+                        <li><a href="#producer_monitoring">Producer 
Monitoring</a>
+                        <li><a href="#consumer_monitoring">Consumer 
Monitoring</a>
+                        <li><a href="#connect_monitoring">Connect 
Monitoring</a>
+                        <li><a href="#kafka_streams_monitoring">Streams 
Monitoring</a>
+                        <li><a href="#others_monitoring">Others</a>
                     </ul>
-                </li>
+                
                 <li><a href="#zk">6.9 ZooKeeper</a>
                     <ul>
                         <li><a href="#zkversion">Stable Version</a>
-                       <li><a href="#zk_depr">ZooKeeper Deprecation</a>
+                        <li><a href="#zk_depr">ZooKeeper Deprecation</a>
                         <li><a href="#zkops">Operationalization</a>
                     </ul>
-                </li>
+                
                 <li><a href="#kraft">6.10 KRaft</a>
                     <ul>
-                        <li><a href="#kraft_config">Configuration</a></li>
-                        <li><a href="#kraft_storage">Storage Tool</a></li>
-                        <li><a href="#kraft_debug">Debugging</a></li>
-                        <li><a href="#kraft_deployment">Deploying 
Considerations</a></li>
-                        <li><a href="#kraft_missing">Missing Features</a></li>
-                        <li><a href="#kraft_zk_migration">ZooKeeper to KRaft 
Migration</a></li>
+                        <li><a href="#kraft_config">Configuration</a>
+                        <li><a href="#kraft_storage">Storage Tool</a>
+                        <li><a href="#kraft_debug">Debugging</a>
+                        <li><a href="#kraft_deployment">Deploying 
Considerations</a>
+                        <li><a href="#kraft_missing">Missing Features</a>
+                        <li><a href="#kraft_zk_migration">ZooKeeper to KRaft 
Migration</a>
                     </ul>
-                </li>
+                
                 <li><a href="#tiered_storage">6.11 Tiered Storage</a>
                     <ul>
-                        <li><a href="#tiered_storage_overview">Tiered Storage 
Overview</a></li>
-                        <li><a 
href="#tiered_storage_config">Configuration</a></li>
-                        <li><a href="#tiered_storage_config_ex">Quick Start 
Example</a></li>
-                        <li><a 
href="#tiered_storage_limitation">Limitations</a></li>
+                        <li><a href="#tiered_storage_overview">Tiered Storage 
Overview</a>
+                        <li><a href="#tiered_storage_config">Configuration</a>
+                        <li><a href="#tiered_storage_config_ex">Quick Start 
Example</a>
+                        <li><a 
href="#tiered_storage_limitation">Limitations</a>
                     </ul>
-                </li>
+                
             </ul>
-        </li>
+        
         <li><a href="#security">7. Security</a>
             <ul>
-                <li><a href="#security_overview">7.1 Security Overview</a></li>
-                <li><a href="#listener_configuration">7.2 Listener 
Configuration</a></li>
-                <li><a href="#security_ssl">7.3 Encryption and Authentication 
using SSL</a></li>
-                <li><a href="#security_sasl">7.4 Authentication using 
SASL</a></li>
-                <li><a href="#security_authz">7.5 Authorization and 
ACLs</a></li>
-                <li><a href="#security_rolling_upgrade">7.6 Incorporating 
Security Features in a Running Cluster</a></li>
+                <li><a href="#security_overview">7.1 Security Overview</a>
+                <li><a href="#listener_configuration">7.2 Listener 
Configuration</a>
+                <li><a href="#security_ssl">7.3 Encryption and Authentication 
using SSL</a>
+                <li><a href="#security_sasl">7.4 Authentication using SASL</a>
+                <li><a href="#security_authz">7.5 Authorization and ACLs</a>
+                <li><a href="#security_rolling_upgrade">7.6 Incorporating 
Security Features in a Running Cluster</a>
                 <li><a href="#zk_authz">7.7 ZooKeeper Authentication</a>
-                <ul>
-                    <li><a href="#zk_authz_new">New Clusters</a>
                     <ul>
-                        <li><a href="#zk_authz_new_sasl">ZooKeeper SASL 
Authentication</a></li>
-                        <li><a href="#zk_authz_new_mtls">ZooKeeper Mutual TLS 
Authentication</a></li>
+                        <li><a href="#zk_authz_new">New Clusters</a>
+                            <ul>
+                                <li><a href="#zk_authz_new_sasl">ZooKeeper 
SASL Authentication</a>
+                                <li><a href="#zk_authz_new_mtls">ZooKeeper 
Mutual TLS Authentication</a>
+                            </ul>
+                        
+                        <li><a href="#zk_authz_migration">Migrating 
Clusters</a>
+                        <li><a href="#zk_authz_ensemble">Migrating the 
ZooKeeper Ensemble</a>
+                        <li><a href="#zk_authz_quorum">ZooKeeper Quorum Mutual 
TLS Authentication</a>
                     </ul>
-                    <li><a href="#zk_authz_migration">Migrating 
Clusters</a></li>
-                    <li><a href="#zk_authz_ensemble">Migrating the ZooKeeper 
Ensemble</a></li>
-                    <li><a href="#zk_authz_quorum">ZooKeeper Quorum Mutual TLS 
Authentication</a></li>
-                </ul>
-                <li><a href="#zk_encryption">7.8 ZooKeeper Encryption</a></li>
+                
+                <li><a href="#zk_encryption">7.8 ZooKeeper Encryption</a>
             </ul>
-        </li>
+        
         <li><a href="#connect">8. Kafka Connect</a>
             <ul>
-                <li><a href="#connect_overview">8.1 Overview</a></li>
+                <li><a href="#connect_overview">8.1 Overview</a>
                 <li><a href="#connect_user">8.2 User Guide</a>
-                <ul>
-                    <li><a href="#connect_running">Running Kafka 
Connect</a></li>
-                    <li><a href="#connect_configuring">Configuring 
Connectors</a></li>
-                    <li><a href="#connect_transforms">Transformations</a></li>
-                    <li><a href="#connect_rest">REST API</a></li>
-                    <li><a href="#connect_errorreporting">Error Reporting in 
Connect</a></li>
-                    <li><a href="#connect_exactlyonce">Exactly-once 
support</a></li>
-                    <li><a href="#connect_plugindiscovery">Plugin 
Discovery</a></li>
-                </ul>
+                    <ul>
+                        <li><a href="#connect_running">Running Kafka 
Connect</a>
+                        <li><a href="#connect_configuring">Configuring 
Connectors</a>
+                        <li><a href="#connect_transforms">Transformations</a>
+                        <li><a href="#connect_rest">REST API</a>
+                        <li><a href="#connect_errorreporting">Error Reporting 
in Connect</a>
+                        <li><a href="#connect_exactlyonce">Exactly-once 
support</a>
+                        <li><a href="#connect_plugindiscovery">Plugin 
Discovery</a>
+                    </ul>
+                
                 <li><a href="#connect_development">8.3 Connector Development 
Guide</a>
-                <ul>
-                    <li><a href="#connect_concepts">Core Concepts and 
APIs</a></li>
-                    <li><a href="#connect_developing">Developing a Simple 
Connector</a></li>
-                    <li><a href="#connect_dynamicio">Dynamic Input/Output 
Streams</a></li>
-                    <li><a href="#connect_configs">Configuration 
Validation</a></li>
-                    <li><a href="#connect_schemas">Working with 
Schemas</a></li>
-                </ul>
-                <li><a href="#connect_administration">8.4 
Administration</a></li>
+                    <ul>
+                        <li><a href="#connect_concepts">Core Concepts and 
APIs</a>
+                        <li><a href="#connect_developing">Developing a Simple 
Connector</a>
+                        <li><a href="#connect_dynamicio">Dynamic Input/Output 
Streams</a>
+                        <li><a href="#connect_configs">Configuration 
Validation</a>
+                        <li><a href="#connect_schemas">Working with Schemas</a>
+                    </ul>
+                
+                <li><a href="#connect_administration">8.4 Administration</a>
             </ul>
-        </li>
+        
         <li><a href="/{{version}}/documentation/streams">9. Kafka Streams</a>
             <ul>
-                <li><a 
href="/{{version}}/documentation/streams/quickstart">9.1 Play with a Streams 
Application</a></li>
-                <li><a href="/{{version}}/documentation/streams/tutorial">9.2 
Write your own Streams Applications</a></li>
-                <li><a 
href="/{{version}}/documentation/streams/developer-guide">9.3 Developer 
Manual</a></li>
-                <li><a 
href="/{{version}}/documentation/streams/core-concepts">9.4 Core 
Concepts</a></li>
-                <li><a 
href="/{{version}}/documentation/streams/architecture">9.5 Architecture</a></li>
-                <li><a 
href="/{{version}}/documentation/streams/upgrade-guide">9.6 Upgrade 
Guide</a></li>
+                <li><a 
href="/{{version}}/documentation/streams/quickstart">9.1 Play with a Streams 
Application</a>
+                <li><a href="/{{version}}/documentation/streams/tutorial">9.2 
Write your own Streams Applications</a>
+                <li><a 
href="/{{version}}/documentation/streams/developer-guide">9.3 Developer 
Manual</a>
+                <li><a 
href="/{{version}}/documentation/streams/core-concepts">9.4 Core Concepts</a>
+                <li><a 
href="/{{version}}/documentation/streams/architecture">9.5 Architecture</a>
+                <li><a 
href="/{{version}}/documentation/streams/upgrade-guide">9.6 Upgrade Guide</a>
             </ul>
-        </li>
+        
     </ul>
 
 </script>

Reply via email to