diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 029c7bc..93c8b58 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -17,7 +17,7 @@ jobs: version: ${{ env.ZIG_VERSION }} mirror: 'https://zigmirror.com' - run: zig build --fetch - - run: zig build docs + - run: zig build sdk-docs - name: Upload Pages artifact uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0 diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index 56182ab..9818d4f 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -21,4 +21,4 @@ jobs: - name: Fetch dependencies run: zig build --fetch - name: Run integration tests - run: zig build integration + run: zig build sdk-integration diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 0f71a7b..95fc9bc 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -33,7 +33,7 @@ jobs: version: ${{ env.ZIG_VERSION }} mirror: 'https://zigmirror.com' - run: zig build --fetch - - run: zig build test -Dtest-verbose=true + - run: zig build sdk-test -Dtest-verbose=true timeout-minutes: 3 build_examples: @@ -45,7 +45,7 @@ jobs: version: ${{ env.ZIG_VERSION }} mirror: 'https://zigmirror.com' - run: zig build --fetch - - run: zig build examples + - run: zig build sdk-examples # Execute bencharmks only if the PR has a specific label 'run::benchmarks' benchmarks: @@ -61,7 +61,7 @@ jobs: # The optimize argument builds the SDK library with optimizations, # benchmarks files are always compiled with ReleaseFast. - run: | - zig build benchmarks -Doptimize=ReleaseFast -Dbenchmark-output=benchmarks-result.txt + zig build sdk-benchmarks -Doptimize=ReleaseFast -Dbenchmark-output=benchmarks-result.txt - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: benchmarks-result diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 77a7b02..d7ee03b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,7 +33,7 @@ This compiles the OpenTelemetry SDK as a static library in `zig-out/lib/`. Unit tests are executed as part of CI pipeline, you can run them locally while developing: ``` -zig build test +zig build sdk-test ``` #### Test options @@ -47,20 +47,20 @@ The test build supports the following options: To run only specific tests matching a pattern, use build args: ``` -zig build test -- "counter" +zig build sdk-test -- "counter" ``` Example usage: ``` # Run tests with verbose output (shows test names and timing) -zig build test -Dtest-verbose=true +zig build sdk-test -Dtest-verbose=true # Run specific tests with verbose output and stop on first failure -zig build test -Dtest-verbose=true -Dtest-fail-first=true -- "counter" +zig build sdk-test -Dtest-verbose=true -Dtest-fail-first=true -- "counter" # Show captured logs for tests with warnings/errors -zig build test -Dtest-show-logs=true +zig build sdk-test -Dtest-show-logs=true ``` ### Running integration tests @@ -68,7 +68,7 @@ zig build test -Dtest-show-logs=true Integration tests verify the SDK behavior against real OpenTelemetry backends. These tests require Docker to be installed and running. ``` -zig build integration +zig build sdk-integration ``` Integration tests are executed as part of CI on pull requests. @@ -81,7 +81,7 @@ Integration tests are executed as part of CI on pull requests. Build and run all examples: ``` -zig build examples +zig build sdk-examples ``` #### Examples options @@ -90,16 +90,16 @@ Filter examples to build and run specific ones: ``` # Run only examples matching "otlp" -zig build examples -Dexamples-filter=otlp +zig build sdk-examples -Dexamples-filter=otlp # Run only histogram examples -zig build examples -Dexamples-filter=histogram +zig build sdk-examples -Dexamples-filter=histogram ``` Examples are organized by signal type: -- `examples/metrics/` - Metrics API examples -- `examples/trace/` - Tracing API examples -- `examples/logs/` - Logging API examples +- `opentelemetry-sdk/examples/metrics/` - Metrics API examples +- `opentelemetry-sdk/examples/trace/` - Tracing API examples +- `opentelemetry-sdk/examples/logs/` - Logging API examples ### Running benchmarks @@ -108,7 +108,7 @@ Benchmarks are executed as part of the pipeline on Pull Requests if they contain They can be executed locally with: ``` -zig build benchmarks -Doptimize=ReleaseFast +zig build sdk-benchmarks -Doptimize=ReleaseFast ``` #### Benchmark options @@ -122,13 +122,13 @@ To run only specific benchmarks matching a pattern, use build args: ``` # Run only counter benchmarks -zig build benchmarks -Doptimize=ReleaseFast -- "counter" +zig build sdk-benchmarks -Doptimize=ReleaseFast -- "counter" # Run a specific benchmark and save results -zig build benchmarks -Doptimize=ReleaseFast -Dbenchmark-output="results.txt" -- "hist.record" +zig build sdk-benchmarks -Doptimize=ReleaseFast -Dbenchmark-output="results.txt" -- "hist.record" # Run benchmarks in debug mode for profiling -zig build benchmarks -Dbenchmark-debug=true -- "counter" +zig build sdk-benchmarks -Dbenchmark-debug=true -- "counter" ``` > [!NOTE] @@ -141,7 +141,7 @@ zig build benchmarks -Dbenchmark-debug=true -- "counter" Generate API documentation: ``` -zig build docs +zig build sdk-docs ``` Documentation will be generated in `zig-out/docs/` and can be viewed by opening `index.html` in a browser. @@ -151,10 +151,10 @@ Documentation will be generated in `zig-out/docs/` and can be viewed by opening A typical development workflow: 1. Make your changes -2. Run unit tests: `zig build test` -3. Run integration tests: `zig build integration` (if applicable) -4. Run relevant examples: `zig build examples -Dexamples-filter=` -5. Run benchmarks: `zig build benchmarks -Doptimize=ReleaseFast` (if performance-critical) +2. Run unit tests: `zig build sdk-test` +3. Run integration tests: `zig build sdk-integration` (if applicable) +4. Run relevant examples: `zig build sdk-examples -Dexamples-filter=` +5. Run benchmarks: `zig build sdk-benchmarks -Doptimize=ReleaseFast` (if performance-critical) 6. Commit your changes diff --git a/build.zig b/build.zig index 6a20c95..4d265d2 100644 --- a/build.zig +++ b/build.zig @@ -1,451 +1,37 @@ const std = @import("std"); const zon = @import("build.zig.zon"); +const helpers = @import("build/helpers.zig"); +const sdk_build = @import("build/sdk/build.zig"); + pub fn build(b: *std.Build) !void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{ .preferred_optimize_mode = .ReleaseSafe }); - const test_verbose = b.option(bool, "test-verbose", "Show verbose test output") orelse false; - const test_fail_first = b.option(bool, "test-fail-first", "Stop on first test failure") orelse false; - const test_show_logs = b.option(bool, "test-show-logs", "Show captured log output for tests") orelse false; - const benchmark_output = b.option([]const u8, "benchmark-output", "Path to write benchmark results to a file"); - const benchmark_debug = b.option(bool, "benchmark-debug", "Enable debug build mode for benchmarks") orelse false; - - // Dependencies section - // Benchmarks lib - const benchmarks_dep = b.dependency("zbench", .{}); + const benchmarks_mod = b.dependency("zbench", .{}).module("zbench"); // OpenTelemetry proto package ships protobuf as a dependency so we'll use it. - const otel_pb_dep = b.dependency("opentelemetry_proto", .{ - .optimize = optimize, - .target = target, - }); + const otel_pb_dep = b.dependency("opentelemetry_proto", .{}); + const otel_proto_mod = otel_pb_dep.module("opentelemetry-proto"); const protobuf_mod = otel_pb_dep.builder.dependency("protobuf", .{ .optimize = optimize, .target = target, }).module("protobuf"); - const clock_mod = b.addModule("clock", .{ - .root_source_file = b.path("src/clock.zig"), - .target = target, - .optimize = optimize, - .link_libc = true, - }); - // Modules section - const sdk_mod = b.addModule("sdk", .{ - .root_source_file = b.path("src/sdk.zig"), - .target = target, - .optimize = optimize, - .strip = false, - .unwind_tables = .sync, - .link_libc = true, - .imports = &.{ - .{ .name = "protobuf", .module = protobuf_mod }, - .{ .name = "opentelemetry-proto", .module = otel_proto_mod }, - .{ .name = "clock", .module = clock_mod }, - }, - }); + var sdk_build_mods = helpers.BuildModules.init(b.allocator); + defer sdk_build_mods.deinit(); - { // Build info - const build_info = b.addOptions(); - build_info.addOption([]const u8, "version", zon.version); - build_info.addOption([]const u8, "name", @tagName(zon.name)); - sdk_mod.addOptions("build_info", build_info); - } + try sdk_build_mods.put("protobuf", protobuf_mod); + try sdk_build_mods.put("opentelemetry-proto", otel_proto_mod); + try sdk_build_mods.put("benchmark", benchmarks_mod); - // Static library for the OpenTelemetry SDK C users - const sdk_c_lib_mod = b.createModule(.{ - .root_source_file = b.path("src/c.zig"), + const compilation_info = helpers.CompilationInfo{ .target = target, .optimize = optimize, - .link_libc = true, - .imports = &.{ - .{ .name = "protobuf", .module = protobuf_mod }, - .{ .name = "opentelemetry-proto", .module = otel_proto_mod }, - .{ .name = "clock", .module = clock_mod }, - }, - }); - const sdk_lib = b.addLibrary(.{ - .name = "opentelemetry-sdk", - .linkage = .static, - .root_module = sdk_c_lib_mod, - }); - - b.installArtifact(sdk_lib); - - // Install include headers for C users - b.installDirectory(.{ - .source_dir = b.path("include"), - .install_dir = .header, - .install_subdir = "", - }); - - // Providing a way for the user to request running the unit tests. - const test_step = b.step("test", "Run unit tests"); - - // Creates a step for unit testing the SDK. - // This only builds the test executable but does not run it. - const sdk_unit_tests = b.addTest(.{ - .root_module = sdk_mod, - // Use custom test runner to capture log output - .test_runner = .{ .path = b.path("src/test_runner.zig"), .mode = .simple }, - // Allow passing test filter using the build args. - .filters = b.args orelse &[0][]const u8{}, - }); - - // Pass test options as build options - const test_options = b.addOptions(); - test_options.addOption(bool, "verbose", test_verbose); - test_options.addOption(bool, "fail_first", test_fail_first); - test_options.addOption(bool, "show_logs", test_show_logs); - sdk_unit_tests.root_module.addOptions("test_options", test_options); - - const run_sdk_unit_tests = b.addRunArtifact(sdk_unit_tests); - test_step.dependOn(&run_sdk_unit_tests.step); - - // Examples - const examples_step = b.step("examples", "Build and run all examples"); - const examples_filter = b.option([]const u8, "examples-filter", "Filter examples to build"); - - // Attach an OTLP stub module to allow examples to use it. - const otel_stub_mod = b.createModule(.{ - .root_source_file = b.path("examples/otlp_stub/server.zig"), - .target = target, - .optimize = optimize, - .imports = &.{ - .{ .name = "opentelemetry-sdk", .module = sdk_mod }, - .{ .name = "protobuf", .module = protobuf_mod }, - .{ .name = "opentelemetry-proto", .module = otel_proto_mod }, - .{ .name = "clock", .module = clock_mod }, - }, - }); - // TODO add examples for other signals - - const examples_dirs: []const []const u8 = &.{ "metrics", "trace", "logs", "baggage", "propagation" }; - for (examples_dirs) |example_dir| { - const example = buildExamples( - b, - b.path(b.pathJoin(&.{ "examples", example_dir })), - sdk_mod, - otel_stub_mod, - otel_proto_mod, - clock_mod, - examples_filter, - ) catch |err| { - std.debug.print("Error building metrics examples: {}\n", .{err}); - return err; - }; - defer b.allocator.free(example); - for (example) |step| { - const run_example = b.addRunArtifact(step); - examples_step.dependOn(&run_example.step); - } - } - - // C examples - const c_example_step = b.step("examples-c", "Build and run C examples"); - - const c_examples = [_][]const u8{ - "logs", - "metrics", - "trace", + .pkg_name = @tagName(zon.name), + .version = zon.version, }; - for (c_examples) |example_name| { - const c_example_exe = b.addExecutable(.{ - .name = example_name, - .root_module = b.createModule(.{ - .target = target, - .optimize = optimize, - .link_libc = true, - }), - }); - - c_example_exe.root_module.addCSourceFile(.{ - .file = b.path(b.pathJoin(&.{ - "examples", - "c", - b.fmt("{s}.c", .{example_name}), - })), - .flags = &.{ - "-std=c11", - "-Wall", - "-Wextra", - }, - }); - c_example_exe.root_module.addIncludePath(b.path("include")); - c_example_exe.root_module.linkLibrary(sdk_lib); - - const run_c_example = b.addRunArtifact(c_example_exe); - c_example_step.dependOn(&run_c_example.step); - - // Also install each C example executable - b.installArtifact(c_example_exe); - } - - // Benchmarks - const benchmarks_step = b.step("benchmarks", "Build and run all benchmarks"); - - const benchmark_mod = benchmarks_dep.module("zbench"); - - var captured_stderr: std.ArrayList(std.Build.LazyPath) = .empty; - defer captured_stderr.deinit(b.allocator); - - const benchmarked_signals: []const []const u8 = &.{ "logs", "metrics", "trace" }; - for (benchmarked_signals) |signal| { - const signal_benchmarks = buildBenchmarks(b, b.path(b.pathJoin(&.{ "benchmarks", signal })), sdk_mod, benchmark_mod, clock_mod, benchmark_debug) catch |err| { - std.debug.print("Error building {s} benchmarks: {}\n", .{ signal, err }); - return err; - }; - defer b.allocator.free(signal_benchmarks); - for (signal_benchmarks) |step| { - const run_signal_benchmark = b.addRunArtifact(step); - - if (benchmark_output != null) { - try captured_stderr.append(b.allocator, run_signal_benchmark.captureStdErr(.{})); - } - - benchmarks_step.dependOn(&run_signal_benchmark.step); - } - } - - if (benchmark_output) |output_path| { - const concat = b.addSystemCommand(&.{"cat"}); - for (captured_stderr.items) |p| concat.addFileArg(p); - const merged = concat.captureStdOut(.{}); - - const write = b.addUpdateSourceFiles(); - write.addCopyFileToSource(merged, output_path); - benchmarks_step.dependOn(&write.step); - } - - // Integration tests step - const integration_step = b.step("integration", "Run integration tests (requires Docker)"); - const integration_tests = buildIntegrationTests(b, b.path("integration_tests"), sdk_mod, clock_mod) catch |build_err| { - std.debug.print("Error building integration tests: {}\n", .{build_err}); - return build_err; - }; - defer b.allocator.free(integration_tests); - for (integration_tests) |step| { - const run_integration_test = b.addRunArtifact(step); - integration_step.dependOn(&run_integration_test.step); - } - - // Documentation webiste with autodoc - const sdk_docs = b.addObject(.{ - .name = "sdk", - .root_module = b.createModule(.{ - .root_source_file = b.path("src/sdk.zig"), - .target = target, - // Doc emission is independent of optimize mode; pin to Debug - // for the fastest doc builds. - .optimize = .Debug, - .link_libc = true, - .imports = &.{ - .{ .name = "protobuf", .module = protobuf_mod }, - .{ .name = "opentelemetry-proto", .module = otel_proto_mod }, - .{ .name = "clock", .module = clock_mod }, - }, - }), - }); - const install_docs = b.addInstallDirectory(.{ - .source_dir = sdk_docs.getEmittedDocs(), - .install_dir = .prefix, - .install_subdir = "docs", - }); - - const docs_step = b.step("docs", "Copy documentation artifacts to prefix path"); - docs_step.dependOn(&sdk_lib.step); - docs_step.dependOn(&install_docs.step); -} - -fn buildExamples( - b: *std.Build, - examples_dir: std.Build.LazyPath, - otel_sdk_mod: *std.Build.Module, - otlp_stub_mod: *std.Build.Module, - proto_mod: *std.Build.Module, - clock_mod: *std.Build.Module, - name_filter: ?[]const u8, -) ![]*std.Build.Step.Compile { - var exes: std.ArrayList(*std.Build.Step.Compile) = .empty; - errdefer exes.deinit(b.allocator); - - var ex_dir = try examples_dir.getPath3(b, null).openDir(std.Options.debug_io, "", .{ .iterate = true }); - defer ex_dir.close(std.Options.debug_io); - - var ex_dir_iter = ex_dir.iterate(); - while (try ex_dir_iter.next(std.Options.debug_io)) |file| { - if (getZigFileName(file.name)) |name| { - // Discard the modules that do not match the filter - if (name_filter) |filter| { - if (std.mem.indexOf(u8, name, filter) == null) continue; - } - const file_name = try examples_dir.join(b.allocator, file.name); - - const b_mod = b.createModule(.{ - .root_source_file = file_name, - .target = otel_sdk_mod.resolved_target.?, - .optimize = otel_sdk_mod.optimize.?, - .imports = &.{ - .{ .name = "opentelemetry-sdk", .module = otel_sdk_mod }, - .{ .name = "otlp-stub", .module = otlp_stub_mod }, - .{ .name = "opentelemetry-proto", .module = proto_mod }, - .{ .name = "clock", .module = clock_mod }, - }, - }); - try exes.append(b.allocator, b.addExecutable(.{ - .name = name, - .root_module = b_mod, - })); - } - } - - return exes.toOwnedSlice(b.allocator); -} - -fn buildBenchmarks( - b: *std.Build, - bench_dir: std.Build.LazyPath, - otel_mod: *std.Build.Module, - benchmark_mod: *std.Build.Module, - clock_mod: *std.Build.Module, - debug_mode: bool, -) ![]*std.Build.Step.Compile { - var bench_tests: std.ArrayList(*std.Build.Step.Compile) = .empty; - errdefer bench_tests.deinit(b.allocator); - - var test_dir = try bench_dir.getPath3(b, null).openDir(std.Options.debug_io, "", .{ .iterate = true }); - defer test_dir.close(std.Options.debug_io); - - var iter = test_dir.iterate(); - while (try iter.next(std.Options.debug_io)) |file| { - if (getZigFileName(file.name)) |name| { - const file_name = try bench_dir.join(b.allocator, file.name); - - const b_mod = b.createModule(.{ - .root_source_file = file_name, - .target = otel_mod.resolved_target.?, - // We set the optimization level to ReleaseFast for benchmarks - // because we want to have the best performance. - .optimize = if (debug_mode) .Debug else .ReleaseFast, - .strip = !debug_mode, - .imports = &.{ - .{ .name = "opentelemetry-sdk", .module = otel_mod }, - .{ .name = "benchmark", .module = benchmark_mod }, - .{ .name = "clock", .module = clock_mod }, - }, - }); - - // Provide dummy test_options so the custom test runner compiles - const benchmark_test_options = b.addOptions(); - benchmark_test_options.addOption(bool, "verbose", false); - benchmark_test_options.addOption(bool, "fail_first", false); - benchmark_test_options.addOption(bool, "show_logs", false); - b_mod.addOptions("test_options", benchmark_test_options); - - const test_step = b.addTest(.{ - .name = name, - .root_module = b_mod, - // Use custom test runner to avoid server protocol (--listen=-) - .test_runner = .{ .path = b.path("src/test_runner.zig"), .mode = .simple }, - // Allow passing benchmark filter using the build args. - .filters = b.args orelse &[0][]const u8{}, - }); - - try bench_tests.append(b.allocator, test_step); - } - } - - return bench_tests.toOwnedSlice(b.allocator); -} - -fn buildIntegrationTests( - b: *std.Build, - integration_dir: std.Build.LazyPath, - otel_mod: *std.Build.Module, - clock_mod: *std.Build.Module, -) ![]*std.Build.Step.Compile { - var integration_tests: std.ArrayList(*std.Build.Step.Compile) = .empty; - errdefer integration_tests.deinit(b.allocator); - - var test_dir = integration_dir.getPath3(b, null).openDir(std.Options.debug_io, "", .{ .iterate = true }) catch |err| switch (err) { - error.FileNotFound => return integration_tests.toOwnedSlice(b.allocator), - else => return err, - }; - defer test_dir.close(std.Options.debug_io); - - // Create common module for shared integration test utilities - const common_path = try integration_dir.join(b.allocator, "common.zig"); - const common_mod = b.createModule(.{ - .root_source_file = common_path, - .target = otel_mod.resolved_target.?, - .optimize = otel_mod.optimize.?, - .imports = &.{ - .{ .name = "opentelemetry-sdk", .module = otel_mod }, - .{ .name = "clock", .module = clock_mod }, - }, - }); - - var iter = test_dir.iterate(); - while (try iter.next(std.Options.debug_io)) |file| { - if (getZigFileName(file.name)) |name| { - // Skip common.zig as it's not a test executable - if (std.mem.eql(u8, name, "common")) continue; - - // If integration filter is specified, skip non-matching tests - const integration_filter = b.args; - - const file_name = try integration_dir.join(b.allocator, file.name); - if (integration_filter) |filter| { - for (filter) |filter_entry| { - if (std.mem.eql(u8, name, filter_entry)) { - const b_mod = b.createModule(.{ - .root_source_file = file_name, - .target = otel_mod.resolved_target.?, - .optimize = otel_mod.optimize.?, - .imports = &.{ - .{ .name = "opentelemetry-sdk", .module = otel_mod }, - .{ .name = "common", .module = common_mod }, - .{ .name = "clock", .module = clock_mod }, - }, - }); - - try integration_tests.append(b.allocator, b.addExecutable(.{ - .name = name, - .root_module = b_mod, - })); - } - } - } else { - const b_mod = b.createModule(.{ - .root_source_file = file_name, - .target = otel_mod.resolved_target.?, - .optimize = otel_mod.optimize.?, - .imports = &.{ - .{ .name = "opentelemetry-sdk", .module = otel_mod }, - .{ .name = "common", .module = common_mod }, - .{ .name = "clock", .module = clock_mod }, - }, - }); - - try integration_tests.append(b.allocator, b.addExecutable(.{ - .name = name, - .root_module = b_mod, - })); - } - } - } - - return integration_tests.toOwnedSlice(b.allocator); -} - -fn getZigFileName(file_name: []const u8) ?[]const u8 { - // Get the file name without extension, checking if it ends with '.zig'. - // If it doesn't end in 'zig' then ignore. - const index = std.mem.lastIndexOfScalar(u8, file_name, '.') orelse return null; - if (index == 0) return null; // discard dotfiles - if (!std.mem.eql(u8, file_name[index + 1 ..], "zig")) return null; - return file_name[0..index]; + try sdk_build.Setup(b, compilation_info, &sdk_build_mods); } diff --git a/build.zig.zon b/build.zig.zon index 7b6ba3f..7f9bf20 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -35,9 +35,8 @@ .paths = .{ "build.zig", "build.zig.zon", - "src", - "examples", - "benchmarks", + "build", + "opentelemetry-sdk", "LICENSE", "README.md", }, diff --git a/build/helpers.zig b/build/helpers.zig new file mode 100644 index 0000000..e63b1fc --- /dev/null +++ b/build/helpers.zig @@ -0,0 +1,41 @@ +const std = @import("std"); + +pub fn getZigFileName(file_name: []const u8) ?[]const u8 { + // Get the file name without extension, checking if it ends with '.zig'. + // If it doesn't end in 'zig' then ignore. + const index = std.mem.lastIndexOfScalar(u8, file_name, '.') orelse return null; + if (index == 0) return null; // discard dotfiles + if (!std.mem.eql(u8, file_name[index + 1 ..], "zig")) return null; + return file_name[0..index]; +} + +pub const BuildModules = std.StringHashMap(*std.Build.Module); + +// Generates a ist of imports from a BuildModules map, only including the modules whose names are in the `include` list. +// It returns an error if an entry in `include` is not found in the `source` map. +pub fn ImportsFromBuildModules(allocator: std.mem.Allocator, source: *const BuildModules, include_list: [][]const u8) ![]std.Build.Module.Import { + var imports: std.ArrayList(std.Build.Module.Import) = .empty; + errdefer imports.deinit(allocator); + + for (include_list) |name| { + const mod = source.get(name) orelse { + std.debug.print("Failed to find module {s} for imports\n", .{name}); + return BuildError.ModuleNotFound; + }; + try imports.append(allocator, .{ .name = name, .module = mod }); + } + + return try imports.toOwnedSlice(allocator); +} + +pub const BuildError = error{ + DependencyNotFound, + ModuleNotFound, +}; + +pub const CompilationInfo = struct { + target: std.Build.ResolvedTarget, + optimize: std.builtin.OptimizeMode, + version: []const u8, + pkg_name: []const u8, +}; diff --git a/build/sdk/build.zig b/build/sdk/build.zig new file mode 100644 index 0000000..8c24c55 --- /dev/null +++ b/build/sdk/build.zig @@ -0,0 +1,492 @@ +const std = @import("std"); +const helpers = @import("../helpers.zig"); + +const BuildError = helpers.BuildError; +const BuildModules = helpers.BuildModules; +const CompilationInfo = helpers.CompilationInfo; + +// Path of the OpenTelemetry SDK source root directory relative to the build.zig file. +const sdk_root = "opentelemetry-sdk"; + +// Sets up the dependencies, modules and static library for the OpenTelemetry +// SDK, and installs its artifacts and headers. +pub fn Setup( + b: *std.Build, + info: CompilationInfo, + dependencies: *BuildModules, +) !void { + try modules(b, info, dependencies); + + const sdk_lib = b.addLibrary(.{ + .name = "opentelemetry-sdk", + .linkage = .static, + .root_module = dependencies.get("sdk_c_lib") orelse return BuildError.ModuleNotFound, + }); + + b.installArtifact(sdk_lib); + + // Install include headers for C users + b.installDirectory(.{ + .source_dir = b.path(sdk_root ++ "/include"), + .install_dir = .header, + .install_subdir = "", + }); + + _ = try addTestStep(b, dependencies); + _ = try addExamplesStep(b, dependencies, info); + _ = try addExamplesCStep(b, sdk_lib, info); + _ = try addBenchmarksStep(b, dependencies, info); + _ = try addIntegrationStep(b, dependencies, info); + + const docs_step = try addDocsStep(b, dependencies, info); + docs_step.dependOn(&sdk_lib.step); +} + +fn modules(b: *std.Build, info: CompilationInfo, dependencies: *BuildModules) !void { + const clock_mod = b.createModule(.{ + .root_source_file = b.path(sdk_root ++ "/src/clock.zig"), + .target = info.target, + .optimize = info.optimize, + .link_libc = true, + }); + try dependencies.put("clock", clock_mod); + + var sdk_dep_names = [_][]const u8{ + "protobuf", + "opentelemetry-proto", + "clock", + }; + const sdk_mod = b.addModule("sdk", .{ + .root_source_file = b.path(sdk_root ++ "/src/sdk.zig"), + .target = info.target, + .optimize = info.optimize, + .strip = false, + .unwind_tables = .sync, + .link_libc = true, + .imports = try helpers.ImportsFromBuildModules(b.allocator, dependencies, &sdk_dep_names), + }); + { // Build info + const build_info = b.addOptions(); + build_info.addOption([]const u8, "version", info.version); + build_info.addOption([]const u8, "name", info.pkg_name); + sdk_mod.addOptions("build_info", build_info); + } + try dependencies.put("opentelemetry-sdk", sdk_mod); + + // Static library for the OpenTelemetry SDK C users + const sdk_c_lib_mod = b.createModule(.{ + .root_source_file = b.path(sdk_root ++ "/src/c.zig"), + .target = info.target, + .optimize = info.optimize, + .link_libc = true, + .imports = try helpers.ImportsFromBuildModules(b.allocator, dependencies, &sdk_dep_names), + }); + try dependencies.put("sdk_c_lib", sdk_c_lib_mod); + + // Attach an OTLP stub module to allow examples to use it. + var otlp_stub_dep_names = [_][]const u8{ + "opentelemetry-sdk", + "protobuf", + "opentelemetry-proto", + }; + const otel_stub_mod = b.createModule(.{ + .root_source_file = b.path(sdk_root ++ "/examples/otlp_stub/server.zig"), + .target = info.target, + // Examples are always run in Debug mode to catch potential API issues. + .optimize = .Debug, + .imports = try helpers.ImportsFromBuildModules(b.allocator, dependencies, &otlp_stub_dep_names), + }); + try dependencies.put("otlp-stub", otel_stub_mod); + + return; +} + +// Registers the "sdk-test" step, building and running the SDK unit tests. +fn addTestStep(b: *std.Build, mods: *const BuildModules) !*std.Build.Step { + const step = b.step("sdk-test", "Run SDK unit tests"); + + const test_verbose = b.option(bool, "test-verbose", "Show verbose test output") orelse false; + const test_fail_first = b.option(bool, "test-fail-first", "Stop on first test failure") orelse false; + const test_show_logs = b.option(bool, "test-show-logs", "Show captured log output for tests") orelse false; + + const sdk_unit_tests = b.addTest(.{ + .root_module = mods.get("opentelemetry-sdk") orelse return BuildError.ModuleNotFound, + // Use custom test runner to capture log output + .test_runner = .{ .path = b.path(sdk_root ++ "/src/test_runner.zig"), .mode = .simple }, + // Allow passing test filter using the build args. + .filters = b.args orelse &[0][]const u8{}, + }); + + // Pass test options as build options + const test_options = b.addOptions(); + test_options.addOption(bool, "verbose", test_verbose); + test_options.addOption(bool, "fail_first", test_fail_first); + test_options.addOption(bool, "show_logs", test_show_logs); + sdk_unit_tests.root_module.addOptions("test_options", test_options); + + const run_sdk_unit_tests = b.addRunArtifact(sdk_unit_tests); + step.dependOn(&run_sdk_unit_tests.step); + + return step; +} + +// Registers the "sdk-examples" step, building and running all Zig examples. +fn addExamplesStep(b: *std.Build, mods: *const BuildModules, info: CompilationInfo) !*std.Build.Step { + const step = b.step("sdk-examples", "Build and run all SDK examples"); + const examples_filter = b.option([]const u8, "examples-filter", "Filter examples to build"); + + const examples_dirs: []const []const u8 = &.{ "metrics", "trace", "logs", "baggage", "propagation" }; + for (examples_dirs) |example_dir| { + const example = buildExamples( + b, + b.path(b.pathJoin(&.{ sdk_root, "examples", example_dir })), + mods, + info, + examples_filter, + ) catch |err| { + std.debug.print("Error building {s} examples: {}\n", .{ example_dir, err }); + return err; + }; + defer b.allocator.free(example); + for (example) |exe| { + const run_example = b.addRunArtifact(exe); + step.dependOn(&run_example.step); + } + } + + return step; +} + +// Registers the "sdk-examples-c" step, building and running all C examples. +fn addExamplesCStep(b: *std.Build, sdk_lib_c: *std.Build.Step.Compile, info: CompilationInfo) !*std.Build.Step { + const step = b.step("sdk-examples-c", "Build and run SDK C examples"); + + const c_examples = [_][]const u8{ + "logs", + "metrics", + "trace", + }; + + for (c_examples) |example_name| { + const c_example_exe = b.addExecutable(.{ + .name = example_name, + .root_module = b.createModule(.{ + .target = info.target, + .optimize = info.optimize, + .link_libc = true, + }), + }); + + c_example_exe.root_module.addCSourceFile(.{ + .file = b.path(b.pathJoin(&.{ + sdk_root, + "examples", + "c", + b.fmt("{s}.c", .{example_name}), + })), + .flags = &.{ + "-std=c11", + "-Wall", + "-Wextra", + }, + }); + c_example_exe.root_module.addIncludePath(b.path(sdk_root ++ "/include")); + c_example_exe.root_module.linkLibrary(sdk_lib_c); + + const run_c_example = b.addRunArtifact(c_example_exe); + step.dependOn(&run_c_example.step); + + // Also install each C example executable + b.installArtifact(c_example_exe); + } + + return step; +} + +// Registers the "sdk-benchmarks" step, building and running all benchmarks. +pub fn addBenchmarksStep(b: *std.Build, mods: *const BuildModules, info: CompilationInfo) !*std.Build.Step { + const step = b.step("sdk-benchmarks", "Build and run all SDK benchmarks"); + const benchmark_output = b.option([]const u8, "benchmark-output", "Path to write benchmark results to a file"); + const benchmark_debug = b.option(bool, "benchmark-debug", "Enable debug build mode for benchmarks") orelse false; + + var captured_stderr: std.ArrayList(std.Build.LazyPath) = .empty; + defer captured_stderr.deinit(b.allocator); + + const benchmarked_signals: []const []const u8 = &.{ "logs", "metrics", "trace" }; + for (benchmarked_signals) |signal| { + const signal_benchmarks = buildBenchmarks( + b, + b.path(b.pathJoin(&.{ sdk_root, "benchmarks", signal })), + mods, + info, + benchmark_debug, + ) catch |err| { + std.debug.print("Error building {s} benchmarks: {}\n", .{ signal, err }); + return err; + }; + defer b.allocator.free(signal_benchmarks); + for (signal_benchmarks) |bench_exe| { + const run_signal_benchmark = b.addRunArtifact(bench_exe); + + if (benchmark_output != null) { + try captured_stderr.append(b.allocator, run_signal_benchmark.captureStdErr(.{})); + } + + step.dependOn(&run_signal_benchmark.step); + } + } + + if (benchmark_output) |output_path| { + const concat = b.addSystemCommand(&.{"cat"}); + for (captured_stderr.items) |p| concat.addFileArg(p); + const merged = concat.captureStdOut(.{}); + + const write = b.addUpdateSourceFiles(); + write.addCopyFileToSource(merged, output_path); + step.dependOn(&write.step); + } + + return step; +} + +// Registers the "sdk-integration" step, building and running integration tests. +fn addIntegrationStep(b: *std.Build, mods: *const BuildModules, info: CompilationInfo) !*std.Build.Step { + const step = b.step("sdk-integration", "Run SDK integration tests (requires Docker)"); + + const integration_tests = buildIntegrationTests( + b, + b.path(sdk_root ++ "/integration_tests"), + mods, + info, + ) catch |err| { + std.debug.print("Error building integration tests: {}\n", .{err}); + return err; + }; + defer b.allocator.free(integration_tests); + for (integration_tests) |exe| { + const run_integration_test = b.addRunArtifact(exe); + run_integration_test.setCwd(b.path(sdk_root)); + step.dependOn(&run_integration_test.step); + } + + return step; +} + +// Registers the "sdk-docs" step, emitting autodoc for the SDK module. +fn addDocsStep(b: *std.Build, mods: *const BuildModules, info: CompilationInfo) !*std.Build.Step { + const step = b.step("sdk-docs", "Copy SDK documentation artifacts to prefix path"); + + var dep_names = [_][]const u8{ + "protobuf", + "opentelemetry-proto", + "clock", + }; + + const sdk_docs = b.addObject(.{ + .name = "sdk", + .root_module = b.createModule(.{ + .root_source_file = b.path(sdk_root ++ "/src/sdk.zig"), + .target = info.target, + // Doc emission is independent of optimize mode; pin to Debug + // for the fastest doc builds. + .optimize = .Debug, + .link_libc = true, + .imports = try helpers.ImportsFromBuildModules(b.allocator, mods, &dep_names), + }), + }); + const install_docs = b.addInstallDirectory(.{ + .source_dir = sdk_docs.getEmittedDocs(), + .install_dir = .prefix, + .install_subdir = "docs", + }); + + step.dependOn(&install_docs.step); + + return step; +} + +fn buildExamples( + b: *std.Build, + examples_dir: std.Build.LazyPath, + mods: *const BuildModules, + info: CompilationInfo, + name_filter: ?[]const u8, +) ![]*std.Build.Step.Compile { + var exes: std.ArrayList(*std.Build.Step.Compile) = .empty; + errdefer exes.deinit(b.allocator); + + var ex_dir = try examples_dir.getPath3(b, null).openDir(std.Options.debug_io, "", .{ .iterate = true }); + defer ex_dir.close(std.Options.debug_io); + + var ex_dir_iter = ex_dir.iterate(); + while (try ex_dir_iter.next(std.Options.debug_io)) |file| { + if (helpers.getZigFileName(file.name)) |name| { + // Discard the modules that do not match the filter + if (name_filter) |filter| { + if (std.mem.indexOf(u8, name, filter) == null) continue; + } + const file_name = try examples_dir.join(b.allocator, file.name); + + var dep_names = [_][]const u8{ + "opentelemetry-sdk", + "otlp-stub", + "opentelemetry-proto", + "clock", + }; + + const b_mod = b.createModule(.{ + .root_source_file = file_name, + .target = info.target, + .optimize = info.optimize, + .imports = try helpers.ImportsFromBuildModules(b.allocator, mods, &dep_names), + }); + try exes.append(b.allocator, b.addExecutable(.{ + .name = name, + .root_module = b_mod, + })); + } + } + + return exes.toOwnedSlice(b.allocator); +} + +fn buildBenchmarks( + b: *std.Build, + bench_dir: std.Build.LazyPath, + mods: *const BuildModules, + info: CompilationInfo, + debug_mode: bool, +) ![]*std.Build.Step.Compile { + var bench_tests: std.ArrayList(*std.Build.Step.Compile) = .empty; + errdefer bench_tests.deinit(b.allocator); + + var test_dir = try bench_dir.getPath3(b, null).openDir(std.Options.debug_io, "", .{ .iterate = true }); + defer test_dir.close(std.Options.debug_io); + + var iter = test_dir.iterate(); + while (try iter.next(std.Options.debug_io)) |file| { + if (helpers.getZigFileName(file.name)) |name| { + const file_name = try bench_dir.join(b.allocator, file.name); + + var dep_names = [_][]const u8{ + "opentelemetry-sdk", + "benchmark", + "clock", + }; + const b_mod = b.createModule(.{ + .root_source_file = file_name, + .target = info.target, + // We set the optimization level to ReleaseFast for benchmarks + // because we want to have the best performance. + .optimize = if (debug_mode) .Debug else .ReleaseFast, + .strip = !debug_mode, + .imports = try helpers.ImportsFromBuildModules(b.allocator, mods, &dep_names), + }); + + // Provide dummy test_options so the custom test runner compiles + const benchmark_test_options = b.addOptions(); + benchmark_test_options.addOption(bool, "verbose", false); + benchmark_test_options.addOption(bool, "fail_first", false); + benchmark_test_options.addOption(bool, "show_logs", false); + b_mod.addOptions("test_options", benchmark_test_options); + + const test_step = b.addTest(.{ + .name = name, + .root_module = b_mod, + // Use custom test runner to avoid server protocol (--listen=-) + .test_runner = .{ .path = b.path("opentelemetry-sdk/src/test_runner.zig"), .mode = .simple }, + // Allow passing benchmark filter using the build args. + .filters = b.args orelse &[0][]const u8{}, + }); + + try bench_tests.append(b.allocator, test_step); + } + } + + return bench_tests.toOwnedSlice(b.allocator); +} + +fn buildIntegrationTests( + b: *std.Build, + integration_dir: std.Build.LazyPath, + mods: *const BuildModules, + info: CompilationInfo, +) ![]*std.Build.Step.Compile { + const otel_mod = mods.get("opentelemetry-sdk") orelse return BuildError.ModuleNotFound; + const clock_mod = mods.get("clock") orelse return BuildError.ModuleNotFound; + + var integration_tests: std.ArrayList(*std.Build.Step.Compile) = .empty; + errdefer integration_tests.deinit(b.allocator); + + var test_dir = integration_dir.getPath3(b, null).openDir(std.Options.debug_io, "", .{ .iterate = true }) catch |err| switch (err) { + error.FileNotFound => return integration_tests.toOwnedSlice(b.allocator), + else => return err, + }; + defer test_dir.close(std.Options.debug_io); + + // Create common module for shared integration test utilities + const common_path = try integration_dir.join(b.allocator, "common.zig"); + + var dep_names = [_][]const u8{ + "opentelemetry-sdk", + "clock", + }; + const common_mod = b.createModule(.{ + .root_source_file = common_path, + .target = info.target, + .optimize = info.optimize, + .imports = try helpers.ImportsFromBuildModules(b.allocator, mods, &dep_names), + }); + + var iter = test_dir.iterate(); + while (try iter.next(std.Options.debug_io)) |file| { + if (helpers.getZigFileName(file.name)) |name| { + // Skip common.zig as it's not a test executable + if (std.mem.eql(u8, name, "common")) continue; + + // If integration filter is specified, skip non-matching tests + const integration_filter = b.args; + + const file_name = try integration_dir.join(b.allocator, file.name); + if (integration_filter) |filter| { + for (filter) |filter_entry| { + if (std.mem.eql(u8, name, filter_entry)) { + const b_mod = b.createModule(.{ + .root_source_file = file_name, + .target = info.target, + .optimize = info.optimize, + .imports = &.{ + .{ .name = "opentelemetry-sdk", .module = otel_mod }, + .{ .name = "common", .module = common_mod }, + .{ .name = "clock", .module = clock_mod }, + }, + }); + + try integration_tests.append(b.allocator, b.addExecutable(.{ + .name = name, + .root_module = b_mod, + })); + } + } + } else { + const b_mod = b.createModule(.{ + .root_source_file = file_name, + .target = info.target, + .optimize = info.optimize, + .imports = &.{ + .{ .name = "opentelemetry-sdk", .module = otel_mod }, + .{ .name = "common", .module = common_mod }, + .{ .name = "clock", .module = clock_mod }, + }, + }); + + try integration_tests.append(b.allocator, b.addExecutable(.{ + .name = name, + .root_module = b_mod, + })); + } + } + } + + return integration_tests.toOwnedSlice(b.allocator); +} diff --git a/docs/images/zero-otel.png b/images/zero-otel.png similarity index 100% rename from docs/images/zero-otel.png rename to images/zero-otel.png diff --git a/benchmarks/logs/logger.zig b/opentelemetry-sdk/benchmarks/logs/logger.zig similarity index 100% rename from benchmarks/logs/logger.zig rename to opentelemetry-sdk/benchmarks/logs/logger.zig diff --git a/benchmarks/metrics/.gitkeep b/opentelemetry-sdk/benchmarks/metrics/.gitkeep similarity index 100% rename from benchmarks/metrics/.gitkeep rename to opentelemetry-sdk/benchmarks/metrics/.gitkeep diff --git a/benchmarks/metrics/attribute.zig b/opentelemetry-sdk/benchmarks/metrics/attribute.zig similarity index 100% rename from benchmarks/metrics/attribute.zig rename to opentelemetry-sdk/benchmarks/metrics/attribute.zig diff --git a/benchmarks/metrics/counter.zig b/opentelemetry-sdk/benchmarks/metrics/counter.zig similarity index 100% rename from benchmarks/metrics/counter.zig rename to opentelemetry-sdk/benchmarks/metrics/counter.zig diff --git a/benchmarks/metrics/gauge.zig b/opentelemetry-sdk/benchmarks/metrics/gauge.zig similarity index 100% rename from benchmarks/metrics/gauge.zig rename to opentelemetry-sdk/benchmarks/metrics/gauge.zig diff --git a/benchmarks/metrics/histogram.zig b/opentelemetry-sdk/benchmarks/metrics/histogram.zig similarity index 100% rename from benchmarks/metrics/histogram.zig rename to opentelemetry-sdk/benchmarks/metrics/histogram.zig diff --git a/benchmarks/metrics/observable.zig b/opentelemetry-sdk/benchmarks/metrics/observable.zig similarity index 100% rename from benchmarks/metrics/observable.zig rename to opentelemetry-sdk/benchmarks/metrics/observable.zig diff --git a/benchmarks/metrics/reader.zig b/opentelemetry-sdk/benchmarks/metrics/reader.zig similarity index 100% rename from benchmarks/metrics/reader.zig rename to opentelemetry-sdk/benchmarks/metrics/reader.zig diff --git a/benchmarks/metrics/updown_counter.zig b/opentelemetry-sdk/benchmarks/metrics/updown_counter.zig similarity index 100% rename from benchmarks/metrics/updown_counter.zig rename to opentelemetry-sdk/benchmarks/metrics/updown_counter.zig diff --git a/benchmarks/trace/.gitkeep b/opentelemetry-sdk/benchmarks/trace/.gitkeep similarity index 100% rename from benchmarks/trace/.gitkeep rename to opentelemetry-sdk/benchmarks/trace/.gitkeep diff --git a/benchmarks/trace/span.zig b/opentelemetry-sdk/benchmarks/trace/span.zig similarity index 100% rename from benchmarks/trace/span.zig rename to opentelemetry-sdk/benchmarks/trace/span.zig diff --git a/benchmarks/trace/trace.zig b/opentelemetry-sdk/benchmarks/trace/trace.zig similarity index 100% rename from benchmarks/trace/trace.zig rename to opentelemetry-sdk/benchmarks/trace/trace.zig diff --git a/docs/logs-emit-flow.md b/opentelemetry-sdk/docs/logs-emit-flow.md similarity index 100% rename from docs/logs-emit-flow.md rename to opentelemetry-sdk/docs/logs-emit-flow.md diff --git a/examples/baggage/basic.zig b/opentelemetry-sdk/examples/baggage/basic.zig similarity index 100% rename from examples/baggage/basic.zig rename to opentelemetry-sdk/examples/baggage/basic.zig diff --git a/examples/baggage/propagation.zig b/opentelemetry-sdk/examples/baggage/propagation.zig similarity index 100% rename from examples/baggage/propagation.zig rename to opentelemetry-sdk/examples/baggage/propagation.zig diff --git a/examples/c/logs.c b/opentelemetry-sdk/examples/c/logs.c similarity index 100% rename from examples/c/logs.c rename to opentelemetry-sdk/examples/c/logs.c diff --git a/examples/c/metrics.c b/opentelemetry-sdk/examples/c/metrics.c similarity index 100% rename from examples/c/metrics.c rename to opentelemetry-sdk/examples/c/metrics.c diff --git a/examples/c/trace.c b/opentelemetry-sdk/examples/c/trace.c similarity index 100% rename from examples/c/trace.c rename to opentelemetry-sdk/examples/c/trace.c diff --git a/examples/logs/.gitkeep b/opentelemetry-sdk/examples/logs/.gitkeep similarity index 100% rename from examples/logs/.gitkeep rename to opentelemetry-sdk/examples/logs/.gitkeep diff --git a/examples/logs/basic.zig b/opentelemetry-sdk/examples/logs/basic.zig similarity index 100% rename from examples/logs/basic.zig rename to opentelemetry-sdk/examples/logs/basic.zig diff --git a/examples/logs/batching.zig b/opentelemetry-sdk/examples/logs/batching.zig similarity index 100% rename from examples/logs/batching.zig rename to opentelemetry-sdk/examples/logs/batching.zig diff --git a/examples/logs/otlp.zig b/opentelemetry-sdk/examples/logs/otlp.zig similarity index 100% rename from examples/logs/otlp.zig rename to opentelemetry-sdk/examples/logs/otlp.zig diff --git a/examples/logs/std_log_basic.zig b/opentelemetry-sdk/examples/logs/std_log_basic.zig similarity index 100% rename from examples/logs/std_log_basic.zig rename to opentelemetry-sdk/examples/logs/std_log_basic.zig diff --git a/examples/logs/std_log_migration.zig b/opentelemetry-sdk/examples/logs/std_log_migration.zig similarity index 100% rename from examples/logs/std_log_migration.zig rename to opentelemetry-sdk/examples/logs/std_log_migration.zig diff --git a/examples/logs/std_log_per_scope.zig b/opentelemetry-sdk/examples/logs/std_log_per_scope.zig similarity index 100% rename from examples/logs/std_log_per_scope.zig rename to opentelemetry-sdk/examples/logs/std_log_per_scope.zig diff --git a/examples/metrics/.gitkeep b/opentelemetry-sdk/examples/metrics/.gitkeep similarity index 100% rename from examples/metrics/.gitkeep rename to opentelemetry-sdk/examples/metrics/.gitkeep diff --git a/examples/metrics/basic.zig b/opentelemetry-sdk/examples/metrics/basic.zig similarity index 100% rename from examples/metrics/basic.zig rename to opentelemetry-sdk/examples/metrics/basic.zig diff --git a/examples/metrics/histogram.zig b/opentelemetry-sdk/examples/metrics/histogram.zig similarity index 100% rename from examples/metrics/histogram.zig rename to opentelemetry-sdk/examples/metrics/histogram.zig diff --git a/examples/metrics/http_server.zig b/opentelemetry-sdk/examples/metrics/http_server.zig similarity index 100% rename from examples/metrics/http_server.zig rename to opentelemetry-sdk/examples/metrics/http_server.zig diff --git a/examples/metrics/otlp.zig b/opentelemetry-sdk/examples/metrics/otlp.zig similarity index 100% rename from examples/metrics/otlp.zig rename to opentelemetry-sdk/examples/metrics/otlp.zig diff --git a/examples/metrics/prometheus.zig b/opentelemetry-sdk/examples/metrics/prometheus.zig similarity index 100% rename from examples/metrics/prometheus.zig rename to opentelemetry-sdk/examples/metrics/prometheus.zig diff --git a/examples/otlp_stub/server.zig b/opentelemetry-sdk/examples/otlp_stub/server.zig similarity index 100% rename from examples/otlp_stub/server.zig rename to opentelemetry-sdk/examples/otlp_stub/server.zig diff --git a/examples/propagation/basic.zig b/opentelemetry-sdk/examples/propagation/basic.zig similarity index 100% rename from examples/propagation/basic.zig rename to opentelemetry-sdk/examples/propagation/basic.zig diff --git a/examples/trace/.gitkeep b/opentelemetry-sdk/examples/trace/.gitkeep similarity index 100% rename from examples/trace/.gitkeep rename to opentelemetry-sdk/examples/trace/.gitkeep diff --git a/examples/trace/multiple_tracers.zig b/opentelemetry-sdk/examples/trace/multiple_tracers.zig similarity index 100% rename from examples/trace/multiple_tracers.zig rename to opentelemetry-sdk/examples/trace/multiple_tracers.zig diff --git a/examples/trace/simple.zig b/opentelemetry-sdk/examples/trace/simple.zig similarity index 100% rename from examples/trace/simple.zig rename to opentelemetry-sdk/examples/trace/simple.zig diff --git a/include/opentelemetry.h b/opentelemetry-sdk/include/opentelemetry.h similarity index 100% rename from include/opentelemetry.h rename to opentelemetry-sdk/include/opentelemetry.h diff --git a/integration_tests/README.md b/opentelemetry-sdk/integration_tests/README.md similarity index 98% rename from integration_tests/README.md rename to opentelemetry-sdk/integration_tests/README.md index 7940ff9..14055f3 100644 --- a/integration_tests/README.md +++ b/opentelemetry-sdk/integration_tests/README.md @@ -26,7 +26,7 @@ Each test executable runs independently with its own: To run all integration tests: ```bash -zig build integration +zig build sdk-integration ``` The tests will run with separate collector containers, allowing for parallel execution. @@ -100,7 +100,7 @@ To add new integration tests: - `waitForFile()` - Wait for collector to write output files - `waitForFileContent()` - Wait for specific content in output files - `readJsonFile()` - Read JSON output files -4. The test will automatically be discovered and run by `zig build integration` +4. The test will automatically be discovered and run by `zig build sdk-integration` ## Troubleshooting diff --git a/integration_tests/common.zig b/opentelemetry-sdk/integration_tests/common.zig similarity index 100% rename from integration_tests/common.zig rename to opentelemetry-sdk/integration_tests/common.zig diff --git a/integration_tests/logs.zig b/opentelemetry-sdk/integration_tests/logs.zig similarity index 100% rename from integration_tests/logs.zig rename to opentelemetry-sdk/integration_tests/logs.zig diff --git a/integration_tests/metrics.zig b/opentelemetry-sdk/integration_tests/metrics.zig similarity index 100% rename from integration_tests/metrics.zig rename to opentelemetry-sdk/integration_tests/metrics.zig diff --git a/integration_tests/metrics_http_json.zig b/opentelemetry-sdk/integration_tests/metrics_http_json.zig similarity index 100% rename from integration_tests/metrics_http_json.zig rename to opentelemetry-sdk/integration_tests/metrics_http_json.zig diff --git a/integration_tests/otel-collector-config.yaml b/opentelemetry-sdk/integration_tests/otel-collector-config.yaml similarity index 100% rename from integration_tests/otel-collector-config.yaml rename to opentelemetry-sdk/integration_tests/otel-collector-config.yaml diff --git a/integration_tests/prometheus.zig b/opentelemetry-sdk/integration_tests/prometheus.zig similarity index 100% rename from integration_tests/prometheus.zig rename to opentelemetry-sdk/integration_tests/prometheus.zig diff --git a/integration_tests/traces.zig b/opentelemetry-sdk/integration_tests/traces.zig similarity index 100% rename from integration_tests/traces.zig rename to opentelemetry-sdk/integration_tests/traces.zig diff --git a/src/api.zig b/opentelemetry-sdk/src/api.zig similarity index 100% rename from src/api.zig rename to opentelemetry-sdk/src/api.zig diff --git a/src/api/baggage.zig b/opentelemetry-sdk/src/api/baggage.zig similarity index 100% rename from src/api/baggage.zig rename to opentelemetry-sdk/src/api/baggage.zig diff --git a/src/api/baggage/propagator.zig b/opentelemetry-sdk/src/api/baggage/propagator.zig similarity index 100% rename from src/api/baggage/propagator.zig rename to opentelemetry-sdk/src/api/baggage/propagator.zig diff --git a/src/api/context.zig b/opentelemetry-sdk/src/api/context.zig similarity index 100% rename from src/api/context.zig rename to opentelemetry-sdk/src/api/context.zig diff --git a/src/api/context/context.zig b/opentelemetry-sdk/src/api/context/context.zig similarity index 100% rename from src/api/context/context.zig rename to opentelemetry-sdk/src/api/context/context.zig diff --git a/src/api/logs.zig b/opentelemetry-sdk/src/api/logs.zig similarity index 100% rename from src/api/logs.zig rename to opentelemetry-sdk/src/api/logs.zig diff --git a/src/api/logs/enabled_parameters.zig b/opentelemetry-sdk/src/api/logs/enabled_parameters.zig similarity index 100% rename from src/api/logs/enabled_parameters.zig rename to opentelemetry-sdk/src/api/logs/enabled_parameters.zig diff --git a/src/api/logs/logger_provider.zig b/opentelemetry-sdk/src/api/logs/logger_provider.zig similarity index 100% rename from src/api/logs/logger_provider.zig rename to opentelemetry-sdk/src/api/logs/logger_provider.zig diff --git a/src/api/metrics.zig b/opentelemetry-sdk/src/api/metrics.zig similarity index 100% rename from src/api/metrics.zig rename to opentelemetry-sdk/src/api/metrics.zig diff --git a/src/api/metrics/async_instrument.zig b/opentelemetry-sdk/src/api/metrics/async_instrument.zig similarity index 100% rename from src/api/metrics/async_instrument.zig rename to opentelemetry-sdk/src/api/metrics/async_instrument.zig diff --git a/src/api/metrics/instrument.zig b/opentelemetry-sdk/src/api/metrics/instrument.zig similarity index 100% rename from src/api/metrics/instrument.zig rename to opentelemetry-sdk/src/api/metrics/instrument.zig diff --git a/src/api/metrics/measurement.zig b/opentelemetry-sdk/src/api/metrics/measurement.zig similarity index 100% rename from src/api/metrics/measurement.zig rename to opentelemetry-sdk/src/api/metrics/measurement.zig diff --git a/src/api/metrics/meter.zig b/opentelemetry-sdk/src/api/metrics/meter.zig similarity index 100% rename from src/api/metrics/meter.zig rename to opentelemetry-sdk/src/api/metrics/meter.zig diff --git a/src/api/metrics/spec.zig b/opentelemetry-sdk/src/api/metrics/spec.zig similarity index 100% rename from src/api/metrics/spec.zig rename to opentelemetry-sdk/src/api/metrics/spec.zig diff --git a/src/api/trace.zig b/opentelemetry-sdk/src/api/trace.zig similarity index 100% rename from src/api/trace.zig rename to opentelemetry-sdk/src/api/trace.zig diff --git a/src/api/trace/code.zig b/opentelemetry-sdk/src/api/trace/code.zig similarity index 100% rename from src/api/trace/code.zig rename to opentelemetry-sdk/src/api/trace/code.zig diff --git a/src/api/trace/config.zig b/opentelemetry-sdk/src/api/trace/config.zig similarity index 100% rename from src/api/trace/config.zig rename to opentelemetry-sdk/src/api/trace/config.zig diff --git a/src/api/trace/link.zig b/opentelemetry-sdk/src/api/trace/link.zig similarity index 100% rename from src/api/trace/link.zig rename to opentelemetry-sdk/src/api/trace/link.zig diff --git a/src/api/trace/span.zig b/opentelemetry-sdk/src/api/trace/span.zig similarity index 100% rename from src/api/trace/span.zig rename to opentelemetry-sdk/src/api/trace/span.zig diff --git a/src/api/trace/trace_flags.zig b/opentelemetry-sdk/src/api/trace/trace_flags.zig similarity index 100% rename from src/api/trace/trace_flags.zig rename to opentelemetry-sdk/src/api/trace/trace_flags.zig diff --git a/src/api/trace/tracer.zig b/opentelemetry-sdk/src/api/trace/tracer.zig similarity index 100% rename from src/api/trace/tracer.zig rename to opentelemetry-sdk/src/api/trace/tracer.zig diff --git a/src/attributes.zig b/opentelemetry-sdk/src/attributes.zig similarity index 100% rename from src/attributes.zig rename to opentelemetry-sdk/src/attributes.zig diff --git a/src/c.zig b/opentelemetry-sdk/src/c.zig similarity index 100% rename from src/c.zig rename to opentelemetry-sdk/src/c.zig diff --git a/src/c/logs.zig b/opentelemetry-sdk/src/c/logs.zig similarity index 100% rename from src/c/logs.zig rename to opentelemetry-sdk/src/c/logs.zig diff --git a/src/c/metrics.zig b/opentelemetry-sdk/src/c/metrics.zig similarity index 100% rename from src/c/metrics.zig rename to opentelemetry-sdk/src/c/metrics.zig diff --git a/src/c/trace.zig b/opentelemetry-sdk/src/c/trace.zig similarity index 100% rename from src/c/trace.zig rename to opentelemetry-sdk/src/c/trace.zig diff --git a/src/clock.zig b/opentelemetry-sdk/src/clock.zig similarity index 100% rename from src/clock.zig rename to opentelemetry-sdk/src/clock.zig diff --git a/src/otlp.zig b/opentelemetry-sdk/src/otlp.zig similarity index 100% rename from src/otlp.zig rename to opentelemetry-sdk/src/otlp.zig diff --git a/src/otlp_test.zig b/opentelemetry-sdk/src/otlp_test.zig similarity index 100% rename from src/otlp_test.zig rename to opentelemetry-sdk/src/otlp_test.zig diff --git a/src/scope.zig b/opentelemetry-sdk/src/scope.zig similarity index 100% rename from src/scope.zig rename to opentelemetry-sdk/src/scope.zig diff --git a/src/sdk.zig b/opentelemetry-sdk/src/sdk.zig similarity index 100% rename from src/sdk.zig rename to opentelemetry-sdk/src/sdk.zig diff --git a/src/sdk/config.zig b/opentelemetry-sdk/src/sdk/config.zig similarity index 100% rename from src/sdk/config.zig rename to opentelemetry-sdk/src/sdk/config.zig diff --git a/src/sdk/logs.zig b/opentelemetry-sdk/src/sdk/logs.zig similarity index 100% rename from src/sdk/logs.zig rename to opentelemetry-sdk/src/sdk/logs.zig diff --git a/src/sdk/logs/concurrency_test.zig b/opentelemetry-sdk/src/sdk/logs/concurrency_test.zig similarity index 100% rename from src/sdk/logs/concurrency_test.zig rename to opentelemetry-sdk/src/sdk/logs/concurrency_test.zig diff --git a/src/sdk/logs/exporters/exporter.zig b/opentelemetry-sdk/src/sdk/logs/exporters/exporter.zig similarity index 100% rename from src/sdk/logs/exporters/exporter.zig rename to opentelemetry-sdk/src/sdk/logs/exporters/exporter.zig diff --git a/src/sdk/logs/exporters/file.zig b/opentelemetry-sdk/src/sdk/logs/exporters/file.zig similarity index 100% rename from src/sdk/logs/exporters/file.zig rename to opentelemetry-sdk/src/sdk/logs/exporters/file.zig diff --git a/src/sdk/logs/exporters/generic.zig b/opentelemetry-sdk/src/sdk/logs/exporters/generic.zig similarity index 100% rename from src/sdk/logs/exporters/generic.zig rename to opentelemetry-sdk/src/sdk/logs/exporters/generic.zig diff --git a/src/sdk/logs/exporters/otlp.zig b/opentelemetry-sdk/src/sdk/logs/exporters/otlp.zig similarity index 100% rename from src/sdk/logs/exporters/otlp.zig rename to opentelemetry-sdk/src/sdk/logs/exporters/otlp.zig diff --git a/src/sdk/logs/log_record_exporter.zig b/opentelemetry-sdk/src/sdk/logs/log_record_exporter.zig similarity index 100% rename from src/sdk/logs/log_record_exporter.zig rename to opentelemetry-sdk/src/sdk/logs/log_record_exporter.zig diff --git a/src/sdk/logs/log_record_processor.zig b/opentelemetry-sdk/src/sdk/logs/log_record_processor.zig similarity index 100% rename from src/sdk/logs/log_record_processor.zig rename to opentelemetry-sdk/src/sdk/logs/log_record_processor.zig diff --git a/src/sdk/logs/std_log_bridge.zig b/opentelemetry-sdk/src/sdk/logs/std_log_bridge.zig similarity index 100% rename from src/sdk/logs/std_log_bridge.zig rename to opentelemetry-sdk/src/sdk/logs/std_log_bridge.zig diff --git a/src/sdk/metrics.zig b/opentelemetry-sdk/src/sdk/metrics.zig similarity index 100% rename from src/sdk/metrics.zig rename to opentelemetry-sdk/src/sdk/metrics.zig diff --git a/src/sdk/metrics/aggregation.zig b/opentelemetry-sdk/src/sdk/metrics/aggregation.zig similarity index 100% rename from src/sdk/metrics/aggregation.zig rename to opentelemetry-sdk/src/sdk/metrics/aggregation.zig diff --git a/src/sdk/metrics/exporter.zig b/opentelemetry-sdk/src/sdk/metrics/exporter.zig similarity index 100% rename from src/sdk/metrics/exporter.zig rename to opentelemetry-sdk/src/sdk/metrics/exporter.zig diff --git a/src/sdk/metrics/exporters/file.zig b/opentelemetry-sdk/src/sdk/metrics/exporters/file.zig similarity index 100% rename from src/sdk/metrics/exporters/file.zig rename to opentelemetry-sdk/src/sdk/metrics/exporters/file.zig diff --git a/src/sdk/metrics/exporters/in_memory.zig b/opentelemetry-sdk/src/sdk/metrics/exporters/in_memory.zig similarity index 100% rename from src/sdk/metrics/exporters/in_memory.zig rename to opentelemetry-sdk/src/sdk/metrics/exporters/in_memory.zig diff --git a/src/sdk/metrics/exporters/otlp.zig b/opentelemetry-sdk/src/sdk/metrics/exporters/otlp.zig similarity index 100% rename from src/sdk/metrics/exporters/otlp.zig rename to opentelemetry-sdk/src/sdk/metrics/exporters/otlp.zig diff --git a/src/sdk/metrics/exporters/prometheus.zig b/opentelemetry-sdk/src/sdk/metrics/exporters/prometheus.zig similarity index 100% rename from src/sdk/metrics/exporters/prometheus.zig rename to opentelemetry-sdk/src/sdk/metrics/exporters/prometheus.zig diff --git a/src/sdk/metrics/exporters/stdout.zig b/opentelemetry-sdk/src/sdk/metrics/exporters/stdout.zig similarity index 100% rename from src/sdk/metrics/exporters/stdout.zig rename to opentelemetry-sdk/src/sdk/metrics/exporters/stdout.zig diff --git a/src/sdk/metrics/reader.zig b/opentelemetry-sdk/src/sdk/metrics/reader.zig similarity index 100% rename from src/sdk/metrics/reader.zig rename to opentelemetry-sdk/src/sdk/metrics/reader.zig diff --git a/src/sdk/metrics/temporality.zig b/opentelemetry-sdk/src/sdk/metrics/temporality.zig similarity index 100% rename from src/sdk/metrics/temporality.zig rename to opentelemetry-sdk/src/sdk/metrics/temporality.zig diff --git a/src/sdk/metrics/view.zig b/opentelemetry-sdk/src/sdk/metrics/view.zig similarity index 100% rename from src/sdk/metrics/view.zig rename to opentelemetry-sdk/src/sdk/metrics/view.zig diff --git a/src/sdk/propagation.zig b/opentelemetry-sdk/src/sdk/propagation.zig similarity index 100% rename from src/sdk/propagation.zig rename to opentelemetry-sdk/src/sdk/propagation.zig diff --git a/src/sdk/resource.zig b/opentelemetry-sdk/src/sdk/resource.zig similarity index 100% rename from src/sdk/resource.zig rename to opentelemetry-sdk/src/sdk/resource.zig diff --git a/src/sdk/trace.zig b/opentelemetry-sdk/src/sdk/trace.zig similarity index 100% rename from src/sdk/trace.zig rename to opentelemetry-sdk/src/sdk/trace.zig diff --git a/src/sdk/trace/exporter.zig b/opentelemetry-sdk/src/sdk/trace/exporter.zig similarity index 100% rename from src/sdk/trace/exporter.zig rename to opentelemetry-sdk/src/sdk/trace/exporter.zig diff --git a/src/sdk/trace/exporters/file.zig b/opentelemetry-sdk/src/sdk/trace/exporters/file.zig similarity index 100% rename from src/sdk/trace/exporters/file.zig rename to opentelemetry-sdk/src/sdk/trace/exporters/file.zig diff --git a/src/sdk/trace/exporters/generic.zig b/opentelemetry-sdk/src/sdk/trace/exporters/generic.zig similarity index 100% rename from src/sdk/trace/exporters/generic.zig rename to opentelemetry-sdk/src/sdk/trace/exporters/generic.zig diff --git a/src/sdk/trace/exporters/otlp.zig b/opentelemetry-sdk/src/sdk/trace/exporters/otlp.zig similarity index 100% rename from src/sdk/trace/exporters/otlp.zig rename to opentelemetry-sdk/src/sdk/trace/exporters/otlp.zig diff --git a/src/sdk/trace/id_generator.zig b/opentelemetry-sdk/src/sdk/trace/id_generator.zig similarity index 100% rename from src/sdk/trace/id_generator.zig rename to opentelemetry-sdk/src/sdk/trace/id_generator.zig diff --git a/src/sdk/trace/provider.zig b/opentelemetry-sdk/src/sdk/trace/provider.zig similarity index 100% rename from src/sdk/trace/provider.zig rename to opentelemetry-sdk/src/sdk/trace/provider.zig diff --git a/src/sdk/trace/span_exporter.zig b/opentelemetry-sdk/src/sdk/trace/span_exporter.zig similarity index 100% rename from src/sdk/trace/span_exporter.zig rename to opentelemetry-sdk/src/sdk/trace/span_exporter.zig diff --git a/src/sdk/trace/span_processor.zig b/opentelemetry-sdk/src/sdk/trace/span_processor.zig similarity index 100% rename from src/sdk/trace/span_processor.zig rename to opentelemetry-sdk/src/sdk/trace/span_processor.zig diff --git a/src/test_runner.zig b/opentelemetry-sdk/src/test_runner.zig similarity index 100% rename from src/test_runner.zig rename to opentelemetry-sdk/src/test_runner.zig