EQTY LabDocs

Signing backend health and telemetry

Checks OpenBao seal state, self capabilities, platform metadata and its committed association without signing. Independent of liveness and database readiness. Other providers report not_supported. Telemetry covers process-lifetime Transit sign attempts, excluding metadata resolution; latency_buckets are cumulative upper bounds.

gethttps://localhost:8080/health/signing
bash
curl --request GET \
  --url 'https://localhost:8080/health/signing' \
  --header 'Authorization: Bearer <token>'
javascript
const response = await fetch("https://localhost:8080/health/signing", {
  method: "GET",
  headers: {
    "Authorization": "Bearer <token>"
  }
});

const data = await response.json();
typescript
interface SigningHealthResponse {
  status?: Record<string, unknown>;
  telemetry?: Record<string, unknown>;
  timestamp?: string;
}

const response = await fetch("https://localhost:8080/health/signing", {
  method: "GET",
  headers: {
    "Authorization": "Bearer <token>"
  }
});
if (!response.ok) throw new Error(`${response.status} ${response.statusText}`);

const data: SigningHealthResponse = await response.json();
python
import requests

response = requests.get(
    "https://localhost:8080/health/signing",
    headers={
        "Authorization": "Bearer <token>",
    },
)
response.raise_for_status()
print(response.json())
go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://localhost:8080/health/signing", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Authorization", "Bearer <token>")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	data, err := io.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(res.Status, string(data))
}
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://localhost:8080/health/signing"))
            .header("Authorization", "Bearer <token>")
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.statusCode() + " " + response.body());
    }
}
csharp
using System.Net.Http.Headers;

using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Get, "https://localhost:8080/health/signing");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "<token>");

using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
php
<?php

$ch = curl_init('https://localhost:8080/health/signing');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer <token>',
    ],
    CURLOPT_RETURNTRANSFER => true,
]);

$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
echo $status . " " . $response . PHP_EOL;
ruby
require "net/http"

uri = URI("https://localhost:8080/health/signing")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer <token>"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
  http.request(request)
end
puts "#{response.code} #{response.body}"
rust
// Cargo.toml dependencies: reqwest, tokio (features "full")

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let response = reqwest::Client::new()
        .get("https://localhost:8080/health/signing")
        .header("Authorization", "Bearer <token>")
        .send()
        .await?;

    println!("{} {}", response.status(), response.text().await?);
    Ok(())
}

Parameters

Header parameters

NameTypeDescription
Authorization
required
string

Bearer {api_secret}

Responses

200OK

application/json
  • statusobject
    Show properties

    object

  • telemetryservices.SigningTelemetry
    Show services.SigningTelemetry
    • duration_secondsnumber

      DurationSeconds is the total time spent in signing attempts.

    • failuresinteger

      Failures counts every attempt whose outcome is not success.

    • latency_bucketsservices.SigningLatencyBucket[]

      LatencyBuckets are cumulative: each entry counts attempts that completed within upper_seconds, so counts never decrease along the list and there is no +Inf entry (use requests for the total).

      Show properties

      Array of services.SigningLatencyBucket

      • countinteger

        Count is the number of attempts that completed within UpperSeconds.

      • upper_secondsnumber

        UpperSeconds is the inclusive upper bound of this bucket.

    • outcomesobject

      Outcomes counts attempts by outcome; the key set is fixed and always complete.

      Show properties

      Map of integer<int64>

    • requestsinteger

      Requests counts every signing attempt, including those slower than the largest latency bucket.

  • timestampstring
Examplejson
{
  "status": "ready",
  "telemetry": {
    "duration_seconds": 0,
    "failures": 0,
    "latency_buckets": [
      {
        "count": 0,
        "upper_seconds": 0
      }
    ],
    "outcomes": {
      "key": 0
    },
    "requests": 0
  },
  "timestamp": "string"
}

401Unauthorized

application/json
  • errorstring
  • error_descriptionstring
Examplejson
{
  "error": "Unauthorized",
  "error_description": "Invalid token"
}

503Service Unavailable

application/json
  • statusobject
    Show properties

    object

  • telemetryservices.SigningTelemetry
    Show services.SigningTelemetry
    • duration_secondsnumber

      DurationSeconds is the total time spent in signing attempts.

    • failuresinteger

      Failures counts every attempt whose outcome is not success.

    • latency_bucketsservices.SigningLatencyBucket[]

      LatencyBuckets are cumulative: each entry counts attempts that completed within upper_seconds, so counts never decrease along the list and there is no +Inf entry (use requests for the total).

      Show properties

      Array of services.SigningLatencyBucket

      • countinteger

        Count is the number of attempts that completed within UpperSeconds.

      • upper_secondsnumber

        UpperSeconds is the inclusive upper bound of this bucket.

    • outcomesobject

      Outcomes counts attempts by outcome; the key set is fixed and always complete.

      Show properties

      Map of integer<int64>

    • requestsinteger

      Requests counts every signing attempt, including those slower than the largest latency bucket.

  • timestampstring
Examplejson
{
  "status": "ready",
  "telemetry": {
    "duration_seconds": 0,
    "failures": 0,
    "latency_buckets": [
      {
        "count": 0,
        "upper_seconds": 0
      }
    ],
    "outcomes": {
      "key": 0
    },
    "requests": 0
  },
  "timestamp": "string"
}