Skip to content

Instantly share code, notes, and snippets.

@mosheeshel
Last active June 18, 2020 23:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mosheeshel/60d699eca1ae2974ad898a7632ed07df to your computer and use it in GitHub Desktop.
Save mosheeshel/60d699eca1ae2974ad898a7632ed07df to your computer and use it in GitHub Desktop.
package com.kenshoo.teddy.infra;
import com.google.inject.Singleton;
import io.honeycomb.libhoney.Event;
import io.honeycomb.libhoney.HoneyClient;
import io.honeycomb.libhoney.builders.HoneyClientBuilder;
import io.opentelemetry.sdk.trace.data.SpanData;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.opentelemetry.trace.SpanId;
import java.time.Instant;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* Created by: mosheeshel
* Date: 2020-06-18 4:30 p.m.
**/
public class HoneyCombSpanExporter implements SpanExporter {
private HoneyClient honeyClient;
public HoneyCombSpanExporter(String writeKey, String dataSet, String serviceName, String apiHost) {
try {
this.honeyClient = new HoneyClientBuilder()
.apiHost(apiHost)
.writeKey(writeKey)
.dataSet(dataSet)
.addGlobalField("service_name", serviceName)
.addGlobalField("meta.otel_exporter_version", "0.1")
.addGlobalField("meta.local_hostname", "host")
.build();
} catch (Exception e) {
}
}
public HoneyCombSpanExporter(String writeKey, String dataSet, String serviceName) {
this(writeKey, dataSet, serviceName, "https://api.honeycomb.io");
}
@Override
public ResultCode export(Collection<SpanData> spans) {
try {
convertSpansToEvents(spans)
.forEach(Event::send);
return ResultCode.SUCCESS;
} catch (Exception e) {
return ResultCode.FAILURE;
}
}
private List<Event> convertSpansToEvents(Collection<SpanData> spans) {
return spans.stream()
.map(this::convertSpanToEvent)
.collect(Collectors.toList());
}
private Event convertSpanToEvent(SpanData spanData) {
final long durationNS = spanData.getEndEpochNanos() - spanData.getStartEpochNanos();
final long startEpochMs = TimeUnit.NANOSECONDS.toMillis(spanData.getStartEpochNanos());
final Event event = honeyClient
.createEvent()
.setTimestamp(startEpochMs)
.addField("trace.trace_id", spanData.getTraceId().toLowerBase16())
.addField("trace.span_id", spanData.getSpanId().toLowerBase16())
.addField("name", spanData.getName())
.addField("start_time", Date.from(Instant.ofEpochSecond(startEpochMs)).toString())
.addField("duration_ms", TimeUnit.NANOSECONDS.toMillis(durationNS))
.addField("response.status_code", spanData.getStatus().getCanonicalCode().value())
.addField("status.message", spanData.getStatus().getDescription())
.addField("span.kind", spanData.getKind().name())
.addFields(spanData.getAttributes());
final SpanId parentSpanId = spanData.getParentSpanId();
if (parentSpanId.isValid())
event.addField("trace.parent_id", parentSpanId.toLowerBase16());
if (!spanData.getStatus().isOk())
event.addField("error", true);
return event;
}
@Override
public ResultCode flush() {
return ResultCode.SUCCESS;
}
@Override
public void shutdown() {
honeyClient.close();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment