Skip to content

Commit dba13fe

Browse files
authored
ETW Metrics Exporter for Windows (#228)
1 parent 19f74b9 commit dba13fe

File tree

14 files changed

+237
-45
lines changed

14 files changed

+237
-45
lines changed

exporters/geneva/CMakeLists.txt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,33 @@ cmake_minimum_required(VERSION 3.12)
44
# (using add_subdirectory) or if it is the main project
55
#
66
set(MAIN_PROJECT OFF)
7-
87
set(MAIN_PROJECT OFF)
98
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
109
project(opentelemetry-geneva-metrics)
1110
set(MAIN_PROJECT ON)
1211
endif()
1312

13+
if(NOT WIN32)
14+
find_package(CURL REQUIRED)
15+
endif()
1416
add_definitions(-DHAVE_CONSOLE_LOG)
1517
if(MAIN_PROJECT)
1618
find_package(opentelemetry-cpp REQUIRED)
1719
endif()
1820

19-
find_package(CURL REQUIRED)
20-
2121
include_directories(include)
22+
2223
# create geneva metrics exporter
23-
add_library(opentelemetry_exporter_geneva_metrics
24-
src/exporter.cc src/unix_domain_socket_data_transport.cc)
24+
if(WIN32)
25+
add_library(
26+
opentelemetry_exporter_geneva_metrics
27+
src/exporter.cc src/etw_data_transport.cc
28+
src/unix_domain_socket_data_transport.cc)
29+
else()
30+
add_library(opentelemetry_exporter_geneva_metrics
31+
src/exporter.cc src/unix_domain_socket_data_transport.cc)
32+
endif()
33+
2534
target_include_directories(opentelemetry_exporter_geneva_metrics
2635
PRIVATE ${OPENTELEMETRY_CPP_INCLUDE_DIRS})
2736
target_link_libraries(opentelemetry_exporter_geneva_metrics
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
include(vcpkg_common_functions)
2+
3+
if(VCPKG_TARGET_IS_WINDOWS)
4+
vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
5+
endif()
6+
7+
vcpkg_from_github(
8+
OUT_SOURCE_PATH SOURCE_PATH
9+
REPO lalitb/opentelemetry-cpp-contrib
10+
HEAD_REF geneva-windows
11+
)
12+
13+
vcpkg_cmake_configure(
14+
SOURCE_PATH "${SOURCE_PATH}/exporters/geneva/"
15+
OPTIONS
16+
-DBUILD_TESTING=OFF
17+
-DBUILD_EXAMPLE=OFF
18+
)
19+
20+
vcpkg_cmake_install()
21+
vcpkg_cmake_config_fixup(CONFIG_PATH lib/cmake/${PORT})
22+
vcpkg_copy_pdbs()
23+
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
24+
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/share")
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json",
3+
"name": "opentelemetry-etw-metrics-exporter",
4+
"version-semver": "0.0.1",
5+
"description": [
6+
"OpenTelemetry ETW Exporter uses OpenTelemetry API/SDK to export the metrics data to ETW."
7+
],
8+
"homepage": "https://github.com/open-telemetry/opentelemetry-cpp-contrib",
9+
"license": "Apache-2.0",
10+
"dependencies": [
11+
{
12+
"name": "opentelemetry-cpp",
13+
"host": true
14+
},
15+
{
16+
"name": "vcpkg-cmake",
17+
"host": true
18+
},
19+
{
20+
"name": "vcpkg-cmake-config",
21+
"host": true
22+
}
23+
]
24+
}

exporters/geneva/example/example_metrics.cc

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright The OpenTelemetry Authors
22
// SPDX-License-Identifier: Apache-2.0
33

4-
#ifndef ENABLE_METRICS_PREVIEW
54
#include "opentelemetry/exporters/geneva/metrics/exporter.h"
65
#include "opentelemetry/metrics/provider.h"
76
#include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h"
@@ -26,9 +25,13 @@ const std::string kUnixDomainPath = "/tmp/ifx_unix_socket";
2625
const std::string kNamespaceName = "test_ns";
2726

2827
void initMetrics(const std::string &name, const std::string &account_name) {
29-
std::string conn_string = "Endpoint=unix://" + kUnixDomainPath +
30-
";Account=" + account_name +
31-
";Namespace=" + kNamespaceName;
28+
29+
#ifndef _WIN32
30+
conn_string = "Endpoint=unix://" + kUnixDomainPath + ";" + conn_string;
31+
#else
32+
std::string conn_string =
33+
"Account=" + account_name + ";Namespace=" + kNamespaceName;
34+
#endif
3235
geneva_exporter::ExporterOptions options{conn_string};
3336
std::unique_ptr<metric_sdk::PushMetricExporter> exporter{
3437
new geneva_exporter::Exporter(options)};
@@ -84,8 +87,7 @@ void initMetrics(const std::string &name, const std::string &account_name) {
8487
std::shared_ptr<opentelemetry::sdk::metrics::AggregationConfig>
8588
aggregation_config{
8689
new opentelemetry::sdk::metrics::HistogramAggregationConfig()};
87-
static_cast<
88-
opentelemetry::sdk::metrics::HistogramAggregationConfig*>(
90+
static_cast<opentelemetry::sdk::metrics::HistogramAggregationConfig *>(
8991
aggregation_config.get())
9092
->boundaries_ = std::list<double>{0.0, 50.0, 100.0, 250.0, 500.0,
9193
750.0, 1000.0, 2500.0, 5000.0, 10000.0};
@@ -128,6 +130,3 @@ int main(int argc, char **argv) {
128130
histogram_example.join();
129131
}
130132
}
131-
#else
132-
int main() {}
133-
#endif

exporters/geneva/example/foo_library.cc

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright The OpenTelemetry Authors
22
// SPDX-License-Identifier: Apache-2.0
33

4-
#ifndef ENABLE_METRICS_PREVIEW
54
#include "foo_library.h"
65
#include "opentelemetry/context/context.h"
76
#include "opentelemetry/metrics/provider.h"
@@ -92,5 +91,3 @@ void FooLibrary::histogram_example(const std::string &name) {
9291
std::this_thread::sleep_for(std::chrono::milliseconds(250));
9392
}
9493
}
95-
96-
#endif

exporters/geneva/example/foo_library.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
#pragma once
5-
#ifndef ENABLE_METRICS_PREVIEW
65
#include <string>
76

87
class FooLibrary {
@@ -11,4 +10,3 @@ class FooLibrary {
1110
static void histogram_example(const std::string &name);
1211
static void observable_counter_example(const std::string &name);
1312
};
14-
#endif

exporters/geneva/include/opentelemetry/exporters/geneva/metrics/connection_string_parser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class ConnectionStringParser {
7373
}
7474
}
7575
}
76-
#if defined(_MSC_VER)
76+
#ifdef _WIN32
7777
if (account_.size() && namespace_.size() && !is_endpoint_found) {
7878
transport_protocol_ = TransportProtocol::kETW;
7979
}

exporters/geneva/include/opentelemetry/exporters/geneva/metrics/data_transport.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,22 @@ OPENTELEMETRY_BEGIN_NAMESPACE
1111
namespace exporter {
1212
namespace geneva {
1313
namespace metrics {
14-
using ByteVector = std::vector<unsigned char>;
14+
15+
// These enums are defined in
16+
// file: test/decoder/ifx_metrics_bin.ksy (enum metric_event_type)
17+
enum class MetricsEventType : uint16_t {
18+
ULongMetric = 50,
19+
DoubleMetric = 55,
20+
ExternallyAggregatedULongDistributionMetric = 56
21+
};
1522

1623
class DataTransport {
1724
public:
1825
virtual bool Connect() noexcept = 0;
19-
virtual bool Send(const char *data, uint16_t length) noexcept = 0;
26+
virtual bool Send(MetricsEventType event_type, const char *data,
27+
uint16_t length) noexcept = 0;
2028
virtual bool Disconnect() noexcept = 0;
29+
virtual ~DataTransport() = 0;
2130
};
2231
} // namespace metrics
2332
} // namespace geneva
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include "opentelemetry/exporters/geneva/metrics/connection_string_parser.h"
7+
#include "opentelemetry/exporters/geneva/metrics/data_transport.h"
8+
#include "opentelemetry/version.h"
9+
10+
#include <evntprov.h>
11+
#include <guiddef.h>
12+
#include <memory>
13+
14+
OPENTELEMETRY_BEGIN_NAMESPACE
15+
namespace exporter {
16+
namespace geneva {
17+
namespace metrics {
18+
static const REGHANDLE INVALID_HANDLE = _UI64_MAX;
19+
static const GUID kMDMProviderGUID = {
20+
0xedc24920, 0xe004, 0x40f6, 0xa8, 0xe1, 0x0e, 0x6e, 0x48, 0xf3, 0x9d, 0x84};
21+
22+
class ETWDataTransport : public DataTransport {
23+
public:
24+
ETWDataTransport(const size_t offset_to_skip_);
25+
bool Connect() noexcept override;
26+
bool Send(MetricsEventType event_type, const char *data,
27+
uint16_t length) noexcept override;
28+
bool Disconnect() noexcept override;
29+
~ETWDataTransport();
30+
31+
private:
32+
REGHANDLE provider_handle_;
33+
bool connected_{false};
34+
const size_t offset_to_skip_;
35+
};
36+
} // namespace metrics
37+
} // namespace geneva
38+
} // namespace exporter
39+
OPENTELEMETRY_END_NAMESPACE

exporters/geneva/include/opentelemetry/exporters/geneva/metrics/exporter.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,6 @@ constexpr uint64_t kSecondsToUnixTime =
3333
// 1601-01-01T00:00:00Z and UNIX/Linux epoch
3434
// (1970-01-01T00:00:00Z)
3535

36-
enum class MetricsEventType : uint16_t {
37-
ULongMetric = 50,
38-
DoubleMetric = 55,
39-
ExternallyAggregatedULongDistributionMetric = 56
40-
};
41-
4236
/**
4337
* The Geneva metrics exporter exports metrics data to Geneva
4438
*/

0 commit comments

Comments
 (0)