@Override public Long call(CassandraRow r) { return r.getLong("trace_id"); }
@Override public String call(CassandraRow r) { return r.getString("trace_id"); }
@Override public Iterable<DependencyLink> call(Iterable<CassandraRow> rows) { if (logInitializer != null) logInitializer.run(); V1ThriftSpanReader reader = V1ThriftSpanReader.create(); V1SpanConverter converter = V1SpanConverter.create(); List<Span> sameTraceId = new ArrayList<>(); for (CassandraRow row : rows) { try { V1Span v1Span = reader.read(row.getBytes("span")); for (Span span : converter.convert(v1Span)) { // check to see if the trace is within the interval if (span.parentId() == null) { long timestamp = span.timestampAsLong(); if (timestamp == 0 || timestamp < startTs || timestamp > endTs) { return Collections.emptyList(); } } sameTraceId.add(span); } } catch (RuntimeException e) { log.warn( String.format( "Unable to decode span from traces where trace_id=%s and ts=%s and span_name='%s'", row.getLong("trace_id"), row.getDate("ts").getTime(), row.getString("span_name")), e); } } return new DependencyLinker().putTrace(sameTraceId).link(); } }
@Override public Span call(CassandraRow row) { String traceId = CassandraDependenciesJob.traceId(row), spanId = row.getString("id"); Span.Builder builder = Span.newBuilder() .traceId(traceId) .parentId(row.getString("parent_id")) .id(spanId) .timestamp(row.getLong("ts")) .shared(row.getBoolean("shared")); Map<String, String> tags = row.getMap( "tags", TypeConverter.StringConverter$.MODULE$, TypeConverter.StringConverter$.MODULE$); String error = tags.get("error"); if (error != null) builder.putTag("error", error); String kind = row.getString("kind"); if (kind != null) { try { builder.kind(Span.Kind.valueOf(kind)); } catch (IllegalArgumentException ignored) { log.debug("couldn't parse kind {} in span {}/{}", kind, traceId, spanId); } } Endpoint localEndpoint = readEndpoint(row, "l_ep"); if (localEndpoint != null) { builder.localEndpoint(localEndpoint); } Endpoint remoteEndpoint = readEndpoint(row, "r_ep"); if (remoteEndpoint != null) { builder.remoteEndpoint(remoteEndpoint); } return builder.build(); }
private Endpoint readEndpoint(CassandraRow row, String name) { if (!inTest) { return readEndpoint(row.getUDTValue(name)); } // UDT type doesn't work in tests // Caused by: com.datastax.spark.connector.types.TypeConversionException: Cannot convert object zipkin2.storage.cassandra.Schema$EndpointUDT@67a3fdf8 of type class zipkin2.storage.cassandra.Schema$EndpointUDT to com.datastax.spark.connector.japi.UDTValue. return readEndpoint(row.getObject(name)); }
static String traceId(CassandraRow r) { String traceId = r.getString("trace_id"); if (traceId.length() > 16) traceId = traceId.substring(traceId.length() - 16); return traceId; }