Je suis en train d'intégrer le suivi Jaeger dans K-cours d'eau. Je comptais ajouter à tracer quelques-uns de mes plus importants pipelines et je me demandais ce qui serait une bonne façon de passer traceid d'un piepline à un autre?
Voici ce que j'ai à ce jour - Au début du pipeline de traitement de flux, je commence une période de serveur et enregistrer le traceid dans un magasin d'état. Plus tard, dans une transformation pipeline, j'accéder au statestore et capturer la trace à partir de la méthode de transformation (). Est-ce une bonne façon de gérer le traçage dans le traitement des flux?
input
.mapValues(toSomethingThatMyAppUnderstands)
.mapValues(this::startStreamTrace)
.filter((k, v) -> v.isPresent())
.mapValues(Optional::get)
.mapValues(doSomethingHereWith)
.flatMapValues(doSomethingElse)
.filter((k, v) -> isInterestingEvent(v))
.transform(() -> new TransformerWithTracing<SomeObjectA, SomeObjectB>(IN_MEM_STORE_NAME, someFunction), IN_MEM_STORE_NAME)
.flatMapValues(c -> c)
.to(outTopic, Produced.with(Serdes.String(), new EventSerde()));
public class TransformerWithTracing<V, VR> implements Transformer<String, V, KeyValue<String, VR>> {
final Function valueAction;
final String storeId;
private KeyValueStore<String, String> traceIdStore;
public TransformerWithTracing(String storeId, Function valueAction) {
this.storeId = storeId;
this.valueAction = valueAction;
}
@Override
public void init(ProcessorContext context) {
// KeyValueStore store = ((KeyValueStore<String, String>) context.getStateStore(storeId));
InMemoryKeyValueStore inMemoryKeyValueStore = (InMemoryKeyValueStore) store;
this.traceIdStore = store;
}
@Override
public KeyValue<String, VR> transform(String key, V value) {
System.out.println(traceIdStore.get(key));
// BuildTraceHeader
try(Scope scope = serviceTracer.startServerSpan(traceHeader, "Converting to Enterprise Event")) {
return KeyValue.pair(key, (VR) valueAction.apply(value));
}
}
@Override
public KeyValue<String, VR> punctuate(long timestamp) {
return null;
}
@Override
public void close() {
// if (streamId != null) traceIdStore.delete(streamId);
}
}
Il y a des idées similaires dans ce repo Zipkin / courageux par @jeqo.
https://github.com/jeqo/brave/tree/kafka-streams-processor/instrumentation/kafka-streams
Il semble aussi être quelque chose disponible en repo opentracing-contrib mais il semble seulement au producteur de trace / niveau des consommateurs.
https://github.com/opentracing-contrib/java-kafka-client/tree/master/opentracing-kafka-streams
- squeeze