Skip to content
Open
Show file tree
Hide file tree
Changes from 69 commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
6db2af2
First commit
fmeheust Jan 23, 2025
cf6b82a
Added static Events and tests
fmeheust Feb 3, 2025
5f5fdb8
Replaced set by list
fmeheust Feb 3, 2025
2546b01
Changes to tests
fmeheust Feb 3, 2025
50211a2
Added test name
fmeheust Feb 3, 2025
535737c
Check connectionID
fmeheust Feb 3, 2025
65753e8
Static JFR events
fmeheust Feb 10, 2025
fe09409
Merge remote-tracking branch 'origin/main' into observability-provider
fmeheust Feb 10, 2025
ce3601d
Merged from main
fmeheust Feb 10, 2025
bc11b39
Documentation and tests
fmeheust Feb 14, 2025
b469a80
Added execution events to JFR
fmeheust Feb 14, 2025
a6cd874
Documentation changes
fmeheust Feb 21, 2025
8142aa0
Fixed tests
fmeheust Feb 24, 2025
01cfd12
Observability configuration test
fmeheust Feb 24, 2025
ad7df96
Added debug info
fmeheust Feb 24, 2025
ac08356
Run tests one by one
fmeheust Feb 24, 2025
8478b83
Test Order
fmeheust Feb 24, 2025
6b03e6f
Added comment for test run configuration.
fmeheust Feb 24, 2025
c8a8cdf
Backward compatibility
fmeheust Feb 24, 2025
dee07b4
Locks and event labels
fmeheust Feb 25, 2025
c649e57
Refactoring and added possibility to have different configuration and…
fmeheust Mar 7, 2025
65c7765
Changed action version for deprecated action
fmeheust Mar 7, 2025
f6e972f
Set version in pom files correctly
fmeheust Mar 7, 2025
8f7b15d
Fixed tests when running in the same JVM
fmeheust Mar 7, 2025
1157aa3
Unique identifier and refactoring.
fmeheust Mar 7, 2025
ed0c89e
Merge branch 'main' into observability-provider
fmeheust Mar 10, 2025
dd9de05
Corrected copyright
fmeheust Mar 10, 2025
59f3262
Merge branch 'observability-provider' of https://github.com/oracle/oj…
fmeheust Mar 10, 2025
9cb4b41
Implementing JFR, Logging and Open Telemetry providers for monitoring…
elaaissaouiabdessamad Sep 7, 2025
f095272
Implementing JFR and Open Telemetry providers for monitoring UCP(reso…
elaaissaouiabdessamad Oct 10, 2025
bcc0e39
Preparing release 1.0.7
fmeheust Oct 15, 2025
8ac378b
Downgraded jakarta
fmeheust Oct 15, 2025
719e84f
implement OpenTelemetry stable semantic conventions
MouhsinElmajdouby Oct 20, 2025
63f5ba0
Fix and improve javadocs && Improve thread safety
MouhsinElmajdouby Oct 20, 2025
265c48b
Cleaning up
elaaissaouiabdessamad Oct 31, 2025
d59055c
Split db.namespace into separate attributes: service name, instance I…
MouhsinElmajdouby Nov 12, 2025
0d6a4d7
make the new driver version global for all providers
MouhsinElmajdouby Nov 12, 2025
ea176ec
Merge branch 'main' into observability-provider + new version of driver
fmeheust Nov 12, 2025
00513c3
Version
fmeheust Nov 12, 2025
82c48d5
debugging test
fmeheust Nov 12, 2025
5b12282
Test with older version of driver
fmeheust Nov 12, 2025
01a3113
Driver version
fmeheust Nov 12, 2025
dfc4c26
Merge remote-tracking branch 'origin/HEAD' into observability-provider
fmeheust Nov 12, 2025
42912c5
Fix AC replay attribute and improve README clarity
MouhsinElmajdouby Jan 19, 2026
5f93f5e
Merge remote-tracking branch 'origin/HEAD' into observability-provider
fmeheust Feb 5, 2026
a922d2b
Updated README
fmeheust Feb 5, 2026
f056b7f
Update pom.xml
fmeheust Feb 5, 2026
6976099
Update java version
fmeheust Feb 5, 2026
bf971cb
Update compiler source and target versions
fmeheust Feb 5, 2026
a184f37
Change back to 3.1
fmeheust Feb 5, 2026
cc1fb76
Resolve coflicts
elaaissaouiabdessamad Mar 9, 2026
6a2943b
Cleaned up the code and applied coding standards
elaaissaouiabdessamad Mar 10, 2026
e5d91eb
Cleaned up the code
elaaissaouiabdessamad Mar 10, 2026
099995a
Create a separate Module Oracle UCP Observability Provider for JFR an…
elaaissaouiabdessamad Mar 10, 2026
e3364a4
Fixing JFR and OTEL Providers
elaaissaouiabdessamad Mar 12, 2026
7e62ca8
Added Unit Tests
elaaissaouiabdessamad Mar 12, 2026
1e239b4
Added Unit Tests for JFR provider
elaaissaouiabdessamad Mar 12, 2026
f801dcc
Added README.md file
elaaissaouiabdessamad Mar 12, 2026
3a56781
Fixed README.md file
elaaissaouiabdessamad Mar 12, 2026
3df9c4e
Fixed Unit Tests
elaaissaouiabdessamad Mar 12, 2026
58a9872
Removed unnecessary dependencies
elaaissaouiabdessamad Mar 29, 2026
2aa45c9
Edited The readme.md file to reflect the new changes.
elaaissaouiabdessamad Mar 29, 2026
629e4a2
Added the Oracle UPL license header
elaaissaouiabdessamad Mar 29, 2026
96ef1ff
Edited the OTEL provider to address Mohsin's comments. I added detail…
elaaissaouiabdessamad Mar 29, 2026
4bda949
Edited the OTEL unit test class to adapt to the new version of the OT…
elaaissaouiabdessamad Mar 29, 2026
c55a42a
fix: harden JFR provider — private fields, serialVersionUID, direct c…
elaaissaouiabdessamad Mar 30, 2026
216947c
Improved Unit tests classes
elaaissaouiabdessamad Mar 30, 2026
5521971
Unit Tests clean up
elaaissaouiabdessamad Mar 31, 2026
3170566
Clean up the code
elaaissaouiabdessamad Apr 1, 2026
72cc39f
update copyright year to 2026 and replace inline FQNs with imports
elaaissaouiabdessamad Apr 6, 2026
bb4f6b2
clean up requirements table in README
elaaissaouiabdessamad Apr 6, 2026
7d4d7e8
update README activation, event descriptions, and field definitions
elaaissaouiabdessamad Apr 6, 2026
7ef42fb
fix code snippets and XML dependency wrappers in README
elaaissaouiabdessamad Apr 6, 2026
1099cd4
remove @Description from base event, add isEnabled() guard before com…
elaaissaouiabdessamad Apr 7, 2026
2292e23
refactor(otel): condense Javadoc and inline comments for clarity and …
elaaissaouiabdessamad Apr 7, 2026
dd234df
Update dependency versions
fmeheust Apr 13, 2026
b6c3c48
Merge remote-tracking branch 'origin/HEAD' into release-1.0.7
fmeheust Apr 13, 2026
d86d1df
Fixed version number
fmeheust Apr 13, 2026
1227d5c
Third party licenses for Oracle JDBC Providers Pkl Module
fmeheust Apr 13, 2026
e0916ea
Updated jackson version
fmeheust Apr 14, 2026
124d6fd
Merge remote-tracking branch 'origin/main' into release-1.0.7
fmeheust Apr 14, 2026
5242fb6
Try changing driver version
fmeheust Apr 14, 2026
b2356c9
Resolved Conflicts
elaaissaouiabdessamad Apr 14, 2026
1b5fa98
Catch exception in test
fmeheust Apr 15, 2026
1b034d5
Not specifying distribution
fmeheust Apr 15, 2026
2114f3c
updated jdk version
fmeheust Apr 15, 2026
2b6d953
Merge remote-tracking branch 'origin/release-1.0.7' into feature/ucp-…
elaaissaouiabdessamad Apr 15, 2026
85dbfa6
align ojdbc-provider-ucp-observability parent from 1.0.6 to 1.0.7
elaaissaouiabdessamad Apr 15, 2026
9855be8
Fix UCP observability README field types
elaaissaouiabdessamad Apr 15, 2026
1b0ab2e
Add README note for OTel usage metric naming
elaaissaouiabdessamad Apr 15, 2026
2597e4d
Fixed Javadoc.
elaaissaouiabdessamad Apr 15, 2026
3b41734
restore javadoc build after Jackson upgrade
MouhsinElmajdouby Apr 16, 2026
f2c1d20
Merge remote-tracking branch 'origin/release-1.0.7' into feature/ucp-…
elaaissaouiabdessamad Apr 16, 2026
7658992
fix: package UCP SPI service descriptors in Maven resources
elaaissaouiabdessamad Apr 18, 2026
90ffe96
docs: add ojdbc-provider-ucp-observability to root README
elaaissaouiabdessamad Apr 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .github/workflows/run-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,13 @@ jobs:
JACKSON_OSON_USERNAME=${{ secrets.TEST_JACKSON_OSON_USERNAME }}\n
JACKSON_OSON_PASSWORD=${{ secrets.TEST_JACKSON_OSON_PASSWORD }}\n
" >> ojdbc-provider-jackson-oson/test.properties


# Generate ojdbc-provider-observability/test.properties
echo -e "OBSERVABILITY_URL=${{ secrets.TEST_JACKSON_OSON_URL }}\n
OBSERVABILITY_USERNAME=${{ secrets.TEST_JACKSON_OSON_USERNAME }}\n
OBSERVABILITY_PASSWORD=${{ secrets.TEST_JACKSON_OSON_PASSWORD }}\n
" >> ojdbc-provider-observability/test.properties

# Generate ojdbc-provider-aws/test.properties
echo -e "AWS_S3_URL=${{ secrets.TEST_AWS_S3_URL }}\n
AWS_SECRETS_MANAGER_URL=${{ secrets.TEST_AWS_SECRETS_MANAGER_URL }}\n
Expand Down Expand Up @@ -157,5 +163,7 @@ jobs:
rm ojdbc-provider-gcp/test.properties

rm ojdbc-provider-jackson-oson/test.properties

rm ojdbc-provider-observability/test.properties

rm ojdbc-provider-aws/test.properties
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ Each module of this project contains a set of providers.
</dl>
<u>The next one contains a provider for Open Telemetry:</u>
<dl>
<dt><a href="ojdbc-provider-opentelemetry/README.md">Oracle JDBC Open Telemetry Provider</a></dt>
<dd>Provider for integration with Open Telemetry.</dd>
<dt><a href="ojdbc-provider-observability/README.md">Oracle JDBC Observability Provider</a></dt>
<dd>Provider for integration with Open Telemetry and Java Flight Recorder.</dd>
</dl>
<u>And the last one contains a provider for Jackson-OSON:</u>
<dl>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@
**/
public class AwsAppConfigConfigurationProvider extends OracleConfigurationParsableProvider {

private static final OracleConfigurationCache CACHE = OracleConfigurationCache.create(100);

static final ParameterSetParser PARAMETER_SET_PARSER = AwsConfigurationParameters.configureBuilder(
ParameterSetParser.builder()
.addParameter("value", APP_CONFIG_APPLICATION)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@
public class AwsParameterStoreConfigurationProvider
extends OracleConfigurationParsableProvider {

private static final OracleConfigurationCache CACHE = OracleConfigurationCache.create(100);

static final ParameterSetParser PARAMETER_SET_PARSER =
AwsConfigurationParameters.configureBuilder(
ParameterSetParser.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@
* See {@link #getInputStream(String)} for the spec of the JSON payload.
**/
public class AwsS3ConfigurationProvider extends OracleConfigurationParsableProvider {

private static final OracleConfigurationCache CACHE = OracleConfigurationCache.create(100);

private static final ParameterSetParser PARAMETER_SET_PARSER =
AwsConfigurationParameters.configureBuilder(
ParameterSetParser.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@
**/
public class AwsSecretsManagerConfigurationProvider extends OracleConfigurationParsableProvider {

private static final OracleConfigurationCache CACHE = OracleConfigurationCache.create(100);

/**
* Parser that recognizes the named parameters which appear in a URL,
* or a Json object.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ public class AzureVaultJsonProvider extends OracleConfigurationParsableProvider
*/
private static final Parameter<String> KEY = Parameter.create();

private static final OracleConfigurationCache CACHE = OracleConfigurationCache.create(100);

static final ParameterSetParser PARAMETER_SET_PARSER =
AzureConfigurationParameters.configureBuilder(
ParameterSetParser.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@
public class GcpCloudStorageConfigurationProvider
extends OracleConfigurationParsableProvider {

private static final OracleConfigurationCache CACHE = OracleConfigurationCache.create(100);

public static final String PROJECT_PARAMETER = "project";
public static final String BUCKET_PARAMETER = "bucket";
public static final String OBJECT_PARAMETER = "object";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@
public class GcpSecretManagerConfigurationProvider
extends OracleConfigurationParsableProvider {

private static final OracleConfigurationCache CACHE = OracleConfigurationCache.create(100);

@Override
public String getType() {
return "gcpsecretmanager";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@

public class DedicatedVaultSecretsManagerConfigurationProvider extends OracleConfigurationParsableProvider {

private static final OracleConfigurationCache CACHE = OracleConfigurationCache.create(100);

@Override
public InputStream getInputStream(String secretPath) {
final String valueFieldName = "value";
Expand Down
1 change: 0 additions & 1 deletion ojdbc-provider-jackson-oson/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc-provider-common</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
Expand Down
229 changes: 229 additions & 0 deletions ojdbc-provider-observability/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
# Oracle JDBC Observability Provider

This module contains a provider that adds tracing capabilities to the Oracle
JDBC driver. Two tracers are available:
* OTEL: adds Open Telemetry tracing capabilities.
* JFR: exports events to Java Flight Recorder.

This provider implements the TraceEventListener interface provided by the JDBC
driver which will be notified whenever events are generated in the driver and
will publish these events into Open Telemetry. These events include:
* roundtrips to the database server
* AC begin and success
* VIP down event

## Semantic Conventions (OpenTelemetry Tracer)

The OpenTelemetry tracer supports both **stable** and **experimental** (legacy)
OpenTelemetry semantic conventions for Oracle Database instrumentation.

### Semantic Convention Migration

The OpenTelemetry tracer supports three modes controlled by the `OTEL_SEMCONV_STABILITY_OPT_IN`
environment variable:

* **Empty/Not Set (default)** - Emits only experimental (legacy) conventions for backward compatibility
* **`database`** - Emits only the new stable Oracle Database semantic conventions
* **`database/dup`** - Emits both old and new conventions (dual mode for gradual migration)

This configuration can be set via environment variable or changed at runtime through the MBean interface.

See the [OpenTelemetry Database Semantic Conventions](https://opentelemetry.io/docs/specs/semconv/database/database-spans/)
for details on the stable conventions.

### Roundtrip Events

#### Stable Conventions
When `OTEL_SEMCONV_STABILITY_OPT_IN=database` or `database/dup`:

* **Required/Recommended Attributes**
* `db.system.name` - Always set to `"oracle.db"` (identifies Oracle Database)
* `db.namespace` - The Oracle service name from the connection
* `db.operation.name` - Database operation being executed (e.g. `ExecuteQuery`)
* `db.query.summary` - Low cardinality SQL command type (e.g., `SELECT`, `INSERT`)
* `server.address` - Database server hostname (e.g., `db.example.com`)
* `server.port` - Database server port (if non-default, i.e., not 1521)
* `oracle.db.instance.id` - Oracle database instance identifier
* `oracle.db.pdb` - Oracle Pluggable Database (PDB) name
* `oracle.db.query.sql.id` - Oracle SQL identifier (e.g., `8vq9m5kx3n2wh`)
* `oracle.db.session.id` - Oracle session identifier (e.g., `1234`)
* `oracle.db.server.pid` - Oracle server process ID on the database host (e.g., `56789`)
* `oracle.db.shard.name` - Oracle shard database name (only populated when using Oracle Sharding)
* `thread.id` - JVM thread ID that executed the operation
* `thread.name` - JVM thread name that executed the operation

* **Opt-In Attributes** *(only present if sensitive data is enabled)*
* `db.user` - Database username used for the connection (e.g., `APP_USER`, `SCOTT`)
* `db.query.text` - Full SQL statement text sent to the database
* `db.response.returned_rows` - Number of rows returned

* **Error Attributes** *(only present on errors)*
* `error.type` - Exception class name (e.g., `java.sql.SQLSyntaxErrorException`)
* `db.response.status_code` - Oracle error code in format `ORA-XXXXX` (e.g., `ORA-00942`, `ORA-01017`)

#### Legacy Conventions
When `OTEL_SEMCONV_STABILITY_OPT_IN` is empty/not set or `database/dup`:

* `Connection ID` - JDBC connection identifier
* `Database Operation` - Database operation being executed (e.g., `Commit`, `ExecuteQuery`)
* `Database Tenant` - Tenant name
* `SQL ID` - Oracle SQL identifier (e.g., `8vq9m5kx3n2wh`)
* `thread.id` - JVM thread ID that executed the operation
* `thread.name` - JVM thread name that executed the operation
* `Database User` *(only present if sensitive data is enabled)*
* `Original SQL Text` *(only present if sensitive data is enabled)*
* `Actual SQL Text` *(only present if sensitive data is enabled)*

### Application Continuity (AC) Replay Events

#### Stable Conventions
When `OTEL_SEMCONV_STABILITY_OPT_IN=database` or `database/dup`:

* `db.system.name` - Always set to `"oracle.db"` (identifies Oracle Database)
* `error.type` - The error message text that triggered the replay attempt
* `db.response.status_code` - Oracle error code that triggered replay in format `ORA-XXXXX` (e.g., `ORA-03135`, `ORA-25408`)
* `oracle.db.ac.retry_count` - Application Continuity replay attempt number

#### Legacy Conventions
When `OTEL_SEMCONV_STABILITY_OPT_IN` is empty/not set or `database/dup`:

* `Error Message` - Error message text that triggered the replay attempt
* `Error code`
* `SQL state`
* `Current replay retry count` - Application Continuity replay attempt number

### VIP Retry Events

#### Stable Conventions
When `OTEL_SEMCONV_STABILITY_OPT_IN=database` or `database/dup`:

* `db.system.name` - Always set to `"oracle.db"` (identifies Oracle Database)
* `error.type` - The error message that triggered the VIP retry
* `server.address` - The VIP (Virtual IP) address that is being retried after failure

**Opt-In VIP Debug Attributes** *(only present if sensitive data is enabled)*:
* `server.port` - Database server port number being retried
* `oracle.db.vip.protocol` - Connection protocol being used
* `oracle.db.vip.failed_host` - The hostname that failed, triggering the VIP retry
* `oracle.db.vip.service_name` - Oracle service name for the failed connection
* `oracle.db.vip.sid` - Oracle System Identifier (SID) for the failed connection
* `oracle.db.vip.connection_descriptor` - Complete JDBC connection descriptor string

#### Legacy Conventions
When `OTEL_SEMCONV_STABILITY_OPT_IN` is empty/not set or `database/dup`:

* `Error message`
* `VIP Address`
* `Protocol` *(only present if sensitive data is enabled)*
* `Host` *(only present if sensitive data is enabled)*
* `Port` *(only present if sensitive data is enabled)*
* `Service name` *(only present if sensitive data is enabled)*
* `SID` *(only present if sensitive data is enabled)*
* `Connection data` *(only present if sensitive data is enabled)*

## Installation

This provider is distributed as single jar on the Maven Central Repository. The
jar is compiled for JDK 11, and is forward compatible with later JDK versions.
The coordinates for the latest release are:

```xml
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc-provider-observability</artifactId>
<version>1.0.6</version>
</dependency>
```

## Usage

To use the Oracle JDBC observability provider just add the artifact to the
application's classpath and set the following connection property:

```java
oracle.jdbc.provider.traceEventListener=observability-trace-event-listener-provider
```

A unique identifier connection property allows to identify the trace event
listener. Connections setting the same unique identifier use the same trace
event listener and share the same configuration.

```java
oracle.jdbc.provider.traceEventListener.unique_identifier=<unique identifier>
```

If no unique identifier is provided, the unique idetifier "default" is used.

### Enabling Stable Semantic Conventions (OpenTelemetry)

To use the new stable OpenTelemetry semantic conventions, set the environment variable:
```bash
# Use only stable conventions
export OTEL_SEMCONV_STABILITY_OPT_IN=database

# OR use both old and new conventions (dual mode for migration)
export OTEL_SEMCONV_STABILITY_OPT_IN=database/dup
```

## Configuration

The provider can be configured by:
* using system properties,
```java
System.setProperty("oracle.jdbc.provider.observability.enabledTracers", "OTEL,JFR");
System.setProperty("oracle.jdbc.provider.observability.sensitiveDataEnabled", "true");
```
* or using the MBean.
```java
ObservabilityTraceEventListener listener = ObservabilityTraceEventListener.getTraceEventListener("<unique identifier>");
ObjectName objectName = new ObjectName(listener.getMBeanObjectName());
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
server.setAttribute(objectName, new Attribute("EnabledTracers", "OTEL,JFR"));
server.setAttribute(objectName, new Attribute("SensitiveDataEnabled", "true"));
```
* it is also possible to use the ObservabilityConfiguration object directly by
calling the
```java
ObservabilityConfiguration configuration = ObservabilityTraceEventListener.getObservabilityConfiguration("<name>");
configuration.setEnabledTracers("OTEL,JFR");
configuration.setSensitiveDataEnabled(true);
```

## Backward compatibility

### Usage

The provider can also be used by setting the following connection property:

```java
oracle.jdbc.provider.traceEventListener=open-telemetry-trace-event-listener-provider
```

When this property is used only the OTEL tracer can be used.

### Configuration

To ensure backward compatibility Oracle JDBC provider for Open Telemetry configuration
properties and MBean have been kept. When these properties and MBean are used only
the Open Telemetry tracer will be enabled.

The Oracle JDBC provider for Open Telemetry can be configured using system properties
or a MBean. Two parameters can be configured:
* **Enabled**: when enabled (*true*) traces will be exported to Open
Telemetry. This property is **enabled by default**.
* **Sensitive data enabled**: when enabled (*true*) attributes containing
sensitive information like SQL statements and connection URL will be included
in the traces. This property is **disabled by default**.

The system properties are "oracle.jdbc.provider.opentelemetry.enabled" and
"oracle.jdbc.provider.opentelemetry.sensitive-enabled" respectively and the MBean
exposes two attributes "Enabled" and "SensitiveDataEnabled".

The sample code below shows how to retrieve the value of an attribute:
```java
ObservabilityTraceEventListener listener = ObservabilityTraceEventListener.getTraceEventListener("<name>");
ObjectName objectName = new ObjectName(listener.getMBeanObjectName());
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
boolean isEnabled = Boolean.valueOf(server.getAttribute(objectName, "Enabled").toString())
.booleanValue();
```
Loading
Loading