MetriBeacon
Menü
Deutsch

GET Dem Geräteschlüssel zugeordnetes Profil lesen

/api/v1/agent/server-profile

Der gerätegebundene Schlüssel liest ausschließlich das Profil seines aktiven Servermonitors und zugewiesene Reihen. Freigaben und Kontogrenzen gelten weiterhin.

Auf dieser Seite

Zugriff und Rechte

Der gerätegebundene Schlüssel liest ausschließlich das Profil seines aktiven Servermonitors und zugewiesene Reihen. Freigaben und Kontogrenzen gelten weiterhin.

API-Schreibschlüssel in Authorization: Bearer. Er erlaubt Datenübertragungen für die ausgewählten Geräte oder alle Geräte seines Arbeitsbereichs.

Parameter und Header

FeldPositionTyp und GrenzenErforderlichBedeutung
X-MetriBeacon-Device-IDHeaderstring; {"format":"uuid"}NeinUUID des Zielgeräts. Für gemeinsam genutzte Schlüssel erforderlich, bei einem ausgewählten Gerät implizit. Zielangaben in Header und Inhalt müssen übereinstimmen.

Anfragekörper

Kein Anfragekörper.

Antworten

HeaderTyp und GrenzenBedeutung
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API-Antworten verbieten Speicherung. Öffentliche OAuth-Metadaten werden 300 Sekunden gecacht; Livestreams verbieten zusätzlich Transformation.
Content-Languagestring; {"enum":["en","de"]}Sprache lesbarer Antworttexte aus Accept-Language oder der dokumentierten Browserpräferenz. Technische Codes und Kennungen bleiben stabil.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}Standard-Referrerpolicy ist strict-origin-when-cross-origin. Anbieterloginantworten verwenden no-referrer zum Schutz der Loginparameter.
VarystringAntworten variieren nach Accept-Language; browsergerenderte Antworten können zusätzlich nach Präferenzcookie variieren.
X-Content-Type-OptionsJSON; {"const":"nosniff"}Der Browser muss den angegebenen Inhaltstyp verwenden.
X-Frame-OptionsJSON; {"const":"DENY"}Die Antwort darf nicht in einem Frame eingebettet werden.
X-Request-IDstringVom Server erzeugte Anfragekennung. Bei Fehlermeldungen mitgeben; eingehende Werte werden nicht als vertrauenswürdig übernommen.

application/json

