Grafana Enterprise Logs
Grafana Enterprise Logs is the commercial distribution of Loki.
Quickstart
Run GEL 1.5.2 with Podman - for testing only! (no persistence)
cat > config.yaml <<EOF
auth_enabled: false
server:
http_listen_port: 3100
ingester:
lifecycler:
address: 127.0.0.1
ring:
kvstore:
store: inmemory
replication_factor: 1
final_sleep: 0s
chunk_idle_period: 5m
chunk_retain_period: 30s
schema_config:
configs:
- from: 2020-05-15
store: boltdb
object_store: filesystem
schema: v11
index:
prefix: index_
period: 168h
storage_config:
boltdb:
directory: /tmp/loki/index
filesystem:
directory: /tmp/loki/chunks
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
EOF
podman run -it -p 3100:3100 -v $(pwd)/config.yaml:/etc/loki/config.yaml grafana/enterprise-logs:v1.5.2 -config.file=/etc/loki/config.yaml
Targets
Here are the targets available in the enterprise-logs image:
$ podman run docker.io/grafana/enterprise-logs:v1.7.3 -config.file=/etc/enterprise-logs/local-config.yaml -list-targets
admin-api
usage
all
admin-api
cache-generation-loader
compactor
distributor
ingester
ingester-querier
label-access
label-access-ingester-wrapper
querier
query-frontend
query-scheduler
ruler
usage
usage-report
backend
compactor
index-gateway
ingester-querier
query-scheduler
ruler
usage
usage-report
cache-generation-loader
compactor
usage
usage-report
distributor
usage
usage-report
gateway
usage
index-gateway
usage-report
ingester
label-access-ingester-wrapper
usage-report
ingester-querier
label-access
label-access-ingester-wrapper
overrides-exporter
querier
cache-generation-loader
ingester-querier
label-access
query-scheduler
usage
usage-report
query-frontend
cache-generation-loader
query-scheduler
usage
usage-report
query-scheduler
usage-report
read
admin-api
cache-generation-loader
compactor
index-gateway
ingester-querier
label-access
querier
query-frontend
query-scheduler
ruler
usage
usage-report
ruler
ingester-querier
usage-report
table-manager
usage-report
tokengen
usage
usage-report
write
admin-api
distributor
ingester
label-access-ingester-wrapper
usage
usage-report
Deployment
Inspect the Helm chart
Inspect the Kubernetes resources that would be deployed using the Helm chart:
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm template myloki grafana/loki --set enterprise.enabled=true > output.yaml
Deploy GEL 1.5.2 with Tanka
An example Tanka override override file environments/enterprise-logs/main.jsonnet
:
local gel = import 'github.com/grafana/loki/production/ksonnet/enterprise-logs/main.libsonnet';
gel {
_config+:: {
commonArgs+:: {
'admin.client.backend-type': 's3',
'admin.client.s3.access-key-id': 'minio',
'admin.client.s3.bucket-name': 'grafana-logs-admin',
'admin.client.s3.endpoint': 'minio:9000',
'admin.client.s3.insecure': true,
'admin.client.s3.secret-access-key': 'minio123',
'cluster-name': 'mygelcluster',
},
namespace: 'enterprise-logs',
boltdb_shipper_shared_store: 's3',
storage_backend: 's3',
s3_access_key: 'minio',
s3_address: 'minio:9000',
s3_bucket_name: 'grafana-logs-data',
s3_secret_access_key: 'minio123',
ingester_pvc_class: 'standard'
},
_images+:: {
loki: 'grafana/enterprise-logs:v1.5.2'
},
// Deploy tokengen Job available on a first run.
tokengen_job+::: {},
}
Cookbook
Create a token and test the Admin API
For quick testing, create a token by dropping to an enterprise-logs pod:
enterprise-logs -config.file=/etc/loki/config/config.yaml -target=tokengen
Then test the admin-api directly:
kubectl -n $NAMESPACE port-forward svc/loki-enterprise-logs-admin-api 3100:3100
export GEL_TOKEN=(the token above)
curl --silent -u :$GEL_TOKEN localhost:3100/admin/api/v3/tenants | jq
Or test the gateway:
kubectl -n gel3-dev port-forward svc/loki-enterprise-logs-gateway 3101:80
export GEL_TOKEN=(the token above)
curl --silent -u :$GEL_TOKEN localhost:3101/admin/api/v3/tenants | jq
# or test with logcli
logcli --username=standard-applications --password=$GEL_TOKEN --addr="http://localhost:3101" series {}
Access policies and tokens
Update an access policy (v3 API)
This will create an access policy that allows reading and writing of logs in the cluster named myclustername
, across all tenants.
curl -u ":${GEL_ADMIN_TOKEN}" "http://${GEL_IP}:8100/admin/api/v3/accesspolicies/test1" -XPUT \
-H 'If-Match: "1"' \
--data @- <<'EOF'
{
"name": "test1",
"status": "active",
"display_name": "Test access policy",
"realms": [{"tenant": "*", "cluster": "myclustername"}],
"scopes": ["logs:read", "logs:write"]
}
EOF
Create an access policy scoped to a label selector
This will allow users with a token based on this access policy, to only view logs labelled with {environment="dev"}
curl -u ":${GEL_ADMIN_TOKEN}" "http://${gel_public_ip}:8100/admin/api/v3/accesspolicies" --data @- <<EOF
{
"name": "${access_policy_name}",
"display_name": "My LBAC based access policy",
"created_at": "2021-02-01T17:37:59.341728283Z",
"realms": [
{
"tenant": "${tenant_name}",
"cluster": "${cluster_name}",
"label_policies": [
{
"selector": "{environment=\"dev\"}"
}
]
}
],
"scopes": ["logs:read"]
}
EOF
Create a token
This will create a token token-12345
using the access policy test1
which was created above:
(
curl -u ":${GEL_ADMIN_TOKEN}" "http://${GEL_IP}:8100/admin/api/v3/tokens" \
--data @- <<EOF
{
"name": "test-$RANDOM",
"display_name": "Tom's token",
"access_policy": "test1",
"created_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"expiration": "2028-01-01T00:00:00.341728283Z"
}
EOF
) | jq -r '.token'
curl -u ":${GEL_ADMIN_TOKEN}" "http://${GEL_IP}:8100/admin/api/v3/tokens" \
--data @- <<EOF | jq -r '.token'
{
"name": "test-$RANDOM",
"display_name": "Tom's token",
"access_policy": "test1",
"created_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"expiration": "2028-01-01T00:00:00.341728283Z"
}
EOF
Tenant management
Get tenants
export GEL_ADMIN_TOKEN=token_of_your_admin_user
curl -u :$GEL_ADMIN_TOKEN http://localhost:8100/admin/api/v3/tenants
Sending logs
Push 2 log entries into a GEL cluster deployed on Kubernetes (with authentication)
kubectl -n gel port-forward svc/ge-logs 8100
export GEL_ENDPOINT=localhost:8100
export GEL_PUSH_TOKEN=your_auth_token_goes_here
export GEL_TEST_TIME=$(date +%s%N)
# Your tenant ID is just the name of the tenant in GEL
export GEL_TENANT_ID=healingcrystals
curl -v -u ${GEL_TENANT_ID}:${GEL_PUSH_TOKEN} \
-H "Content-Type: application/json" \
-H "X-Scope-OrdID: ${GEL_TENANT_ID}" \
-X POST \
http://${GEL_ENDPOINT}/loki/api/v1/push --data @- <<EOF
{
"streams": [
{
"stream": {
"job": "test_job",
"meal": "breakfast"
},
"values": [
[ "${GEL_TEST_TIME}", "my log line is here" ],
[ "${GEL_TEST_TIME}", "peanut butter on toast" ]
]
}
]
}
EOF