Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added data compression support for HTTP exporter #631

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ let package = Package(
.library(name: "DatadogExporter", type: .static, targets: ["DatadogExporter"]),
.library(name: "NetworkStatus", type: .static, targets: ["NetworkStatus"]),
.library(name: "OTelSwiftLog", type: .static, targets: ["OTelSwiftLog"]),
.library(name: "DataCompression", type: .static, targets: ["DataCompression"]),
.executable(name: "simpleExporter", targets: ["SimpleExporter"]),
.executable(name: "OTLPExporter", targets: ["OTLPExporter"]),
.executable(name: "OTLPHTTPExporter", targets: ["OTLPHTTPExporter"]),
Expand Down Expand Up @@ -110,14 +111,18 @@ let package = Package(
"OpenTelemetryProtocolExporterCommon",
.product(name: "GRPC", package: "grpc-swift")],
path: "Sources/Exporters/OpenTelemetryProtocolGrpc"),
.target(name: "DataCompression",
dependencies: [],
path: "Sources/Exporters/DataCompression"),
.target(name: "StdoutExporter",
dependencies: ["OpenTelemetrySdk"],
path: "Sources/Exporters/Stdout"),
.target(name: "InMemoryExporter",
dependencies: ["OpenTelemetrySdk"],
path: "Sources/Exporters/InMemory"),
.target(name: "DatadogExporter",
dependencies: ["OpenTelemetrySdk"],
dependencies: ["OpenTelemetrySdk",
"DataCompression"],
path: "Sources/Exporters/DatadogExporter",
exclude: ["NOTICE", "README.md"]),
.target(name: "PersistenceExporter",
Expand Down Expand Up @@ -163,6 +168,7 @@ let package = Package(
.testTarget(name: "OpenTelemetryProtocolExporterTests",
dependencies: ["OpenTelemetryProtocolExporterGrpc",
"OpenTelemetryProtocolExporterHttp",
"DataCompression",
.product(name: "NIO", package: "swift-nio"),
.product(name: "NIOHTTP1", package: "swift-nio"),
.product(name: "NIOTestUtils", package: "swift-nio")],
Expand Down Expand Up @@ -190,7 +196,7 @@ let package = Package(
path: "Examples/OTLP Exporter",
exclude: ["README.md"]),
.target(name: "OTLPHTTPExporter",
dependencies: ["OpenTelemetryProtocolExporterHttp", "StdoutExporter", "ZipkinExporter", "ResourceExtension", "SignPostIntegration"],
dependencies: ["OpenTelemetryProtocolExporterHttp", "StdoutExporter", "ZipkinExporter", "ResourceExtension", "SignPostIntegration", "DataCompression"],
path: "Examples/OTLP HTTP Exporter",
exclude: ["README.md"]),
.target(name: "PrometheusSample",
Expand Down
10 changes: 8 additions & 2 deletions Package@swift-5.6.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ let package = Package(
.library(name: "DatadogExporter", type: .static, targets: ["DatadogExporter"]),
.library(name: "NetworkStatus", type: .static, targets: ["NetworkStatus"]),
.library(name: "OTelSwiftLog", type: .static, targets: ["OTelSwiftLog"]),
.library(name: "DataCompression", type: .static, targets: ["DataCompression"]),
.executable(name: "simpleExporter", targets: ["SimpleExporter"]),
.executable(name: "OTLPExporter", targets: ["OTLPExporter"]),
.executable(name: "OTLPHTTPExporter", targets: ["OTLPHTTPExporter"]),
Expand Down Expand Up @@ -115,14 +116,18 @@ let package = Package(
"OpenTelemetryProtocolExporterCommon",
.product(name: "GRPC", package: "grpc-swift")],
path: "Sources/Exporters/OpenTelemetryProtocolGrpc"),
.target(name: "DataCompression",
dependencies: [],
path: "Sources/Exporters/DataCompression"),
.target(name: "StdoutExporter",
dependencies: ["OpenTelemetrySdk"],
path: "Sources/Exporters/Stdout"),
.target(name: "InMemoryExporter",
dependencies: ["OpenTelemetrySdk"],
path: "Sources/Exporters/InMemory"),
.target(name: "DatadogExporter",
dependencies: ["OpenTelemetrySdk"],
dependencies: ["OpenTelemetrySdk",
"DataCompression"],
path: "Sources/Exporters/DatadogExporter",
exclude: ["NOTICE", "README.md"]),
.target(name: "PersistenceExporter",
Expand Down Expand Up @@ -173,6 +178,7 @@ let package = Package(
.testTarget(name: "OpenTelemetryProtocolExporterTests",
dependencies: ["OpenTelemetryProtocolExporterGrpc",
"OpenTelemetryProtocolExporterHttp",
"DataCompression",
.product(name: "NIO", package: "swift-nio"),
.product(name: "NIOHTTP1", package: "swift-nio"),
.product(name: "NIOTestUtils", package: "swift-nio")],
Expand Down Expand Up @@ -207,7 +213,7 @@ let package = Package(
),
.executableTarget(
name: "OTLPHTTPExporter",
dependencies: ["OpenTelemetrySdk", "OpenTelemetryProtocolExporterHttp", "StdoutExporter", "ZipkinExporter", "ResourceExtension", "SignPostIntegration"],
dependencies: ["OpenTelemetrySdk", "OpenTelemetryProtocolExporterHttp", "StdoutExporter", "ZipkinExporter", "ResourceExtension", "SignPostIntegration", "DataCompression"],
path: "Examples/OTLP HTTP Exporter",
exclude: ["README.md"]
),
Expand Down
10 changes: 8 additions & 2 deletions Package@swift-5.9.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ let package = Package(
.library(name: "PersistenceExporter", targets: ["PersistenceExporter"]),
.library(name: "InMemoryExporter", targets: ["InMemoryExporter"]),
.library(name: "OTelSwiftLog", targets: ["OTelSwiftLog"]),
.library(name: "DataCompression", type: .static, targets: ["DataCompression"]),
.executable(name: "ConcurrencyContext", targets: ["ConcurrencyContext"]),
.executable(name: "loggingTracer", targets: ["LoggingTracer"]),
],
Expand Down Expand Up @@ -70,6 +71,9 @@ let package = Package(
"OpenTelemetryProtocolExporterCommon",
.product(name: "GRPC", package: "grpc-swift")],
path: "Sources/Exporters/OpenTelemetryProtocolGrpc"),
.target(name: "DataCompression",
dependencies: [],
path: "Sources/Exporters/DataCompression"),
.target(name: "StdoutExporter",
dependencies: ["OpenTelemetrySdk"],
path: "Sources/Exporters/Stdout"),
Expand Down Expand Up @@ -100,6 +104,7 @@ let package = Package(
.testTarget(name: "OpenTelemetryProtocolExporterTests",
dependencies: ["OpenTelemetryProtocolExporterGrpc",
"OpenTelemetryProtocolExporterHttp",
"DataCompression",
.product(name: "NIO", package: "swift-nio"),
.product(name: "NIOHTTP1", package: "swift-nio"),
.product(name: "NIOTestUtils", package: "swift-nio")],
Expand Down Expand Up @@ -240,7 +245,7 @@ extension Package {
),
.executableTarget(
name: "OTLPHTTPExporter",
dependencies: ["OpenTelemetrySdk", "OpenTelemetryProtocolExporterHttp", "StdoutExporter", "ZipkinExporter", "ResourceExtension", "SignPostIntegration"],
dependencies: ["OpenTelemetrySdk", "OpenTelemetryProtocolExporterHttp", "StdoutExporter", "ZipkinExporter", "ResourceExtension", "SignPostIntegration", "DataCompression"],
path: "Examples/OTLP HTTP Exporter",
exclude: ["README.md"]
),
Expand All @@ -256,7 +261,8 @@ extension Package {
dependencies: ["ResourceExtension", "OpenTelemetrySdk"],
path: "Tests/InstrumentationTests/SDKResourceExtensionTests"),
.target(name: "DatadogExporter",
dependencies: ["OpenTelemetrySdk"],
dependencies: ["OpenTelemetrySdk",
"DataCompression"],
path: "Sources/Exporters/DatadogExporter",
exclude: ["NOTICE", "README.md"]),
.testTarget(name: "DatadogExporterTests",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@


import Foundation

#if canImport(Compression)
import Compression
mamunto marked this conversation as resolved.
Show resolved Hide resolved

extension Data
public extension Data
{
/// Compresses the data.
/// - parameter withAlgorithm: Compression algorithm to use. See the `CompressionAlgorithm` type
Expand Down Expand Up @@ -247,7 +249,7 @@ extension Data

/// Calculate the Adler32 checksum of the data.
/// - returns: Adler32 checksum type. Can still be further advanced.
func adler32() -> Adler32
internal func adler32() -> Adler32
{
var res = Adler32()
res.advance(withChunk: self)
Expand All @@ -256,7 +258,7 @@ extension Data

/// Calculate the Crc32 checksum of the data.
/// - returns: Crc32 checksum type. Can still be further advanced.
func crc32() -> Crc32
internal func crc32() -> Crc32
{
var res = Crc32()
res.advance(withChunk: self)
Expand Down Expand Up @@ -514,3 +516,4 @@ fileprivate func perform(_ config: Config, source: UnsafePointer<UInt8>, sourceS
}
}
}
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
* SPDX-License-Identifier: Apache-2.0
*/

#if canImport(Compression)
import DataCompression
#endif
import Foundation

/// Builds `URLRequest` for sending data to Datadog.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@

import Foundation

public enum CompressionType {
case gzip
case deflate
case none
}

public struct OtlpConfiguration {
public static let DefaultTimeoutInterval : TimeInterval = TimeInterval(10)

Expand All @@ -23,9 +29,15 @@ public struct OtlpConfiguration {
// let compression
public let headers : [(String,String)]?
public let timeout : TimeInterval
public let compression: CompressionType

public init(timeout : TimeInterval = OtlpConfiguration.DefaultTimeoutInterval, headers: [(String,String)]? = nil) {
public init(
timeout : TimeInterval = OtlpConfiguration.DefaultTimeoutInterval,
compression: CompressionType = .gzip,
headers: [(String,String)]? = nil
) {
self.headers = headers
self.timeout = timeout
self.compression = compression
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
// SPDX-License-Identifier: Apache-2.0
//

#if canImport(Compression)
import DataCompression
#endif
import Foundation
import SwiftProtobuf
import OpenTelemetryProtocolExporterCommon
Expand All @@ -28,20 +31,44 @@ public class OtlpHttpExporterBase {
}
}

public func createRequest(body: Message, endpoint: URL) -> URLRequest {
var request = URLRequest(url: endpoint)

do {
request.httpMethod = "POST"
request.httpBody = try body.serializedData()
request.setValue(Headers.getUserAgentHeader(), forHTTPHeaderField: Constants.HTTP.userAgent)
request.setValue("application/x-protobuf", forHTTPHeaderField: "Content-Type")
} catch {
print("Error serializing body: \(error)")
public func createRequest(body: Message, endpoint: URL) -> URLRequest {
var request = URLRequest(url: endpoint)

do {
let rawData = try body.serializedData()
request.httpMethod = "POST"
request.setValue(Headers.getUserAgentHeader(), forHTTPHeaderField: Constants.HTTP.userAgent)
request.setValue("application/x-protobuf", forHTTPHeaderField: "Content-Type")

var compressedData = rawData

#if canImport(Compression)
switch config.compression {
case .gzip:
if let data = rawData.gzip() {
compressedData = data
request.setValue("gzip", forHTTPHeaderField: "Content-Encoding")
}

case .deflate:
if let data = rawData.deflate() {
compressedData = data
request.setValue("deflate", forHTTPHeaderField: "Content-Encoding")
}

case .none:
break
}
#endif
mamunto marked this conversation as resolved.
Show resolved Hide resolved
// Apply final data. Could be compressed or raw
// but it doesn't matter here
request.httpBody = compressedData
} catch {
print("Error serializing body: \(error)")
}

return request
}

return request
}

public func shutdown(explicitTimeout: TimeInterval? = nil) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
// SPDX-License-Identifier: Apache-2.0
//

#if canImport(Compression)
import DataCompression
#endif
import Foundation
import OpenTelemetryProtocolExporterCommon
import SwiftProtobuf
Expand Down Expand Up @@ -44,14 +47,38 @@ public class StableOtlpHTTPExporterBase {
}

do {
let rawData = try body.serializedData()
request.httpMethod = "POST"
request.httpBody = try body.serializedData()
request.setValue(Headers.getUserAgentHeader(), forHTTPHeaderField: Constants.HTTP.userAgent)
request.setValue("application/x-protobuf", forHTTPHeaderField: "Content-Type")

var compressedData = rawData

#if canImport(Compression)
switch config.compression {
case .gzip:
if let data = rawData.gzip() {
compressedData = data
request.setValue("gzip", forHTTPHeaderField: "Content-Encoding")
}

case .deflate:
if let data = rawData.deflate() {
compressedData = data
request.setValue("deflate", forHTTPHeaderField: "Content-Encoding")
}

case .none:
break
}
#endif

// Apply final data. Could be compressed or raw
// but it doesn't matter here
request.httpBody = compressedData
} catch {
print("Error serializing body: \(error)")
}

return request
}

Expand Down
Loading
Loading