FeldTyp und GrenzenErforderlichBedeutung
$objectJa—
$.agentobjectNein—
$.agent.architecturestring | nullNein—
$.agent.capabilitiesarray<string>Nein—
$.agent.capabilities[]stringJa—
$.agent.platformstring | nullNein—
$.agent.versionstring | nullNein—
$.agent.system_infoSystemInformationNein—
$.agent.system_info.versionJSON; {"const":1}Ja—
$.agent.system_info.operating_systemstring; {"maxLength":256}Nein—
$.agent.system_info.kernel_versionstring; {"maxLength":256}Nein—
$.agent.system_info.cpu_modelstring; {"maxLength":256}Nein—
$.agent.system_info.logical_cpu_coresinteger; {"minimum":0,"maximum":65536}Nein—
$.agent.system_info.memory_total_bytesinteger; {"minimum":0,"maximum":1152921504606846976}Nein—
$.agent.system_info.booted_atstring; {"format":"date-time"}Nein—
$.agent.system_info_reported_atstring | null; {"format":"date-time"}Nein—
$.agent_statusstringNein—
$.applied_revisionintegerNein—
$.bindingsarray<object>Nein—
$.bindings[]objectJa—
$.bindings[].component_idstringJaStabile Kennung der gewählten oder erkannten Komponente.
$.bindings[].interval_secondsintegerJaAbtast- oder Prüfintervall in Sekunden innerhalb der angegebenen Grenzen.
$.bindings[].parameter_keystringJaStabile Parameterkennung aus dem Serverkatalog.
$.bindings[].series_idstringJaUUID der Messreihe des freigegebenen Geräts.
$.collector_statusarray<CollectorStatus>NeinVom Agent gemeldete Verfügbarkeit und Diagnose je Erfassungskomponente.
$.collector_status[]CollectorStatusJa—
$.collector_status[].component_idstringJa—
$.collector_status[].counter_epochstringNein—
$.collector_status[].parameter_keystringJa—
$.collector_status[].sourcestringNein—
$.collector_status[].statusstring; {"enum":["ready","warming_up","permission_denied","unsupported","failed"]}Ja—
$.inventoryarray<ServerComponent>NeinBegrenzte erkannte Serverkomponenten; führt keine beliebigen Serverbefehle aus.
$.inventory[]ServerComponentJa—
$.inventory[].addressstringNein—
$.inventory[].familystringNein—
$.inventory[].idstringJaUUID dieser Ressource. Bewahren Sie die zurückgegebene Kennung für weitere Operationen auf.
$.inventory[].kindstringJaRessourcenart oder Messwerttyp aus den angegebenen Werten.
$.inventory[].labelstringJaAnzeigename der Komponente.
$.inventory[].local_refstringNein—
$.inventory[].namestringNeinLesbarer Ressourcenname. Beachten Sie die angegebene Längengrenze.
$.inventory[].pathstringNein—
$.inventory[].portintegerNein—
$.inventory[].projectstringNein—
$.inventory[].protocolstringNein—
$.inventory[].text_languagesobjectNein—
$.inventory[].timeout_secondsintegerNein—
$.inventory[].translationsobject; {"additionalProperties":false}Nein—
$.inventory[].translations.deobjectNein—
$.inventory[].translations.enobjectNein—
$.inventory[].transportstringNein—
$.inventory[].filesystem_identitystring; {"maxLength":256}NeinVom Agenten gemeldete Volumeidentität. Unverändert beibehalten, damit ein Ersatzvolume nicht die Historie eines anderen Volumes fortsetzt.
$.inventory[].disk_identitystring; {"maxLength":256}Nein—
$.inventory_atstring; {"format":"date-time"} | nullNein—
$.inventory_at (anyOf 1)string; {"format":"date-time"}Nein—
$.inventory_at (anyOf 2)nullNein—
$.jobobject | nullNein—
$.job (anyOf 1)objectNein—
$.job (anyOf 1).error_codestring | nullJa—
$.job (anyOf 1).error_code (anyOf 1)stringNein—
$.job (anyOf 1).error_code (anyOf 2)nullNein—
$.job (anyOf 1).idstringJaUUID dieser Ressource. Bewahren Sie die zurückgegebene Kennung für weitere Operationen auf.
$.job (anyOf 1).statusstringJa—
$.job (anyOf 2)nullNein—
$.profileServerProfileNein—
$.profile.componentsarray<object>; {"maxItems":200} | nullJaErkannte oder ausdrücklich ausgewählte Serverkomponenten.
$.profile.components (anyOf 1)array<object>; {"maxItems":200}Nein—
$.profile.components (anyOf 1)[]objectJa—
$.profile.components (anyOf 1)[].addressstringNein—
$.profile.components (anyOf 1)[].familystringNein—
$.profile.components (anyOf 1)[].idstringJaUUID dieser Ressource. Bewahren Sie die zurückgegebene Kennung für weitere Operationen auf.
$.profile.components (anyOf 1)[].kindstringJaRessourcenart oder Messwerttyp aus den angegebenen Werten.
$.profile.components (anyOf 1)[].labelstring; {"maxLength":128,"minLength":1}JaAnzeigename der Komponente.
$.profile.components (anyOf 1)[].local_refstringNein—
$.profile.components (anyOf 1)[].namestringNeinLesbarer Ressourcenname. Beachten Sie die angegebene Längengrenze.
$.profile.components (anyOf 1)[].pathstring; {"maxLength":1024}Nein—
$.profile.components (anyOf 1)[].portintegerNein—
$.profile.components (anyOf 1)[].projectstringNein—
$.profile.components (anyOf 1)[].protocolstringNein—
$.profile.components (anyOf 1)[].text_languagesobjectNein—
$.profile.components (anyOf 1)[].timeout_secondsintegerNein—
$.profile.components (anyOf 1)[].translationsobject; {"additionalProperties":false}Nein—
$.profile.components (anyOf 1)[].translations.deobjectNein—
$.profile.components (anyOf 1)[].translations.enobjectNein—
$.profile.components (anyOf 1)[].transportstringNein—
$.profile.components (anyOf 1)[].filesystem_identitystring; {"maxLength":256}NeinVom Agenten gemeldete Volumeidentität. Unverändert beibehalten, damit ein Ersatzvolume nicht die Historie eines anderen Volumes fortsetzt.
$.profile.components (anyOf 1)[].disk_identitystring; {"maxLength":256}Nein—
$.profile.components (anyOf 2)nullNein—
$.profile.selectionsarray<object>; {"maxItems":200} | nullJaGewählte Komponenten-/Parameterpaare mit Abtastintervallen.
$.profile.selections (anyOf 1)array<object>; {"maxItems":200}Nein—
$.profile.selections (anyOf 1)[]objectJa—
$.profile.selections (anyOf 1)[].component_idstringJaStabile Kennung der gewählten oder erkannten Komponente.
$.profile.selections (anyOf 1)[].interval_secondsinteger; {"maximum":86400,"minimum":0}JaAbtast- oder Prüfintervall in Sekunden innerhalb der angegebenen Grenzen.
$.profile.selections (anyOf 1)[].parameter_keystringJaStabile Parameterkennung aus dem Serverkatalog.
$.profile.selections (anyOf 2)nullNein—
$.profile.versionJSON; {"const":2}Ja—
$.profile.overviewobject; {"additionalProperties":false}NeinAusdrückliche Ziele für die Serverübersicht mit sechs Diagrammen; wählen Sie alle benötigten Messwerte aus.
$.profile.overview.system_idstring; {"maxLength":128}Ja—
$.profile.overview.filesystem_idstring; {"maxLength":128}Ja—
$.profile.overview.disk_idstring; {"maxLength":128}Ja—
$.profile.overview.network_idstring; {"maxLength":128}Ja—
$.profile.overview.platformstring; {"enum":["linux","darwin","windows"]}NeinPlattform der automatischen Übersicht. Nur unterstützte Messgrößen werden gewählt; nicht erkannte Datenträger- oder Netzwerkziele bleiben leer.
$.profile.filesystem_discoveryobject; {"additionalProperties":false}NeinOptionale Erkennung lokaler Dateisysteme mit einem Grundintervall von mindestens 10 Sekunden. Neue Server/NAS-Einrichtungen aktivieren sie. Bestehende Profile benötigen eine ausdrückliche Aktivierung. Manuell deaktivierte Messreihen bleiben erhalten.
$.profile.filesystem_discovery.modestring; {"enum":["off","local"]}Ja—
$.profile.filesystem_discovery.interval_secondsinteger; {"minimum":10,"maximum":86400}Ja—
$.profile.system_discoveryobject; {"additionalProperties":false}Nein—
$.profile.system_discovery.modestring; {"enum":["off","local"]}Ja—
$.profile.system_discovery.interval_secondsinteger; {"minimum":10,"maximum":86400}Ja—
$.profile.disk_io_interval_secondsinteger; {"minimum":1,"maximum":86400}Nein—
$.profile.global_interval_secondsinteger; {"minimum":1,"maximum":86400}NeinAusdrückliche globale Intervallauswahl. Jede Quelle behält ihr Plattformminimum; einzelne schnelle Reihen gelten nicht als globale Auswahl.
$.reported_atstring; {"format":"date-time"} | nullNein—
$.reported_at (anyOf 1)string; {"format":"date-time"}Nein—
$.reported_at (anyOf 2)nullNein—
$.revisionintegerNeinRessourcenrevision für optimistische Nebenläufigkeit. Lesen Sie die aktuelle Revision vor einer Konfigurationsänderung.
$.filesystem_discovery_statearray<object>; {"maxItems":200}Nein—
$.filesystem_discovery_state[]objectJa—
$.filesystem_discovery_state[].component_idstringNein—
$.filesystem_discovery_state[].pathstringNein—
$.filesystem_discovery_state[].identitystring; {"maxLength":256}NeinVom Agenten gemeldete Volumeidentität. Unverändert beibehalten, damit ein Ersatzvolume nicht die Historie eines anderen Volumes fortsetzt.
$.filesystem_discovery_state[].typestringNein—
$.filesystem_discovery_state[].statusstring; {"enum":["ready","missing","manual","identity_changed","waiting_quota","unsupported","permission_denied","failed"]}Nein—
$.update_jobstringNein—
$.system_discovery_statearray<object>; {"maxItems":600}Nein—
$.system_discovery_state[]objectJa—
$.system_discovery_state[].component_idstringJa—
$.system_discovery_state[].kindstring; {"enum":["disk","swap","processes","disk_total","cpu_diagnostics_v1","disk_operations_v1","disk_latency_v1","network_errors_v1","swap_traffic_v1","psi_v1","filesystem_capacity_v1","filesystem_inodes_v1","filesystem_health_v1","oom_v1","storage_health_v1"]}Ja—
$.system_discovery_state[].statusstring; {"enum":["ready","missing","inactive","manual","identity_changed","waiting_quota","unknown","unsupported","permission_denied","failed"]}Ja—
$.disk_ioLogicalDiskIOInventory | nullNein—
$.disk_io (anyOf 1)LogicalDiskIOInventoryNein—
$.disk_io (anyOf 1).completebooleanJa—
$.disk_io (anyOf 1).disk_count_knownbooleanJa—
$.disk_io (anyOf 1).disk_countinteger; {"minimum":0,"maximum":200}Ja—
$.disk_io (anyOf 1).source_countinteger; {"minimum":0,"maximum":1024}Ja—
$.disk_io (anyOf 1).source_setstring; {"maxLength":64}Ja—
$.disk_io (anyOf 2)nullNein—
$.delivery_diagnosticsbooleanNein—
$.resource_inventorybooleanNein—
json
{}
Stabile Fehlercodes
device_scope
HeaderTyp und GrenzenBedeutung
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API-Antworten verbieten Speicherung. Öffentliche OAuth-Metadaten werden 300 Sekunden gecacht; Livestreams verbieten zusätzlich Transformation.
Content-Languagestring; {"enum":["en","de"]}Sprache lesbarer Antworttexte aus Accept-Language oder der dokumentierten Browserpräferenz. Technische Codes und Kennungen bleiben stabil.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}Standard-Referrerpolicy ist strict-origin-when-cross-origin. Anbieterloginantworten verwenden no-referrer zum Schutz der Loginparameter.
VarystringAntworten variieren nach Accept-Language; browsergerenderte Antworten können zusätzlich nach Präferenzcookie variieren.
X-Content-Type-OptionsJSON; {"const":"nosniff"}Der Browser muss den angegebenen Inhaltstyp verwenden.
X-Frame-OptionsJSON; {"const":"DENY"}Die Antwort darf nicht in einem Frame eingebettet werden.
X-Request-IDstringVom Server erzeugte Anfragekennung. Bei Fehlermeldungen mitgeben; eingehende Werte werden nicht als vertrauenswürdig übernommen.

