Skip to main content

A client library for accessing the Grafana HTTP API, written in Python

Project description

grafana-client

Tests Test coverage License

Python versions Grafana versions

Status PyPI Downloads

About

A client library for accessing the Grafana HTTP API, written in Python.

Setup

Install the package from PyPI.

pip install --upgrade grafana-client

Usage

API overview

This section gives you an idea about how to use the API on behalf of a few samples.

Synchronous

from grafana_client import GrafanaApi

# Connect to Grafana API endpoint using the `GrafanaApi` class
grafana = GrafanaApi.from_url(
    "https://username:password@daq.example.org/grafana/")

# Create user
user = grafana.admin.create_user({
    "name": "User",
    "email": "user@example.org",
    "login": "user",
    "password": "userpassword",
    "OrgId": 1,
})

# Change user password
user = grafana.admin.change_user_password(2, "newpassword")

# Search dashboards based on tag
grafana.search.search_dashboards(tag="applications")

# Find a user by email
user = grafana.users.find_user("test@example.org")

# Add user to team 2
grafana.teams.add_team_member(2, user["id"])

# Create or update a dashboard
grafana.dashboard.update_dashboard(
    dashboard={"dashboard": {...}, "folderId": 0, "overwrite": True})

# Delete a dashboard by UID
grafana.dashboard.delete_dashboard(dashboard_uid="foobar")

# Create organization
grafana.organization.create_organization(
    organization={"name": "new_organization"})

Asynchronous

The asynchronous interfaces are identical, except for the fact that you will need to properly handle coroutines (async/await).

import asyncio
from grafana_client import AsyncGrafanaApi

async def main():
    # Connect to Grafana API endpoint using the `GrafanaApi` class
    grafana = AsyncGrafanaApi.from_url("https://username:password@daq.example.org/grafana/")

    # Create user
    user = await grafana.admin.create_user({
        "name": "User",
        "email": "user@example.org",
        "login": "user",
        "password": "userpassword",
        "OrgId": 1,
    })

    # Change user password
    user = await grafana.admin.change_user_password(2, "newpassword")

asyncio.run(main())

Example programs

There are complete example programs to get you started within the examples folder of this repository.

Feel free to use them as blueprints for your own programs. If you think your exercises could be useful for others, don't hesitate to share them back.

Configuration Settings

Authentication

There are several ways to authenticate to the Grafana HTTP API.

  1. Anonymous access
  2. Grafana API token
  3. HTTP Basic Authentication
  4. HTTP Header Authentication

The Grafana Admin API is a subset of the Grafana API. For accessing those API resources, you will need to use HTTP Basic Authentication.

from grafana_client import GrafanaApi, HeaderAuth, TokenAuth

# 1. Anonymous access
grafana = GrafanaApi.from_url(
    url="https://daq.example.org/grafana/",
)

# 2. Use Grafana API token.
grafana = GrafanaApi.from_url(
    url="https://daq.example.org/grafana/",
    credential=TokenAuth(token="eyJrIjoiWHg...dGJpZCI6MX0="),
)

# 3. Use HTTP basic authentication.
grafana = GrafanaApi.from_url(
    url="https://username:password@daq.example.org/grafana/",
)
grafana = GrafanaApi.from_url(
    url="https://daq.example.org/grafana/",
    credential=("username", "password")
)

# 4. Use HTTP Header authentication.
grafana = GrafanaApi.from_url(
    url="https://daq.example.org/grafana/",
    credential=HeaderAuth(name="X-WEBAUTH-USER", value="foobar"),
)

# Optionally turn off TLS certificate verification.
grafana = GrafanaApi.from_url(
    url="https://username:password@daq.example.org/grafana/?verify=false",
)

# Use `GRAFANA_URL` and `GRAFANA_TOKEN` environment variables.
grafana = GrafanaApi.from_env()

Please note that, on top of the specific examples above, the object obtained by credential can be an arbitrary niquests.auth.AuthBase instance.

DNS Resolver

niquests support using a custom DNS resolver, like but not limited, DNS-over-HTTPS, and DNS-over-QUIC. You will have to set NIQUESTS_DNS_URL environment variable. For example:

export NIQUESTS_DNS_URL="doh+cloudflare://"

See the documentation to learn more about accepted URL parameters and protocols.

Grafana Organization

If the Grafana API is authenticated as a user (for example, with HTTP Basic Authentication), it will use the user's current organization context. That context can be changed with the GrafanaApi.user.switch_actual_user_organisation function.

grafana.user.switch_actual_user_organisation(1)

An instance of GrafanaApi can also be bound to a single organization with the organization_id parameter, ensuring that all requests will be made to that organization. This parameter will cause GrafanaClient to use the X-Grafana-Org-Id header.

