grafana-redis-datasource icon indicating copy to clipboard operation
grafana-redis-datasource copied to clipboard

How to set the redis password field when adding the datasource via the Grafana API?

Open vgoklani opened this issue 2 years ago • 1 comments

Hey there,

I'm trying to create a new datasource via the Grafana API for redis. When calling the API, the plugin gets created, but the password field is blank, and therefore the plugin can't connect to our redis instance. I'm able to fix this manually by logging in to the Grafana web app, and manually pasting in the password.... which is incredibly annoying :)

Here's how I'm creating the schema for redis. I've also included the schema for InfluxDB, which works correctly (i.e. the password is getting set when passed via the API)

influxdb_schema = {
    "name": "InfluxDB",
    "type": "influxdb",
    "typeName": "InfluxDB",
    "url": f'http://{os.environ["influxdb_host"]}:{os.environ["influxdb_port"]}',
    "access": "proxy",
    "database": "udp",
    "isDefault": True,
    "user": os.environ["influxdb_username"],
    "password": os.environ["influxdb_password"],
}

redis_schema = {
    "name": "Redis",
    "type": "redis-datasource",
    "typeName": "Redis",
    "url": f'redis://{os.environ["redis_host"]}:{os.environ["redis_port"]}',
    "access": "proxy",
    "database": "",
    "isDefault": False,
    "user": "",
    "password": os.environ["redis_password"],
}

I then just make the REST call:

response = self._session.post(url=f"https://{self._root_url}/grafana/api/datasources", data=json.dumps(schema),)

The password gets set for InfluxDB, but not for redis. Should I be using a different parameter for the redis_schema, is password not the correct parameter? And yes, the environment variables are all defined.

My redis instance is running via docker-compose:

redis0:
  restart: always
  image: redislabs/redistimeseries:latest
  ports:
    - "127.0.0.1:6379:6379"
  volumes:
    - ${OPT_DOCKER_DIRECTORY}/data/redis0:/data
  mem_limit: 32768m
  env_file:
    - ./environment
  container_name: redis0
  healthcheck:
    test: ["CMD", "redis-cli", "ping"]
    interval: 120s
    timeout: 5s
    retries: 3
    start_period: 15s
  command: ["redis-server", "--port 6379", "--appendonly yes", "--appendfsync everysec", "--appendfilename appendonly.aof", "--dbfilename redis.rdb", "--save 600 1 300 10 60 100", "--dir /data", "--protected-mode yes", "--bind 0.0.0.0", "--requirepass ${REDIS_PASSWORD}", "--loadmodule /usr/lib/redis/modules/redistimeseries.so", "RETENTION_POLICY 0", "DUPLICATE_POLICY SUM"]

Thanks!

vgoklani avatar Sep 14 '22 05:09 vgoklani

@vgoklani Redis's password is a part of the secureJsonData and should be set accordingly in the API request.

apiVersion: 1

datasources:
  - name: Redis
    type: redis-datasource
    access: proxy
    orgId: 1
    isDefault: true
    version: 1
    url: redis://host.docker.internal:6379
    jsonData:
      client: standalone
      poolSize: 5
      timeout: 10
      pingInterval: 0
      pipelineWindow: 0
    editable: true
    secureJsonData:
      password: $PASSWORD

mikhail-vl avatar Sep 14 '22 15:09 mikhail-vl