application/problem+json

FeldTyp und GrenzenErforderlichBedeutung
$ProblemJa—
$.codestringJaStabiler maschinenlesbarer Fehlercode
$.detailstringJaKurze lokalisierte Erklärung ohne interne Fehlerdaten
$.instancestringJaEinmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource
$.messagestringJaVorübergehend für bestehende Clients gleich detail
$.message_keystringJaStabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage
$.message_paramsobject; {"additionalProperties":true}JaBenannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML
$.request_idstring; {"pattern":"^[0-9a-f]{32}$"}JaVom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten.
$.statusinteger; {"maximum":599,"minimum":400}Ja—
$.titlestringJaLokalisierte HTTP-Statusbezeichnung
$.typestring; {"const":"about:blank"}Ja—
json
{
  "code": "demo",
  "detail": "Demo error detail; inspect the documented code.",
  "instance": "demo",
  "message": "Demo error detail; inspect the documented code.",
  "message_key": "errors.requestFailed",
  "message_params": {},
  "request_id": "00000000000000000000000000000000",
  "status": 422,
  "title": "Demo error",
  "type": "about:blank"
}
Stabile Fehlercodes
device_required
device_scope
invalid_device
HeaderTyp und GrenzenBedeutung
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API-Antworten verbieten Speicherung. Öffentliche OAuth-Metadaten werden 300 Sekunden gecacht; Livestreams verbieten zusätzlich Transformation.
Content-Languagestring; {"enum":["en","de"]}Sprache lesbarer Antworttexte aus Accept-Language oder der dokumentierten Browserpräferenz. Technische Codes und Kennungen bleiben stabil.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}Standard-Referrerpolicy ist strict-origin-when-cross-origin. Anbieterloginantworten verwenden no-referrer zum Schutz der Loginparameter.
VarystringAntworten variieren nach Accept-Language; browsergerenderte Antworten können zusätzlich nach Präferenzcookie variieren.
X-Content-Type-OptionsJSON; {"const":"nosniff"}Der Browser muss den angegebenen Inhaltstyp verwenden.
X-Frame-OptionsJSON; {"const":"DENY"}Die Antwort darf nicht in einem Frame eingebettet werden.
X-Request-IDstringVom Server erzeugte Anfragekennung. Bei Fehlermeldungen mitgeben; eingehende Werte werden nicht als vertrauenswürdig übernommen.