grafana = GrafanaApi(..., organization_id=1)

API Tokens are bound to a single organization, so the organization_id parameter does not need to be specified.

HTTP Proxy

The underlying niquests library honors the HTTP_PROXY and HTTPS_PROXY environment variables. Setting them before invoking an application using grafana-client has been confirmed to work. For example:

export HTTP_PROXY=10.10.1.10:3128
export HTTPS_PROXY=10.10.1.11:1080

Pool Size

By default a session pool size of 10 is used. This can be changed by passing the session_pool_size argument to the GrafanaApi constructor:

grafana.client.session_pool_size = 32

TCP Timeout

The default timeout value is five seconds, used for both connect and read timeout.

The constructors of GrafanaApi and GrafanaClient, as well as the factory methods from_url and from_env accept the timeout argument, which can be obtained as a scalar float value, or as a tuple of (<read timeout>, <connect timeout>).

Details

This section of the documentation outlines which parts of the Grafana HTTP API are supported, and to which degree. See also Grafana HTTP API reference.

Compatibility

grafana-client is largely compatible with Grafana 5.x-10.x. However, earlier versions of Grafana might not support certain features or subsystems.

Overview

API Status
Admin +
Alerting +-
Alerting Notification Channels +
Alerting Provisioning +
Annotations +
Authentication +-
Dashboard +
Dashboard Versions +
Dashboard Permissions +
Data Source +
Data Source Permissions +
External Group Sync +
Folder +
Folder Permissions +
Folder/Dashboard Search +-
Health +
Library Elements +
Organisation +
Other +
Plugin +
Preferences +
Rbac +-
Snapshot +
Teams +
User +

Data source health check

Introduction

For checking whether a Grafana data source is healthy, Grafana 9 and newer has a server-side data source health check API. For earlier versions, a client-side implementation is provided.

This implementation works in the same manner as the "Save & test" button works, when creating a data source in the user interface.

The feature can be explored through corresponding client programs in the examples folder of this repository.

Compatibility

The minimum required version for data source health checks is Grafana 7. Prometheus only works on Grafana 8 and newer.

Data source coverage

Health checks are supported for these Grafana data source types.

  • CrateDB
  • Elasticsearch
  • Graphite
  • InfluxDB
  • Jaeger
  • Loki
  • Microsoft SQL Server
  • OpenTSDB
  • PostgreSQL
  • Prometheus
  • Tempo
  • Testdata
  • Zipkin

We are humbly asking the community to contribute adapters for other data source types, popular or not.

Applications

A list of applications based on grafana-client.

Project information

History

The library was originally conceived by Andrew Prokhorenkov and contributors as grafana_api. Thank you very much for your efforts!

At future maintenance of grafana_api, we discussed the need for a fork because the repository stopped receiving updates since more than a year. While forking it, we renamed the package to grafana-client and slightly trimmed the module namespace.

Acknowledgements

Thanks to the original authors and all contributors who helped to co-create and conceive this software in one way or another. You know who you are.

Contributing

Any kind of contribution and feedback are very much welcome! Just create an issue or submit a patch if you think we should include a new feature, or to report or fix a bug.

The issue tracker URL is: https://github.com/grafana-toolbox/grafana-client/issues

Development

In order to set up a development environment for grafana-client, please follow the development documentation.

License

grafana-client is licensed under the terms of the MIT License, see LICENSE file.

Supported by

JetBrains logo.

Special thanks to the people at JetBrains s.r.o. for supporting us with excellent development tooling.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

grafana_client-5.0.2.tar.gz (108.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

grafana_client-5.0.2-py3-none-any.whl (104.7 kB view details)

Uploaded Python 3

File details

Details for the file grafana_client-5.0.2.tar.gz.

File metadata

  • Download URL: grafana_client-5.0.2.tar.gz
  • Upload date:
  • Size: 108.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for grafana_client-5.0.2.tar.gz
Algorithm Hash digest
SHA256 f01df6ea0245ad8b2836a1dcfb09b7226c15626919677a8555783e42f8217b82
MD5 fef47944faea23538b438667447f7ecd
BLAKE2b-256 0549ed6b31cad627cd56cf21706487f77a724dccb834921f65c8e5d79a655c1a

See more details on using hashes here.

File details

Details for the file grafana_client-5.0.2-py3-none-any.whl.

File metadata

  • Download URL: grafana_client-5.0.2-py3-none-any.whl
  • Upload date:
  • Size: 104.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for grafana_client-5.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e8e92edb20961800a6c5d5d8905644e0826358b12f8d9e222e9f8d384bbcec51
MD5 5c0992d8948bf022d83f92ed52a5725c
BLAKE2b-256 45ca028f0ad5ee12bb153312d410ee836c560caeb5c18d83c9fad2ef49351c2f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page