O TelemetryAgent é um agente de telemetria desktop em Java para Windows. Ele coleta informações do sistema operacional e do hardware local e envia esses dados para uma API remota em formato JSON.
O projeto usa:
- Java com Gradle
- OSHI para coleta de dados do sistema
- Jackson para serialização JSON
- Lombok para reduzir código repetitivo
- Inno Setup e um serviço Windows para instalação/distribuição
No fluxo atual do código, o agente faz o seguinte:
- Lê a configuração local em
config.json. - Inicializa o cliente HTTP com
agentIdeapiUrl. - Inicia os serviços de coleta:
- HeartbeatService: envia dados a cada 5 segundos.
- SyncService: envia dados a cada 1 hora.
- Serializa os DTOs em JSON e faz
POSTpara a API remota.
- Identificação do agente
- Uptime do sistema
- CPU
- Memória RAM
- Nome do host e domínio
- Discos físicos
- Interfaces de rede
- Serviços do sistema
- Aplicações instaladas
- Dispositivos USB
- Informações básicas do sistema operacional
build/libs/TelemetryAgent.jar- artefato gerado pelo build
Pelo script de instalação, os principais caminhos são:
O instalador usa por padrão:
%ProgramFiles%\mTadata Agent
Nessa pasta ficam os arquivos instalados da aplicação, como:
m-tadata-agent.exeTelemetryAgent.jarm-tadata-agent.xml
A configuração local é criada em:
C:\ProgramData\mTadata Agent\config.json
Essa pasta é usada pelo ConfigManager para ler e salvar a configuração do agente.
O instalador (mTadata.iss) também:
- cria o
config.jsonautomaticamente - registra a aplicação para iniciar como serviço
- executa ações de
installestartapós a instalação - executa
stopeuninstallna remoção
O arquivo config.json contém os dados básicos do agente:
{
"agentId": "home/PC-001",
"apiUrl": "https://mtadata.com.br/api",
"telemetryInterval": 0
}agentId: identificador do equipamento/agenteapiUrl: URL base do servidor de telemetria- o apiUrl deve apontar diretamente para o endereço de entrada da api, se a rota criada no seu webserver for
https://webserver.com/server/v1/telemetry/heartbeato endereço configurado deve serhttps://webserver.com/server
- o apiUrl deve apontar diretamente para o endereço de entrada da api, se a rota criada no seu webserver for
telemetryInterval: intervalo genérico de telemetria usado pela configuração
O agente não expõe uma API própria; ele consome endpoints remotos e envia dados via POST com Content-Type: application/json.
A URL final é montada assim:
{apiUrl}/{path}
Exemplo:
https://mtadata.com.br/api/v1/telemetry/heartbeat
| Enum | Método | Path | Uso atual |
|---|---|---|---|
HEARTBEAT |
POST |
/v1/telemetry/heartbeat |
usada pelo HeartbeatService |
BATCH |
POST |
/v1/telemetry/batch |
reservada no enum |
EVENTS |
POST |
/v1/telemetry/events |
reservada no enum |
SYNC |
POST |
/v1/telemetry/sync |
usada pelo SyncService |
Endpoint:
POST /v1/telemetry/heartbeat
DTO:
HeartbeatData
Campos do payload:
agentIdsystemUptimecpuUsagecpuTemperaturecpuVoltageramTotalramUsed
Exemplo:
{
"agentId": "home/PC-001",
"systemUptime": 123456,
"cpuUsage": 18.75,
"cpuTemperature": 52.4,
"cpuVoltage": 0.0,
"ramTotal": 17179869184,
"ramUsed": 8589934592
}Endpoint:
POST /v1/telemetry/sync
DTO:
SyncData
Campos do payload:
agentIdoperatingSystemsystemUptimehostnamedomainNamecpuNamephysicalMemoryListphysicalDisksnetworkIFListserviceListapplicationInfoListusbDevices
Exemplo de estrutura:
{
"agentId": "home/PC-001",
"operatingSystem": "Microsoft Windows 11 Pro",
"systemUptime": 123456,
"hostname": "Liam-PC",
"domainName": "WORKGROUP",
"cpuName": "Intel(R) Core(TM) i7...",
"physicalMemoryList": [
{
"bankLabel": "BANK 0",
"capacity": 8589934592,
"clockSpeed": 3200000000,
"manufacturer": "Unknown",
"memoryType": "DDR4",
"partNumber": "ALCAMARA",
"serialNumber": "00000000"
}
],
"physicalDisks": [
{
"name": "C:",
"model": "SSD...",
"serial": "NB1111111111",
"size": 512105932800,
"reads": 1022768,
"readBytes": 35071070208,
"writes": 1124605,
"writeBytes": 19580055040,
"currentQueueLength": 0,
"transferTime": 3655523,
"timeStamp": 1788920766669,
"partitions": [
{
"identification": "Disco #1, Partição #1",
"name": "GPT: Basic Data",
"type": "GPT: dados Básicos",
"uuid": "684b2fb7-e3bb-4852-919c-e3d45ec4add2",
"label": "1 - SSD SATA III (500GB)",
"size": 511139905536,
"major": 1,
"minor": 1,
"mountPoint": "C:\\"
}
]
}
],
"networkIFList": [
{
"name": "Ethernet",
"displayName": "Intel(R) Ethernet...",
"index": 15,
"mtu": 1492,
"subnetMasks": [
24
],
"prefixLengths": [
64,
128,
128
],
"ifType": 6,
"ndisPhysicalMediumType": 14,
"connectorPresent": true,
"bytesRecv": 2948782648,
"bytesSent": 227014986,
"packetsRecv": 3423320,
"packetsSent": 1322824,
"inErrors": 0,
"outErrors": 0,
"inDrops": 0,
"collisions": 0,
"speed": 100000000,
"timeStamp": 1789267080028,
"ifAlias": "Ethernet 1",
"ifOperStatus": "UP",
"ipv4addr": [
"192.168.0.2"
],
"macaddr": "...",
"ipv6addr": [
"...",
"...6"
],
"knownVmMacAddr": false
}
],
"serviceList": [
{
"name": "Spooler",
"processID": 0,
"state": "RUNNING"
}
],
"applicationInfoList": [
{
"name": "Google Chrome",
"version": "152.0.7977.83",
"vendor": "Google LLC",
"timestamp": 1788836400000,
"additionalInfo": {
"installLocation": "C:\\Program Files\\Google\\Chrome\\Application",
"installSource": null
}
}
],
"usbDevices": [
{
"name": "Intel(R) USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)",
"vendor": "Generic USB xHCI Host Controller",
"vendorId": "0x8086",
"productId": "0xa12f",
"serialNumber": null,
"uniqueDeviceId": "PCI\\VEN_8086&DEV_A12F&SUBSYS_86941043&REV_31\\3&11583659&0&A0",
"connectedDevices": []
}
],
"timestamp": 1789267080032
}Observação: os itens das listas acima são serializados diretamente a partir dos objetos do OSHI. Por isso, o JSON real pode conter mais campos e variar conforme o sistema, a versão da biblioteca e o hardware do computador.
Endpoint:
POST /v1/telemetry/batch
Status atual:
- endpoint definido no enum
- Não implementado DTO.
JSON esperado conceitualmente:
{
"agentId": "PC-001",
"items": []
}Endpoint:
POST /v1/telemetry/events
Status atual:
- endpoint definido no enum
- Não implementado DTO
JSON esperado conceitualmente:
{
"agentId": "PC-001",
"events": []
}- O agente envia dados de forma assíncrona.
- O
HeartbeatServiceagenda envio a cada 5 segundos. - O
SyncServiceagenda envio a cada 1 hora. - O
HttpClientImplfazPOSTcom timeout de 5 segundos para conexão e leitura.
O build.gradle.kts define:
- aplicação Java
- plugin
shadowpara empacotamento - dependências de OSHI, Jackson, SLF4J e Lombok
- classe principal:
br.com.oryanps.agent.TelemetryAgentApp
gradlew.bat shadowJarO artefato gerado fica em:
build/libs/TelemetryAgent.jar
- Projeto: agente de telemetria para Windows
- Função: coletar dados do sistema e enviar para uma API remota
- Instalação: pasta da aplicação em
%ProgramFiles%\mTadata Agent - Configuração:
C:\ProgramData\mTadata Agent\config.json - Rotas principais:
/v1/telemetry/heartbeate/v1/telemetry/sync