application/problem+json

FeldTyp und GrenzenErforderlichBedeutung
$ProblemJa—
$.codestringJaStabiler maschinenlesbarer Fehlercode
$.detailstringJaKurze lokalisierte Erklärung ohne interne Fehlerdaten
$.instancestringJaEinmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource
$.messagestringJaVorübergehend für bestehende Clients gleich detail
$.message_keystringJaStabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage
$.message_paramsobject; {"additionalProperties":true}JaBenannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML
$.request_idstring; {"pattern":"^[0-9a-f]{32}$"}JaVom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten.
$.statusinteger; {"maximum":599,"minimum":400}Ja—
$.titlestringJaLokalisierte HTTP-Statusbezeichnung
$.typestring; {"const":"about:blank"}Ja—
json
{
  "code": "demo",
  "detail": "Demo error detail; inspect the documented code.",
  "instance": "demo",
  "message": "Demo error detail; inspect the documented code.",
  "message_key": "errors.requestFailed",
  "message_params": {},
  "request_id": "00000000000000000000000000000000",
  "status": 422,
  "title": "Demo error",
  "type": "about:blank"
}
Stabile Fehlercodes
unavailable
HeaderTyp und GrenzenBedeutung
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API-Antworten verbieten Speicherung. Öffentliche OAuth-Metadaten werden 300 Sekunden gecacht; Livestreams verbieten zusätzlich Transformation.
Content-Languagestring; {"enum":["en","de"]}Sprache lesbarer Antworttexte aus Accept-Language oder der dokumentierten Browserpräferenz. Technische Codes und Kennungen bleiben stabil.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}Standard-Referrerpolicy ist strict-origin-when-cross-origin. Anbieterloginantworten verwenden no-referrer zum Schutz der Loginparameter.
Retry-Afterstring; {"pattern":"^[0-9]+$"}Sekunden bis zur Wiederholung. Bewahren Sie unterstützte Idempotenzkennungen und beachten Sie die Änderungsregeln der Operation.
VarystringAntworten variieren nach Accept-Language; browsergerenderte Antworten können zusätzlich nach Präferenzcookie variieren.
X-Content-Type-OptionsJSON; {"const":"nosniff"}Der Browser muss den angegebenen Inhaltstyp verwenden.
X-Frame-OptionsJSON; {"const":"DENY"}Die Antwort darf nicht in einem Frame eingebettet werden.
X-Request-IDstringVom Server erzeugte Anfragekennung. Bei Fehlermeldungen mitgeben; eingehende Werte werden nicht als vertrauenswürdig übernommen.

application/problem+json

FeldTyp und GrenzenErforderlichBedeutung
$ProblemJa—
$.codestringJaStabiler maschinenlesbarer Fehlercode
$.detailstringJaKurze lokalisierte Erklärung ohne interne Fehlerdaten
$.instancestringJaEinmalige relative Kennung /api/v1/requests/{request_id}; keine abrufbare Ressource
$.messagestringJaVorübergehend für bestehende Clients gleich detail
$.message_keystringJaStabiler Übersetzungsschlüssel für einen Sprachwechsel der Anzeige ohne neue Anfrage
$.message_paramsobject; {"additionalProperties":true}JaBenannte, sicher ausgegebene Meldungsparameter; kein beliebiges HTML
$.request_idstring; {"pattern":"^[0-9a-f]{32}$"}JaVom Server erzeugte Diagnosekennung. Enthält kein Logintoken und keine Zugangsdaten.
$.statusinteger; {"maximum":599,"minimum":400}Ja—
$.titlestringJaLokalisierte HTTP-Statusbezeichnung
$.typestring; {"const":"about:blank"}Ja—
json
{
  "code": "demo",
  "detail": "Demo error detail; inspect the documented code.",
  "instance": "demo",
  "message": "Demo error detail; inspect the documented code.",
  "message_key": "errors.requestFailed",
  "message_params": {},
  "request_id": "00000000000000000000000000000000",
  "status": 503,
  "title": "Demo error",
  "type": "about:blank"
}

