Skip to content

ExpediaDotCom/haystack-blob-example

Repository files navigation

Haystack Blob Example

This application demonstrates the use of Spans and Blobs together to be used by Haystack-Agent. This will show how the metadata for a blob stored could be saved as a tag in a span to be used later for reading them again.

In this example, the client sends a request to the server which then sends the response back to it. Both the request and response are saved as a blob at the client side and then their key is added to the span as a tag. This tag can be further used by haystack to retrieve the blob.

Understanding the implementation

To understand how span tracing works and is implemented please refer haystack-dropwizard-example. For adding the request/response blobs along with tracing, you follow the same steps as tracing example, additionally you need to provide blob configuration similar to:

blobs:
  enabled: true
  store:
   name: file

And update AppConfiguration to return the BlobFactory instance.

How to blob conditionally?

There may be a valid usecase where you don't want to blob request/response with every span, may be for performance reasons. But you may want to turn on the blobs only if you see a X-DEBUG header from your upstream request. In order to do this, you can implement these functions and setBlobable in BlobFactory. By default, they are set to true.

    boolean isServerRequestValidForBlob(ContainerRequestContext req);
    boolean isServerResponseValidForBlob(ContainerResponseContext resp);
    boolean isClientRequestValidForBlob(ClientRequestContext req);
    boolean isClientResponseValidForBlob(ClientResponseContext resp);

Dependencies involved

We use haystack-dropwizard library version >= 0.3.1 that does all the heavy lifting for adding the support of blob feature.

Running this example

Build

Required:

  • Java 1.8

Build:

mvn clean package

Run locally without haystack-agent (Just for debugging purpose)

  • Run the client on localhost:9091

    java -jar target/haystack-blob-example-service-1.0-SNAPSHOT.jar client config-client-local.yaml

  • Run the server on localhost:9090

    java -jar target/haystack-blob-example-service-1.0-SNAPSHOT.jar server config-server-local.yaml

The spans gets logged on the console and blobs will be written under '/blobs' directory in your working directory.

Run locally with haystack-agent (mostly for production)

  • Run the client on localhost:9091

    java -jar target/haystack-blob-example-service-1.0-SNAPSHOT.jar client config-client.yaml

  • Run the server on localhost:9090

    java -jar target/haystack-blob-example-service-1.0-SNAPSHOT.jar server config-server.yaml

Test Blob Feature

  • Send a sample request:

    curl http://localhost:9091/message

Look for the meta-tags request-blob and response-blob in the request and response spans respectively.

Run locally with haystack server intact

To run the complete example properly please refer steps given in haystack-docker for spans-and-blobs. This will also start haystack-agent at port 35001 and haystack-ui at port 8080 locally along with the http reverse-proxy at port 35002 for grpc service.

After running the docker you can test the usage by following the given steps:

About

Example application to show how blobs and spans interact with haystack environment

Resources

License

Stars

3 stars

Watchers

3 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors