Commit Graph

136 Commits

Author SHA1 Message Date
chrfwow e2813b2e5d
feat: add logging on provider state transitions (#1444)
* NOISSUE add logging on provider state transitions

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>

* fix npe

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>

* fix failing test

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>

* fix failing test

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>

* format

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>

---------

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>
Co-authored-by: Simon Schrottner <simon.schrottner@dynatrace.com>
2025-05-14 11:11:36 +02:00
Liran M d0ae548277
feat: add telemetry helper utils (#1346)
* feat: add telemetry helper utils

Signed-off-by: liran2000 <liran2000@gmail.com>

* updates

Signed-off-by: liran2000 <liran2000@gmail.com>

* fixup: apply changes according to the semconv

The semconv has changed, and some attributes have been
renamed. Furthermore, the body usage is deprecated
and should be part of the attributes.

see: https://github.com/open-telemetry/semantic-conventions/pull/1990/
Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>

* fixup: fix tests

Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>

* fixup: fix spotless

Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>

---------

Signed-off-by: liran2000 <liran2000@gmail.com>
Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>
Co-authored-by: Simon Schrottner <simon.schrottner@dynatrace.com>
2025-05-13 09:45:16 +02:00
renovate[bot] 3403510515
chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10 (#103)
* chore(deps): update dependency com.puppycrawl.tools:checkstyle to v10

* Fix javadoc format

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>

---------

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: christian.lutnik <christian.lutnik@dynatrace.com>
Co-authored-by: Simon Schrottner <simon.schrottner@dynatrace.com>
2025-05-06 06:19:41 +00:00
Abhay Porwal 96cf9c7f54
docs: add try-catch example for setProviderAndWait usage (#1433)
* added the detailed instructions for the setProviderAndWait

Signed-off-by: Abhay <abhayakg123@gmail.com.com>

* fixup: checkstyle issues

Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>

---------

Signed-off-by: Abhay <abhayakg123@gmail.com.com>
Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>
Co-authored-by: Abhay <abhayakg123@gmail.com.com>
Co-authored-by: Simon Schrottner <simon.schrottner@dynatrace.com>
2025-04-28 14:34:19 +02:00
Todd Baert 24ef9dd290
fix: hooks not run in NOT_READY/FATAL (#1392)
* fix: hooks not run in NOT_READY/FATAL

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-03-27 09:22:19 -04:00
chrfwow 69b571eda7
fix: equals and hashcode of several classes (#1364)
fix: equals and hashcode of several classes
2025-03-13 08:33:21 +01:00
chrfwow c37d249776
feat: implement gherkin tests for context merging (#1363)
feat: implement gherkin tests for context merging (#1363)
2025-03-07 11:04:46 +01:00
chrfwow dd9227a924
feat: update test harness with metadata assertions #1467 (#1319)
* feat: implement gherkin tests

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>

* fixup! feat: implement gherkin tests

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>

* fixup! feat: implement gherkin tests

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>

* fixup! feat: implement gherkin tests

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>

* fixup: add version for dependency

Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>

---------

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>
Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>
Co-authored-by: Simon Schrottner <simon.schrottner@dynatrace.com>
2025-02-19 16:27:46 +01:00
Simon Schrottner 88baa65dd0
test: Reduce usage of singelton within our tests and implementations (#1331)
Our tests are great, but often we rely on our own Singelton for testing purposes.
This can create concurrency issues or make testing really hard.
By instantiating a own API object for each test we ensure that we are not messing
with each other.
Furthermore we should not use `.getInstance()` within our own implementation.

Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-02-18 19:19:18 +01:00
Philipp Fehre c33ac2d9b2
fix: possible event-related deadlocks with some providers (#1314)
* Move event emitting off the main thread to avoid deadlocks

When stacking event emitting inside an EventProvider, when using sychronization
the EventProvider can deadlock, to avoid this move the event emitting of the
main thread.

Signed-off-by: Philipp Fehre <philipp@fehre.co.uk>

* Test fixes

Test provider should respect the init-delay during all test

Signed-off-by: Philipp Fehre <philipp@fehre.co.uk>

* Add timeout to EventProviderTest

With the events being executed on a different thread, we need to wait to make
sure the thread is scheduled to have the events emitted.

Signed-off-by: Philipp Fehre <philipp@fehre.co.uk>

* Don't reuse the JVM Process

Signed-off-by: Philipp Fehre <philipp@fehre.co.uk>

---------

Signed-off-by: Philipp Fehre <philipp@fehre.co.uk>
Co-authored-by: Philipp Fehre <philipp.fehre@mollie.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-02-13 14:01:58 -05:00
Jonathan Norris 08c38fb553
fix: TrackingEventDetails interface to include numeric getValue() call (#1328)
Signed-off-by: Jonathan Norris <jonathan@taplytics.com>
2025-02-13 13:50:19 -05:00
chrfwow ae85278c30
feat: Add evaluation details to finally hook stage #1246 (#1262)
Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-01-09 16:12:14 -05:00
Simon Schrottner 64ec68bcf5
build: change checkstyle to google code format, plus adding spotless (#1264)
Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>
2025-01-03 19:06:22 +01:00
warber 64ad644bdb
feat: add tracking as per spec (#1228)
feat: add tracking as per spec

---------

Signed-off-by: Bernd Warmuth <bernd.warmuth@dynatrace.com>
2024-12-06 10:19:36 -05:00
warber 473be8659c
test: Update gherkin test sub module (#1236)
Signed-off-by: Bernd Warmuth <bernd.warmuth@dynatrace.com>
2024-12-05 16:10:49 +00:00
Todd Baert fd7659a46f
perf: reduce hashmap allocations (#1178)
* chore: reduce hashmap allocations

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-24 08:41:55 -04:00
Todd Baert 0009e23c7b
chore: improve benchmark realism; add more context (#1182)
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-23 12:33:02 -04:00
Todd Baert d6d284b6a3
chore: flaky test (#1169)
chore: blocking set-provider in test

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-18 10:10:28 -04:00
Todd Baert 473a05784c chore: fix another flaky test
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-15 13:47:12 -04:00
Todd Baert 457da96e7b chore: fix flaky test
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-15 12:36:36 -04:00
Todd Baert 90088188c9
perf: add heap benchmark and reduce allocations (#1156)
* chore: add heap benchmark and reduce allocations

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-15 09:47:51 -04:00
chrfwow 1b1e527e78
feat: make provider interface "stateless"; SDK maintains provider state (#1096)
* Make provider interface "stateless", SDK maintains provider state

Signed-off-by: christian.lutnik <christian.lutnik@dynatrace.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: christian.lutnik <christian.lutnik@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-09-23 12:45:34 -04:00
Simon Schrottner 6fc0b90610
feat: error resolution flow control without exceptions (#1095)
* Allowing flowcontrol with out exceptions

So far we used exception to handle our flowcontrol, but
Exceptions are costly. In the end we enriched our
evaluation Details with errorCode and errorMessage.
This can be also handled by the providers if desired,
to reduce the execution footprint in errornous cases,
which do not have to be exceptions.

Eg FlagNotFound - it might be the case, but in performance
critical environments, an exception rather than a normal
return, can cause overhead and can be already too costly.

Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>

* fix: adding reason, and removing stacktraces from errors

Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>

* Update src/main/java/dev/openfeature/sdk/exceptions/TypeMismatchError.java

Co-authored-by: Justin Abrahms <justin@abrah.ms>
Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>

---------

Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>
Co-authored-by: Justin Abrahms <justin@abrah.ms>
2024-09-17 09:15:43 -04:00
Todd Baert 037826fe1b
feat: add logging hook, rm logging from evaluation (#1084)
* feat: add logging hook, rm logging from evaluation

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

* fixup: remove public

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

* fixup: debug, not info

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

* fixup: move comment

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

* fixup: underscoes

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

* fixup: add to readme

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-09-05 12:33:51 -04:00
Todd Baert 35d4cc23c8
chore: various non-functional refactors (#1066)
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-08-26 09:16:10 -04:00
Ryan Prayogo b7ed041eed
fix: Use ConcurrentHashMap for InMemoryProvider (#1057)
* fix: Use ConcurrentHashMap for InMemoryProvider

Signed-off-by: Ryan Prayogo <57620+ryanprayogo@users.noreply.github.com>

* fix: make the flags field variable final

Signed-off-by: Ryan Prayogo <57620+ryanprayogo@users.noreply.github.com>

* chore: Use Collections.singletonList instead of Arrays.asList

Signed-off-by: Ryan Prayogo <57620+ryanprayogo@users.noreply.github.com>

* chore: Update javadoc and parameter name

Signed-off-by: Ryan Prayogo <57620+ryanprayogo@users.noreply.github.com>

* fixup: await verify

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

* fixup: remove test, key diffing

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

---------

Signed-off-by: Ryan Prayogo <57620+ryanprayogo@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-08-22 15:48:45 -04:00
Todd Baert dbf967a860
fix: updated context not passed to all hooks (#1049)
* fix: updated context not passed to all hooks

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

* fixup: checkstyle

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-08-20 15:33:34 -04:00
Todd Baert 4126b511fb
chore: javadoc and tests for api, context (#942)
* chore: javadoc and tests for api, context

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

* fixup: lint

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-06-14 10:14:49 -04:00
jarebudev 5c0aaaa8bc
feat: implement domain scoping (#934)
* initial changes for implementing domain scoping

Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com>

* completed the rest of the renaming and tidying up

Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com>

* applied code review suggested changes

Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com>

* introdcue a dedicated interface for client metadata

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

* add deprecated default getName to be backward compatible as much as possible

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

---------

Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com>
Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>
Co-authored-by: Kavindu Dodanduwa <Kavindu-Dodan@users.noreply.github.com>
Co-authored-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>
2024-06-11 09:49:46 -07:00
jarebudev dbfeb72bc5
fix: run error hook when provider returns error code (#951)
Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com>
2024-05-30 16:47:23 -04:00
Dave 1a46aea242
fix: PMD warnings with new version (#936)
* chore(deps): update dependency org.apache.maven.plugins:maven-pmd-plugin to v3.22.0

* removed redundancy from eventdetails, SuppressWarnings in OpenfeatureAPI and Client

Signed-off-by: DBlanchard88 <davidblanchard88@gmail.com>

* Update src/main/java/dev/openfeature/sdk/OpenFeatureClient.java

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

---------

Signed-off-by: DBlanchard88 <davidblanchard88@gmail.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-05-15 13:18:33 -04:00
Dave cd7470dd7a
fix: removed javax.nullable annotations (#921)
removing nullable annotation

Signed-off-by: DBlanchard88 <davidblanchard88@gmail.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-05-03 10:50:24 -07:00
Dave d69cf5d49b
fix: consistent method chainability (#913)
* mutablecontext settargetkey now return(s) this method chainable

Signed-off-by: DBlanchard88 <davidblanchard88@gmail.com>

* addHooks & setEvaluationContext are now chainable

Signed-off-by: DBlanchard88 <davidblanchard88@gmail.com>

* OpenFeatureAPI setEvaluationContext new chainable

Signed-off-by: DBlanchard88 <davidblanchard88@gmail.com>

* Update src/test/java/dev/openfeature/sdk/MutableContextTest.java

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>

---------

Signed-off-by: DBlanchard88 <davidblanchard88@gmail.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-05-02 12:04:09 -04:00
jarebudev 8dec14fbea
fix: shutdown method blocks until task executor shutdown completes (#873)
* shutdown method blocks until task executor shutdown completes

Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com>

* addressed sonar issue with not handling interrupt during waiting

Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com>

---------

Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-04-06 07:47:42 -04:00
Sviatoslav Sharaev de5aa6420f
feat: context propagation (#848)
Signed-off-by: Sviatoslav Sharaev <sviatoslav.sharaev@gmail.com>
Co-authored-by: Kavindu Dodanduwa <Kavindu-Dodan@users.noreply.github.com>
2024-03-28 21:17:22 -04:00
Kavindu Dodanduwa 46d04feb4b
chore: improve contrib guide (#863)
* improve contribution guide and remove deprecation

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

* revert mockito bump

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

* revert proposed change

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

---------

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>
2024-03-28 09:45:16 -04:00
Adam Roberts d51cacbff6
fix: issue #859 (#860)
* fix: issue #859 Added failing tests

Signed-off-by: Adam Roberts <adam.roberts@collibra.com>

* fix: issue #859 Fixed the logic to allow the tests to pass by copying the passed in attributes

Signed-off-by: Adam Roberts <adam.roberts@collibra.com>

---------

Signed-off-by: Adam Roberts <adam.roberts@collibra.com>
2024-03-22 11:15:16 -07:00
Liran M 48a196c50d
fix: missing targeting key should return null (#849)
* missing targeting key should return null

Problem:
getTargetingKey of missing targeting key causing NullPointerException
Solution:
getTargetingKey of missing targeting key returns null

Signed-off-by: liran2000 <liran2000@gmail.com>

* add MutableContextTest for test coverage

Signed-off-by: liran2000 <liran2000@gmail.com>

---------

Signed-off-by: liran2000 <liran2000@gmail.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-03-22 10:41:56 -04:00
Kavindu Dodanduwa f7a9d57421
fix: improve targetingKey handling in the context (#805)
improve targeting key handling

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>
2024-02-14 15:17:58 -08:00
Kavindu Dodanduwa 6c8657d520
chore: various improvements as suggested by sonar (#797)
* various improvements as suggested by sonar

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

* revert clonable change

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

---------

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>
2024-02-13 08:39:45 -08:00
Todd Baert da47b7f9c0
fix: setProviderAndWait must throw (#794)
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-02-08 15:19:20 -05:00
Giovanni Liva 36f5832727
perf: improve error handling (#739)
* perf: improve error handling

Signed-off-by: Giovanni Liva <giovanni.liva@dynatrace.com>

* add synchronized keyword

Signed-off-by: Giovanni Liva <giovanni.liva@dynatrace.com>

---------

Signed-off-by: Giovanni Liva <giovanni.liva@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2023-12-22 12:56:48 -05:00
Kavindu Dodanduwa 3319e55870
fix: tolerate duplicate provider registrations (#725)
* fix provider mulitple regiration issue

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

* fix lint

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

* fix tests

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

* improve test and add check for unused imports

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

---------

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>
2023-12-12 12:43:14 -08:00
Todd Baert 3ab330a759
fix: null handling with Structure, Value (#663)
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Giovanni Liva <giovanni.liva@dynatrace.com>
2023-10-24 14:46:26 -04:00
Todd Baert fe5a20f2c3
feat: implement spec 0.7.0 changes (#655)
* feat: implement spec 0.7.0 changes

* run any event handler immediately if the provider is in the associated state, not just ready
* add providerName to event details
* add STALE provider state
* update/add associated tests
* also fixed spec/test associations mismatches from previous changes

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Thiyagu GK <thiyagu103@gmail.com>
2023-10-23 10:04:52 -04:00
Todd Baert 8c595b0227
fix: RejectedExecutionException on shutdown (#652)
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2023-10-12 16:15:48 -04:00
Kavindu Dodanduwa c66b99579f
fix: make executor threads deamon (#601)
* make executor threads deamon

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

* unify annotation usage

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>

---------

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>
2023-09-08 11:54:01 -07:00
Liran M d063bf292c
fix: NPE on named provider init/shutdown (#595)
* fix NPE on named provider init
* add condition for not calling shutdown on null old provider

Signed-off-by: liran2000 <liran2000@gmail.com>
2023-09-07 16:11:58 -04:00
Liran M 506e89fd34
feat: add method to set provider and block during init (#563)
* feat: spec 1.1.8 - setProviderAndWait

The API SHOULD provide functions to set a provider and wait for the initialize function to return or throw

Signed-off-by: liran2000 <liran2000@gmail.com>

* remove method overloading from package private class

Signed-off-by: liran2000 <liran2000@gmail.com>

* add test case for spec 2.4.5

Signed-off-by: liran2000 <liran2000@gmail.com>

* minor updates

Signed-off-by: liran2000 <liran2000@gmail.com>

---------

Signed-off-by: liran2000 <liran2000@gmail.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2023-08-28 15:43:59 -04:00
Todd Baert 1f28921fec
chore: fix jacoco coverage minimum, throw in memory provider (#561)
chore: fix codecov, throw in memory provider

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2023-08-16 12:37:21 -04:00