loki && vector
during our past (experiments)[https://community.ops.io/la3mmchen/loki-grafana-1i9d] with loki we created events in loki via curl. this created just a homeopathic amount of events so lets now bring in a logshipper that can talk to loki.
Looking around we can see at (Loki clients)[https://grafana.com/docs/loki/latest/clients/] a curated list from Grafana. The most prominent solution is (Promtail)[https://grafana.com/docs/loki/latest/clients/promtail/] a logshipper thats part of the Loki project.
vector.dev
At work we use another logshipper because of its versatility in handling inputs and outputs: (vector)[https://vector.dev/], an agent solution from data dog.
so lets try to enrich our existing compose-stack with a vector instance that speaks with loki. for this we first need a configuration for loki and some directory to store content in.
$ mkdir -p vector/logs
$ cat <<EOF >>vector/main.yaml
---
data_dir: /tmp
timezone: local
sources:
samplelogs:
type: file
include:
- "/logs/*.log"
exclude: []
ignore_older_secs: 999999
sinks:
loki:
type: loki
inputs:
- samplelogs
endpoint: "http://loki:3100"
encoding:
codec: json
labels:
forwarder: vector
EOF
Now grep some example logs and move them to ./vector/logs/*log. If you don't mind the content of the data sent to Loki just do:
$ docker info > vector/logs/docker.log
enhance compose stack
enhance the existing stack from the (previous)[https://community.ops.io/la3mmchen/loki-grafana-1i9d] article with the following block and start your docker-compose stack.
(...)
vector:
image: "timberio/vector:0.21.X-alpine"
depends_on:
- loki
entrypoint: ["/usr/local/bin/vector", "-c", "/config/main.yaml"]
volumes:
- ./vector/main.yaml:/config/main.yaml
- ./vector/logs/:/logs
You should now see some entry's if you browse logs, lets check fast via logcli:
$ docker-compose run logcli series --analyze-labels '{}'
Creating loki_logcli_run ... done
http://loki:3100/loki/api/v1/series?end=1654024447473483400&match=%7B%7D&start=1654020847473483400
Total Streams: 1
Unique Labels: 1
Label Name Unique Values Found In Streams
forwarder 1
this tells us we've got one stream going into loki. this is because we've attached one label to the logs we've send to grafana loki (forwarder) so therefore loki just saves on stream for us.
Lets change this by attaching the filename as label to the streams; change the vector config to in the labels section to:
labels:
forwarder: vector
file: "{{ file }}"
This tells vector to attach another label with the value of the parsed file to the log stream. After you've restarted vector you can send another example file, e.g. docker --help > vector/logs/docker-help.log and we should now see more within our stats:
$ docker-compose run logcli series --analyze-labels '{}'
Creating loki_logcli_run ... done
http://loki:3100/loki/api/v1/series?end=1654027368307655600&match=%7B%7D&start=1654023768307655600
Total Streams: 2
Unique Labels: 2
Label Name Unique Values Found In Streams
forwarder 1 2
file 1 1
Feel free to check the available streams in Grafana, it should look somehow like this:
follow up
in the next article we will have a look at LogQl that enables you so browse the store information.
appendix
---
version: "3.9"
services:
loki:
image: "grafana/loki:2.5.0"
ports:
- "3100:3100"
logcli:
image: "grafana/logcli:2.5.0-amd64"
environment:
- "LOKI_ADDR=http://loki:3100"
grafana:
image: "grafana/grafana:8.5.3"
depends_on:
- loki
ports:
- "3000:3000"
volumes:
- ./grafana-provision:/etc/grafana/provisioning
vector:
image: "timberio/vector:0.21.X-alpine"
depends_on:
- loki
entrypoint: ["/usr/local/bin/vector", "-c", "/config/main.yaml"]
volumes:
- ./vector/main.yaml:/config/main.yaml
- ./vector/logs/:/logs
Oldest comments (0)