tvl-depot/tvix/store
Florian Klink 3307791855 feat(tvix/store): add opentelemetry
This is behind the otlp feature flag (currently enabled by default).

By default, this will try to push traces to a OTLP collector running at
https://localhost:4317.

You can make one available by running:

```
docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -e COLLECTOR_OTLP_ENABLED=true \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 14250:14250 \
  -p 14268:14268 \
  -p 14269:14269 \
  -p 9411:9411 --rm \
  jaegertracing/all-in-one:1.42
```

Started like that, jaeger brings a web interface at
http://localhost:16686/search

As documented in
https://docs.rs/opentelemetry-otlp/latest/opentelemetry_otlp/, you can
point this to another location by setting `OTEL_EXPORTER_OTLP_ENDPOINT`.

Change-Id: Id1dca367d70027b2ea98bb70bcf99a68363ec2be
Reviewed-on: https://cl.tvl.fyi/c/depot/+/8194
Tested-by: BuildkiteCI
Reviewed-by: tazjin <tazjin@tvl.su>
Autosubmit: flokli <flokli@flokli.de>
Reviewed-by: aaqaishtyaq <aaqaishtyaq@gmail.com>
2024-01-01 17:27:39 +00:00
..
docs chore(tvix/castore): move data model docs to here 2023-11-02 09:08:20 +00:00
protos refactor(tvix/*/protos): separate lint target 2023-12-11 22:35:39 +00:00
src feat(tvix/store): add opentelemetry 2024-01-01 17:27:39 +00:00
build.rs chore(tvix/[ca]store): allow building without tonic-reflection 2023-09-26 10:07:40 +00:00
Cargo.toml feat(tvix/store): add opentelemetry 2024-01-01 17:27:39 +00:00
default.nix fix(tvix/store): Remove virtiofs from default features 2023-10-07 02:34:00 +00:00
README.md fix(tvix/store): rename Read method in Readme 2023-09-26 15:24:32 +00:00

//tvix/store

This contains the code hosting the tvix-store.

For the local store, Nix realizes files on the filesystem in /nix/store (and maintains some metadata in a SQLite database). For "remote stores", it communicates this metadata in NAR (Nix ARchive) and NARInfo format.

Compared to the Nix model, tvix-store stores data on a much more granular level than that, which provides more deduplication possibilities, and more granular copying.

However, enough information is preserved to still be able to render NAR and NARInfo when needed.

More Information

The store consists out of two different gRPC services, tvix.castore.v1 for the low-level content-addressed bits, and tvix.store.v1 for the Nix and StorePath-specific bits.

Check the protos/ subfolder both here and in castore for the definition of the exact RPC methods and messages.

Interacting with the GRPC service manually

The shell environment in //tvix provides evans, which is an interactive REPL-based gPRC client.

You can use it to connect to a tvix-store and call the various RPC methods.

$ cargo run -- daemon &
$ evans --host localhost --port 8000 -r repl
  ______
 |  ____|
 | |__    __   __   __ _   _ __    ___
 |  __|   \ \ / /  / _. | | '_ \  / __|
 | |____   \ V /  | (_| | | | | | \__ \
 |______|   \_/    \__,_| |_| |_| |___/

 more expressive universal gRPC client


localhost:8000> package tvix.castore.v1
tvix.castore.v1@localhost:8000> service BlobService

tvix.castore.v1.BlobService@localhost:8000> call Put --bytes-from-file
data (TYPE_BYTES) => /run/current-system/system
{
  "digest": "KOM3/IHEx7YfInAnlJpAElYezq0Sxn9fRz7xuClwNfA="
}

tvix.castore.v1.BlobService@localhost:8000> call Read --bytes-as-base64
digest (TYPE_BYTES) => KOM3/IHEx7YfInAnlJpAElYezq0Sxn9fRz7xuClwNfA=
{
  "data": "eDg2XzY0LWxpbnV4"
}

$ echo eDg2XzY0LWxpbnV4 | base64 -d
x86_64-linux

Thanks to tvix-store providing gRPC Server Reflection (with reflection feature), you don't need to point evans to the .proto files.