diff --git a/.env b/.env index 29b9118758..dbddebf4fa 100644 --- a/.env +++ b/.env @@ -8,6 +8,7 @@ IMAGE_NAME=ghcr.io/open-telemetry/demo COLLECTOR_CONTRIB_IMAGE=otel/opentelemetry-collector-contrib:0.93.0 GRAFANA_IMAGE=grafana/grafana:10.3.1 JAEGERTRACING_IMAGE=jaegertracing/all-in-one:1.53 +# must also update version field in /src/grafana/provisioning/datasources/opensearch.yml OPENSEARCH_IMAGE=opensearchproject/opensearch:2.11.1 POSTGRES_IMAGE=postgres:16.1 PROMETHEUS_IMAGE=quay.io/prometheus/prometheus:v2.49.1 diff --git a/CHANGELOG.md b/CHANGELOG.md index c4a00c9836..3747121921 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,8 @@ the release. ([#1363](https://github.com/open-telemetry/opentelemetry-demo/pull/1363)) * [tests] update trace based tests for semantic conventions ([#1377](https://github.com/open-telemetry/opentelemetry-demo/pull/1377)) +* [currencyservice] Add OTLP logs + ([#1378](https://github.com/open-telemetry/opentelemetry-demo/pull/1378)) * [cartservice] update .NET to .NET 8.0.2 ([#1380](https://github.com/open-telemetry/opentelemetry-demo/pull/1380)) diff --git a/docker-compose.minimal.yml b/docker-compose.minimal.yml index d7cdabb43b..54c37e4764 100644 --- a/docker-compose.minimal.yml +++ b/docker-compose.minimal.yml @@ -129,9 +129,6 @@ services: context: ./src/currencyservice cache_from: - ${IMAGE_NAME}:${IMAGE_VERSION}-currencyservice - args: - - GRPC_VERSION=1.46.0 - - OPENTELEMETRY_VERSION=1.5.0 deploy: resources: limits: @@ -141,6 +138,7 @@ services: - "${CURRENCY_SERVICE_PORT}" environment: - CURRENCY_SERVICE_PORT + - VERSION=${IMAGE_VERSION} - OTEL_EXPORTER_OTLP_ENDPOINT - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.name=currencyservice # The C++ SDK does not support OTEL_SERVICE_NAME depends_on: diff --git a/docker-compose.yml b/docker-compose.yml index 4eaabc52bd..af86a0635d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -160,9 +160,6 @@ services: context: ./src/currencyservice cache_from: - ${IMAGE_NAME}:${IMAGE_VERSION}-currencyservice - args: - - GRPC_VERSION=1.46.0 - - OPENTELEMETRY_VERSION=1.5.0 deploy: resources: limits: @@ -172,6 +169,7 @@ services: - "${CURRENCY_SERVICE_PORT}" environment: - CURRENCY_SERVICE_PORT + - VERSION=${IMAGE_VERSION} - OTEL_EXPORTER_OTLP_ENDPOINT - OTEL_RESOURCE_ATTRIBUTES=${OTEL_RESOURCE_ATTRIBUTES},service.name=currencyservice # The C++ SDK does not support OTEL_SERVICE_NAME depends_on: diff --git a/src/currencyservice/src/logger_common.h b/src/currencyservice/src/logger_common.h new file mode 100644 index 0000000000..cd58165580 --- /dev/null +++ b/src/currencyservice/src/logger_common.h @@ -0,0 +1,35 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#include "opentelemetry/exporters/otlp/otlp_grpc_exporter_factory.h" +#include "opentelemetry/logs/provider.h" +#include "opentelemetry/sdk/logs/logger.h" +#include "opentelemetry/sdk/logs/logger_provider_factory.h" +#include "opentelemetry/sdk/logs/simple_log_record_processor_factory.h" +#include "opentelemetry/sdk/logs/logger_context_factory.h" +#include "opentelemetry/exporters/otlp/otlp_grpc_log_record_exporter_factory.h" + +using namespace std; +namespace nostd = opentelemetry::nostd; +namespace otlp = opentelemetry::exporter::otlp; +namespace logs = opentelemetry::logs; +namespace logs_sdk = opentelemetry::sdk::logs; + +namespace +{ + void initLogger() { + otlp::OtlpGrpcLogRecordExporterOptions loggerOptions; + auto exporter = otlp::OtlpGrpcLogRecordExporterFactory::Create(loggerOptions); + auto processor = logs_sdk::SimpleLogRecordProcessorFactory::Create(std::move(exporter)); + std::vector> processors; + processors.push_back(std::move(processor)); + auto context = logs_sdk::LoggerContextFactory::Create(std::move(processors)); + std::shared_ptr provider = logs_sdk::LoggerProviderFactory::Create(std::move(context)); + opentelemetry::logs::Provider::SetLoggerProvider(provider); + } + + nostd::shared_ptr getLogger(std::string name){ + auto provider = logs::Provider::GetLoggerProvider(); + return provider->GetLogger(name + "_logger", name, OPENTELEMETRY_SDK_VERSION); + } +} diff --git a/src/currencyservice/src/meter_common.h b/src/currencyservice/src/meter_common.h index 61ae118994..72f86f4695 100644 --- a/src/currencyservice/src/meter_common.h +++ b/src/currencyservice/src/meter_common.h @@ -16,22 +16,14 @@ namespace otlp_exporter = opentelemetry::exporter::otlp; namespace { - std::string version{ "1.3.0" }; - std::string name{ "app_currency" }; - std::string schema{ "https://opentelemetry.io/schemas/1.2.0" }; - void initMeter() { // Build MetricExporter otlp_exporter::OtlpGrpcMetricExporterOptions otlpOptions; - // Configuration via environment variable not supported yet - //otlpOptions.aggregation_temporality = otlp_exporter::PreferredAggregationTemporality::kCumulative; auto exporter = otlp_exporter::OtlpGrpcMetricExporterFactory::Create(otlpOptions); // Build MeterProvider and Reader metric_sdk::PeriodicExportingMetricReaderOptions options; - //options.export_interval_millis = std::chrono::milliseconds(60000); - //options.export_timeout_millis = std::chrono::milliseconds(30000); std::unique_ptr reader{ new metric_sdk::PeriodicExportingMetricReader(std::move(exporter), options) }; auto provider = std::shared_ptr(new metric_sdk::MeterProvider()); @@ -40,7 +32,7 @@ namespace metrics_api::Provider::SetMeterProvider(provider); } - nostd::unique_ptr> initIntCounter() + nostd::unique_ptr> initIntCounter(std::string name, std::string version) { std::string counter_name = name + "_counter"; auto provider = metrics_api::Provider::GetMeterProvider(); diff --git a/src/currencyservice/src/server.cpp b/src/currencyservice/src/server.cpp index 26b07a6524..e824e9ff39 100644 --- a/src/currencyservice/src/server.cpp +++ b/src/currencyservice/src/server.cpp @@ -1,6 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include #include #include #include @@ -11,6 +12,7 @@ #include "opentelemetry/trace/span_context_kv_iterable_view.h" #include "opentelemetry/baggage/baggage.h" #include "opentelemetry/nostd/string_view.h" +#include "logger_common.h" #include "meter_common.h" #include "tracer_common.h" @@ -80,7 +82,11 @@ namespace {"ZAR", 16.0583}, }; + std::string version = std::getenv("VERSION"); + std::string name{ "currencyservice" }; + nostd::unique_ptr> currency_counter; + nostd::shared_ptr logger; class HealthServer final : public grpc::health::v1::Health::Service { @@ -127,10 +133,11 @@ class CurrencyService final : public oteldemo::CurrencyService::Service span->AddEvent("Currencies fetched, response sent back"); span->SetStatus(StatusCode::kOk); + + logger->Info(std::string(__func__) + " successful"); + // Make sure to end your spans! span->End(); - - std::cout << __func__ << " successful" << std::endl; return Status::OK; } @@ -203,14 +210,18 @@ class CurrencyService final : public oteldemo::CurrencyService::Service // End the span span->AddEvent("Conversion successful, response sent back"); span->SetStatus(StatusCode::kOk); - std::cout << __func__ << " conversion successful" << std::endl; + + logger->Info(std::string(__func__) + " conversion successful"); + span->End(); return Status::OK; } catch(...) { span->AddEvent("Conversion failed"); span->SetStatus(StatusCode::kError); - std::cout << __func__ << " conversion failure" << std::endl; + + logger->Error(std::string(__func__) + " conversion failure"); + span->End(); return Status::CANCELLED; } @@ -237,7 +248,7 @@ void RunServer(uint16_t port) builder.AddListeningPort(address, grpc::InsecureServerCredentials()); std::unique_ptr server(builder.BuildAndStart()); - std::cout << "Currency Server listening on port: " << address << std::endl; + logger->Info("Currency Server listening on port: " + address); server->Wait(); server->Shutdown(); } @@ -252,11 +263,11 @@ int main(int argc, char **argv) { uint16_t port = atoi(argv[1]); - std::cout << "Port: " << port << "\n"; - initTracer(); initMeter(); - currency_counter = initIntCounter(); + initLogger(); + currency_counter = initIntCounter(name, version); + logger = getLogger(name); RunServer(port); return 0; diff --git a/src/grafana/provisioning/datasources/opensearch.yaml b/src/grafana/provisioning/datasources/opensearch.yaml index 1de083338b..a6c085b122 100644 --- a/src/grafana/provisioning/datasources/opensearch.yaml +++ b/src/grafana/provisioning/datasources/opensearch.yaml @@ -16,4 +16,5 @@ datasources: logLevelField: severity logMessageField: body pplEnabled: true - timeField: "@timestamp" + timeField: observedTimestamp + version: 2.11.1