|
21 | 21 | #include "engine.h" |
22 | 22 | #include "incbin.h" |
23 | 23 | #include "os.h" |
| 24 | +#include "otel_process_ctx.h" |
24 | 25 | #include "profiler.h" |
25 | 26 | #include "thread.h" |
26 | 27 | #include "tsc.h" |
@@ -110,7 +111,7 @@ Java_com_datadoghq_profiler_JavaProfiler_execute0(JNIEnv *env, jobject unused, |
110 | 111 | } |
111 | 112 |
|
112 | 113 | extern "C" DLLEXPORT jstring JNICALL |
113 | | -Java_com_datadoghq_profiler_JavaProfiler_getStatus0(JNIEnv* env, |
| 114 | +Java_com_datadoghq_profiler_JavaProfiler_getStatus0(JNIEnv* env, |
114 | 115 | jobject unused) { |
115 | 116 | char msg[2048]; |
116 | 117 | int ret = Profiler::instance()->status((char*)msg, sizeof(msg) - 1); |
@@ -427,3 +428,93 @@ Java_com_datadoghq_profiler_ActiveBitmap_getActiveCountAddr0(JNIEnv *env, |
427 | 428 | jclass unused) { |
428 | 429 | return (jlong)Profiler::instance()->threadFilter()->addressOfSize(); |
429 | 430 | } |
| 431 | + |
| 432 | +// Static variable to track the current published context |
| 433 | +static otel_process_ctx_result* current_published_context = nullptr; |
| 434 | + |
| 435 | +extern "C" DLLEXPORT void JNICALL |
| 436 | +Java_com_datadoghq_profiler_OTelContext_setProcessCtx0(JNIEnv *env, |
| 437 | + jclass unused, |
| 438 | + jstring env_data, |
| 439 | + jstring hostname, |
| 440 | + jstring runtime_id, |
| 441 | + jstring service, |
| 442 | + jstring version, |
| 443 | + jstring tracer_version |
| 444 | + ) { |
| 445 | + JniString env_str(env, env_data); |
| 446 | + JniString hostname_str(env, hostname); |
| 447 | + JniString runtime_id_str(env, runtime_id); |
| 448 | + JniString service_str(env, service); |
| 449 | + JniString version_str(env, version); |
| 450 | + JniString tracer_version_str(env, tracer_version); |
| 451 | + |
| 452 | + otel_process_ctx_data data = { |
| 453 | + .deployment_environment_name = const_cast<char*>(env_str.c_str()), |
| 454 | + .host_name = const_cast<char*>(hostname_str.c_str()), |
| 455 | + .service_instance_id = const_cast<char*>(runtime_id_str.c_str()), |
| 456 | + .service_name = const_cast<char*>(service_str.c_str()), |
| 457 | + .service_version = const_cast<char*>(version_str.c_str()), |
| 458 | + .telemetry_sdk_language = const_cast<char*>("java"), |
| 459 | + .telemetry_sdk_version = const_cast<char*>(tracer_version_str.c_str()), |
| 460 | + .telemetry_sdk_name = const_cast<char*>("dd-trace-java"), |
| 461 | + .resources = NULL // TODO: Arbitrary tags not supported yet for Java |
| 462 | + }; |
| 463 | + |
| 464 | + otel_process_ctx_result result = otel_process_ctx_publish(&data); |
| 465 | +} |
| 466 | + |
| 467 | +extern "C" DLLEXPORT jobject JNICALL |
| 468 | +Java_com_datadoghq_profiler_OTelContext_readProcessCtx0(JNIEnv *env, jclass unused) { |
| 469 | +#ifndef OTEL_PROCESS_CTX_NO_READ |
| 470 | + otel_process_ctx_read_result result = otel_process_ctx_read(); |
| 471 | + |
| 472 | + if (!result.success) { |
| 473 | + // Return null if reading failed |
| 474 | + return nullptr; |
| 475 | + } |
| 476 | + |
| 477 | + // Convert C strings to Java strings |
| 478 | + jstring jDeploymentEnvironmentName = result.data.deployment_environment_name ? |
| 479 | + env->NewStringUTF(result.data.deployment_environment_name) : nullptr; |
| 480 | + jstring jHostName = result.data.host_name ? |
| 481 | + env->NewStringUTF(result.data.host_name) : nullptr; |
| 482 | + jstring jServiceInstanceId = result.data.service_instance_id ? |
| 483 | + env->NewStringUTF(result.data.service_instance_id) : nullptr; |
| 484 | + jstring jServiceName = result.data.service_name ? |
| 485 | + env->NewStringUTF(result.data.service_name) : nullptr; |
| 486 | + jstring jServiceVersion = result.data.service_version ? |
| 487 | + env->NewStringUTF(result.data.service_version) : nullptr; |
| 488 | + jstring jTelemetrySdkLanguage = result.data.telemetry_sdk_language ? |
| 489 | + env->NewStringUTF(result.data.telemetry_sdk_language) : nullptr; |
| 490 | + jstring jTelemetrySdkVersion = result.data.telemetry_sdk_version ? |
| 491 | + env->NewStringUTF(result.data.telemetry_sdk_version) : nullptr; |
| 492 | + jstring jTelemetrySdkName = result.data.telemetry_sdk_name ? |
| 493 | + env->NewStringUTF(result.data.telemetry_sdk_name) : nullptr; |
| 494 | + // TODO: result.data.resources not supported yet for Java |
| 495 | + |
| 496 | + otel_process_ctx_read_drop(&result); |
| 497 | + |
| 498 | + // Find the ProcessContext class |
| 499 | + jclass processContextClass = env->FindClass("com/datadoghq/profiler/OTelContext$ProcessContext"); |
| 500 | + if (!processContextClass) { |
| 501 | + return nullptr; |
| 502 | + } |
| 503 | + |
| 504 | + // Find the constructor |
| 505 | + jmethodID constructor = env->GetMethodID(processContextClass, "<init>", |
| 506 | + "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); |
| 507 | + if (!constructor) { |
| 508 | + return nullptr; |
| 509 | + } |
| 510 | + |
| 511 | + // Create the ProcessContext object |
| 512 | + jobject processContext = env->NewObject(processContextClass, constructor, |
| 513 | + jDeploymentEnvironmentName, jHostName, jServiceInstanceId, jServiceName, jServiceVersion, jTelemetrySdkLanguage, jTelemetrySdkVersion, jTelemetrySdkName); |
| 514 | + |
| 515 | + return processContext; |
| 516 | +#else |
| 517 | + // If OTEL_PROCESS_CTX_NO_READ is defined, return null |
| 518 | + return nullptr; |
| 519 | +#endif |
| 520 | +} |
0 commit comments