Wiederholungen und asynchrone Aufträge

Diese Operation liest oder prüft, ohne eine Ressourcenänderung anzuwenden. Beachten Sie Ratenlimits und Zugangslaufzeiten.

Anfragebeispiele

Ersetzen Sie Demokennungen, Zeitstempel und Platzhalter durch eigene Werte. Behalten Sie bei Wiederholungen Kennungen, Zeit und Inhalt bei. Diese Beispiele führen auf der Seite keine Anfragen aus.

Halten Sie Anmeldelinks, Codes, Cookies und Schlüssel privat. Schreiben Sie sie nicht in Logs und teilen Sie sie nicht in Hilfeanfragen.

shell
curl --silent --show-error --output /dev/null --write-out "%{http_code}\n" \
  --request GET \
  --header @"$HOME/.config/metribeacon/headers.txt" \
  "https://metribeacon.com/api/v1/agent/server-profile"
python
import json
from pathlib import Path
from urllib.request import Request, HTTPRedirectHandler, build_opener
from urllib.error import HTTPError

headers = json.loads((Path.home() / ".config/metribeacon/headers.json").read_text())
request = Request("https://metribeacon.com/api/v1/agent/server-profile", data=None, headers=headers, method="GET")
class NoRedirect(HTTPRedirectHandler):
    def redirect_request(self, request, fp, code, message, headers, target):
        return None

opener = build_opener(NoRedirect())
try:
    with opener.open(request, timeout=10) as response:
        print(response.status)
except HTTPError as error:
    print(error.code)
    error.close()
javascript
import { readFile } from "node:fs/promises";
import { homedir } from "node:os";
import { join } from "node:path";

const headers = JSON.parse(await readFile(join(homedir(), ".config/metribeacon/headers.json"), "utf8"));
const response = await fetch("https://metribeacon.com/api/v1/agent/server-profile", {
  method: "GET", headers, redirect: "manual",
  signal: AbortSignal.timeout(10000),
});
console.log(response.status);
await response.body?.cancel();
go
package main

import (
  "fmt"
  "net/http"
  "time"
  "encoding/json"
  "os"
  "path/filepath"
)

func main() {
  home, err := os.UserHomeDir(); if err != nil { panic("request failed; credentials and response omitted") }
  raw, err := os.ReadFile(filepath.Join(home, ".config/metribeacon/headers.json")); if err != nil { panic("request failed; credentials and response omitted") }
  var headers map[string]string
  if json.Unmarshal(raw, &headers) != nil { panic("invalid local headers") }
  request, err := http.NewRequest("GET", "https://metribeacon.com/api/v1/agent/server-profile", nil)
  if err != nil { panic("request failed; credentials and response omitted") }
  for name, value := range headers { request.Header.Set(name, value) }
  client := &http.Client{Timeout: 10*time.Second, CheckRedirect: func(*http.Request, []*http.Request) error { return http.ErrUseLastResponse }}
  response, err := client.Do(request)
  if err != nil { panic("request failed; credentials and response omitted") }
  defer response.Body.Close()
  fmt.Println(response.StatusCode)
}