Removing prometheus-net dependency (#1526)

* Update README.md

* Update KubernetesClient.csproj

* Delete examples/prometheus directory

* Delete src/KubernetesClient/PrometheusHandler.cs
This commit is contained in:
rkarg-blizz
2024-02-26 15:56:13 -08:00
committed by GitHub
parent c15d79d96d
commit 93140a6d8c
5 changed files with 5 additions and 100 deletions

View File

@@ -26,14 +26,11 @@ You should also be able to authenticate with the in-cluster service
account using the `InClusterConfig` function shown below.
## Monitoring
There is optional built-in metric generation for prometheus client metrics.
The exported metrics are:
Metrics are built in to HttpClient using System.Diagnostics.DiagnosticsSource.
https://learn.microsoft.com/en-us/dotnet/core/diagnostics/built-in-metrics-system-net
* `k8s_dotnet_request_total` - Counter of request, broken down by HTTP Method
* `k8s_dotnet_response_code_total` - Counter of responses, broken down by HTTP Method and response code
* `k8s_request_latency_seconds` - Latency histograms broken down by method, api group, api version and resource kind
There is an example integrating these monitors in the examples/prometheus directory.
There are many ways these metrics can be consumed/exposed but that decision is up to the application, not KubernetesClient itself.
https://learn.microsoft.com/en-us/dotnet/core/diagnostics/metrics-collection
## Sample Code

View File

@@ -1,29 +0,0 @@
using k8s;
using Prometheus;
using System;
using System.Threading;
namespace prom
{
internal class Prometheus
{
private static void Main(string[] args)
{
var config = KubernetesClientConfiguration.BuildDefaultConfig();
var handler = new PrometheusHandler();
IKubernetes client = new Kubernetes(config, handler);
var server = new MetricServer(hostname: "localhost", port: 1234);
server.Start();
Console.WriteLine("Making requests!");
while (true)
{
client.CoreV1.ListNamespacedPod("default");
client.CoreV1.ListNode();
client.AppsV1.ListNamespacedDeployment("default");
Thread.Sleep(1000);
}
}
}
}

View File

@@ -1,7 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
</PropertyGroup>
</Project>

View File

@@ -10,7 +10,6 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="prometheus-net" Version="8.2.1" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.1.2" />
<PackageReference Include="IdentityModel.OidcClient" Version="5.2.1" />
<PackageReference Include="Fractions" Version="7.3.0" />

View File

@@ -1,55 +0,0 @@
using Prometheus;
using System.Net.Http;
namespace k8s
{
public class PrometheusHandler : DelegatingHandler
{
private const string PREFIX = "k8s_dotnet";
private readonly Counter requests = Metrics.CreateCounter(
$"{PREFIX}_request_total", "Number of requests sent by this client",
new CounterConfiguration
{
LabelNames = new[] { "method" },
});
private readonly Histogram requestLatency = Metrics.CreateHistogram(
$"{PREFIX}_request_latency_seconds", "Latency of requests sent by this client",
new HistogramConfiguration
{
LabelNames = new[] { "verb", "group", "version", "kind" },
});
private readonly Counter responseCodes = Metrics.CreateCounter(
$"{PREFIX}_response_code_total", "Number of response codes received by the client",
new CounterConfiguration
{
LabelNames = new[] { "method", "code" },
});
private readonly Gauge activeRequests = Metrics.CreateGauge(
$"{PREFIX}_active_requests", "Number of requests currently in progress",
new GaugeConfiguration
{
LabelNames = new[] { "method" },
});
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request == null)
{
throw new ArgumentNullException(nameof(request));
}
var digest = KubernetesRequestDigest.Parse(request);
requests.WithLabels(digest.Verb).Inc();
using (activeRequests.WithLabels(digest.Verb).TrackInProgress())
using (requestLatency.WithLabels(digest.Verb, digest.ApiGroup, digest.ApiVersion, digest.Kind).NewTimer())
{
var resp = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
responseCodes.WithLabels(request.Method.ToString(), ((int)resp.StatusCode).ToString()).Inc();
return resp;
}
}
}
}