Skip to content

Grafana

Grafana is an open-source platform for monitoring, visualization, and analytics. It allows you to query, visualize, alert on, and explore metrics, logs, and traces from various data sources through customizable dashboards.

Add the following dependency to your project file:

NuGet
1
dotnet add package Testcontainers.Grafana

You can start a Grafana container instance from any .NET application. Here, we create different container instances and pass them to the base test class. This allows us to test different configurations.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[UsedImplicitly]
public sealed class GrafanaDefaultConfiguration : GrafanaContainerTest
{
    public GrafanaDefaultConfiguration()
        : base(new GrafanaBuilder().Build(), GrafanaBuilder.DefaultUsername, GrafanaBuilder.DefaultPassword)
    {
    }
}

[UsedImplicitly]
public sealed class CustomCredentialsConfiguration : GrafanaContainerTest
{
    private static readonly string Username = Guid.NewGuid().ToString("D");

    private static readonly string Password = Guid.NewGuid().ToString("D");

    public CustomCredentialsConfiguration()
        : base(new GrafanaBuilder().WithUsername(Username).WithPassword(Password).Build(), Username, Password)
    {
    }
}

[UsedImplicitly]
public sealed class NoAuthCredentialsConfiguration : GrafanaContainerTest
{
    public NoAuthCredentialsConfiguration()
        : base(new GrafanaBuilder().WithAnonymousAccessEnabled().Build(), string.Empty, string.Empty)
    {
    }
}

This example uses xUnit.net's IAsyncLifetime interface to manage the lifecycle of the container. The container is started in the InitializeAsync method before the test method runs, ensuring that the environment is ready for testing. After the test completes, the container is removed in the DisposeAsync method.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public async ValueTask InitializeAsync()
{
    await _grafanaContainer.StartAsync()
        .ConfigureAwait(false);
}

public async ValueTask DisposeAsync()
{
    await DisposeAsyncCore()
        .ConfigureAwait(false);

    GC.SuppressFinalize(this);
}

[Fact]
[Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))]
public async Task GetCurrentOrganizationReturnsHttpStatusCodeOk()
{
    // Given
    var basicAuth = Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Join(":", _username, _password)));

    using var httpClient = new HttpClient();
    httpClient.BaseAddress = new Uri(_grafanaContainer.GetBaseAddress());
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", basicAuth);

    // When
    using var httpResponse = await httpClient.GetAsync("api/org", TestContext.Current.CancellationToken)
        .ConfigureAwait(true);

    // Then
    Assert.Equal(HttpStatusCode.OK, httpResponse.StatusCode);
}

The test example queries the Grafana API endpoint GET /api/org/ to retrieve the current organization. This API endpoint requires authentication, so the HTTP client's authorization header is set with Basic authentication using the username and password configured through the Grafana builder. The default configuration uses the username admin and password admin.

The test example uses the following NuGet dependencies:

1
2
3
4
<PackageReference Include="Microsoft.NET.Test.Sdk"/>
<PackageReference Include="coverlet.collector"/>
<PackageReference Include="xunit.runner.visualstudio"/>
<PackageReference Include="xunit.v3"/>

To execute the tests, use the command dotnet test from a terminal.

Tip

For the complete source code of this example and additional information, please refer to our test projects.

Enable anonymous access

Developers can enable anonymous access using the Grafana builder API WithAnonymousAccessEnabled(). This will enable anonymous access and no authentication is necessary to access Grafana:

1
GrafanaContainer _grafanaContainer = new GrafanaBuilder().WithAnonymousAccessEnabled().Build();