Dez 5, 2024: [PT] Monitore seus jogos no Steam Deck com o Elastic Agent

This post is also available in English.

Que tal usar Observability para algo diferente? Nesse post nós usaremos nossas ferramentas favoritas para monitorar como nossos jogos estão performando. Hoje nós exploraremos como usar o Elastic Agent para monitorar um Steam Deck, o que nos permitirá ver o que jogamos mais, o quanto de recurso cada jogo usa e como a GPU está performando.

Nós iremos abordar como:

  • instalar o Elastic Agent
  • configurar Integrations
  • usar a Custom API integration para coletar dados sobre a GPU
  • criar Kibana dashboards
  • importar e exportar dahsboards

Dados sobre os processos

A System Integration já coleta todos os dados que precisamos sobre os processos que estão rodando. Nós usaremos esses dados para ver quanto de recurso os processos usam e os jogos mais jogados.

Dados sobre a GPU

De modo geral Observability data não inclui dados sobre a performance da CPU ou GPU. É possível coletar dados de NVIDIA GPUs, mas o Steam Deck usa uma GPU AMD personalizada, e nós queremos botar a mão na massa também. Então nós mesmos iremos disponibilizar esses dados para serem coletados.

Linux distros normalmente incluem lm_sensors e ele está presente no Steam OS. Isso será suficiente para coletar toda a informação que precisamos.

Rodando sensors no meu Steam Deck, esse é o resultado:

nvme-pci-0100
Adapter: PCI adapter
Composite:    +45.9°C  (low  = -273.1°C, high = +82.8°C)
                       (crit = +84.8°C)
Sensor 1:     +45.9°C  (low  = -273.1°C, high = +65261.8°C)
 
BAT1-acpi-0
Adapter: ACPI interface
in0:           8.40 V  
curr1:         1.74 A  
 
amdgpu-pci-0400
Adapter: PCI adapter
vddgfx:      650.00 mV 
vddnb:       655.00 mV 
edge:         +44.0°C  
slowPPT:       7.12 W  (avg =  11.10 W, cap =  15.00 W)
fastPPT:      11.10 W  (cap =  15.00 W)
 
steamdeck_hwmon-isa-0000
Adapter: ISA adapter
PD Contract Voltage:   5.00 V  
System Fan:             0 RPM
Battery Temp:         +25.0°C  
PD Contract Current: 1000.00 mA 
 
acpitz-acpi-0
Adapter: ACPI interface
temp1:        +54.0°C  (crit = +105.0°C)

Tudo que precisamos está aqui, mas não no melhor formato. Então usaremos a versão em JSON, basta rodar sensors -j e o output será em JSON:

{
   "nvme-pci-0100":{
      "Adapter": "PCI adapter",
      "Composite":{
         "temp1_input": 31.850,
         "temp1_max": 82.850,
         "temp1_min": -273.150,
         "temp1_crit": 84.850,
         "temp1_alarm": 0.000
      },
      "Sensor 1":{
         "temp2_input": 31.850,
         "temp2_max": 65261.850,
         "temp2_min": -273.150
      }
   },
   "BAT1-acpi-0":{
      "Adapter": "ACPI interface",
      "in0":{
         "in0_input": 8.656
      },
      "curr1":{
         "curr1_input": 0.159
      }
   },
   "amdgpu-pci-0400":{
      "Adapter": "PCI adapter",
      "vddgfx":{
         "in0_input": 0.650
      },
      "vddnb":{
         "in1_input": 0.655
      },
      "edge":{
         "temp1_input": 41.000
      },
      "slowPPT":{
         "power1_average": 2.072,
         "power1_input": 2.040,
         "power1_cap": 15.000
      },
      "fastPPT":{
         "power2_average": 2.072,
         "power2_cap": 15.000
      }
   },
   "steamdeck_hwmon-isa-0000":{
      "Adapter": "ISA adapter",
      "PD Contract Voltage":{
         "in0_input": 5.000
      },
      "System Fan":{
         "fan1_input": 1522.000,
         "fan1_fault": 0.000
      },
      "Battery Temp":{
         "temp1_input": 25.000
      },
      "PD Contract Current":{
         "curr1_input": 1.000
      }
   },
   "acpitz-acpi-0":{
      "Adapter": "ACPI interface",
      "temp1":{
         "temp1_input": 42.000,
         "temp1_crit": 105.000
      }
   }
}

Como não é possível ter o Elastic Agent rodando comandos arbitrários e processando o que eles retornam, nós precisaremos de um pequeno servidor HTTP que colete e disponibilize esses dados.

Eu fiz um em Go, acesse GitHub - AndersonQ/steamdeck-sensors-api e instale ou faça sua própria versão dele.

Agora nós podemos configurar o Elastic Agent para coletar os dado dessa API. Para garantir que ele estará sempre rodando, steamdeck-sensors-api tem um instalador que instala e registra ele como um serviço usando systemd.

Agora que temos todos os dados que precisamos, é hora de coletá-los.

Coletando os dados

Instale um Elastic Agent. A System integration é adicionada por padrão em toda policy criada. Crie uma nova policy, eu usarei Steam Deck como o nome da minha, e instale um Elastic Agent no seu Steam Deck.

De uma olhada nesse FAQ pra ver como desativar o modo read only usando sudo steamos-readonly disable. Caso você tenha esquecido a senha do root, crie uma nova senha seguindo esse tutorial.

Agora que temos uma policy e um agent instalado, nós podemos configurar a Custom API integration:

Navegue para: Management > Integrations e busque por "custom api":

Adicione a Custom API integration na sua policy Steam Deck e configure ela assim:

  • "Dataset name": system.gpu
  • "Request URL": http://localhost:4242/gpu
  • "Request Interval": 30s - você pode escolher o intervalo que preferir. Para começar a ver os dados imediatamente e testar as visualizações eu usei 1s.
  • "Request HTTP Method": GET
  • "Processors":
- decode_json_fields:
    fields: ["message"]
    target: "system.gpu"
    overwrite_keys: true
    add_error_key: true
    expand_keys: true


O processors é fundamental para formatar o evento que será coletado de forma correta. Sem ele, a resposta do steamdeck-sensors-api apareceria como uma string no campo message do evento coletado.

Agora é só salvar e adicionar a integration na sua Steam Deck policy. Se você já instalou o agent, ele irá atualizar a policy automaticamente. Se você ainda não instalou ele, agora é a hora de instalar.

Verificando os dados coletados

Abra o Discover, selecione a data view metrics-* e filtre por event.dataset :"system.process". Agora escolha os campos process.name, system.process.cpu.total.pct and system.process.memory.size para serem visualizados. Abra um jogo no seu Steam Deck e tente achar o processo do jogo que você abriu. :slight_smile:

Para ver os dados sobre a GPU, selecione a data view logs-* e filtre por event.dataset :"system.gpu".

Agora é só criar um dashboard.

Steam Deck dashboard

Esse é o dashboard que eu criei:

Astro-Win64-Shi é Astroneer, ótimo jogo, recomendo.

Você pode importar esse dashboard, ele está no meu github repo. No final eu explico como importar e exportar dashboards. Mas agora vamos criar um e adicionar uma visualização nele.

Navegue para `Dashboards > Create dashboard

  • Na barra de pesquisa adicione um filtro prara mosrtar dados apenas do seu Steam Deck. Filtre por host.hostname : "steamdeck". Ajuste o hostname se você tiver mudado ele no seu Steam Deck.
  • Clique em Create visialization
  • Selecione a metrics-* dataview
  • procure por process.cpu
  • selecione e arraste system.process.cpu.total.pct para a "drop area"

isso irá gerar um gráfico como este:

  • em "Breakdown" selecione process.name, e então escolha 15 para "Number of values" e finalmente feche o painel.
  • escolha "Treemap" em vez de "Bar" para a visualização

deverá ficar assim:

  • agora clique em "Save and Return"

Agora vamos criar uma visualização para os jogos mais jogados.

  • clique em "Create Visualization"
  • adicione o filtro process.working_directory.text :"/home/deck/.local/share/Steam/steamapps/common/*" na barra de busca. Essa query por process.working_directory limitará as métricas sobre processos, selecionando apenas os processos que tem /home/deck/.local/share/Steam/steamapps/common/* como working directory. Esse deve ser o caminho para todos os jogos instalados. Dependendo de como você configurou o seu Steam Deck ou se você tem um cartão SD isso pode mudar. Então se não funcionar pra você, verifique as métricas de processo, procure um dos seus jogos e veja o working directory que ele usa.
  • selecione e arraste process.name para a "drop area"
  • escolha "Tag cloud" como o tipo de visualização
  • clique em "Top 5 values of process.name" e use 15 para "Number of Values"
  • feche o painel
  • clique em "Save and Return"

Deve estar assim antes de você clicar em "Save and Return"

O dashboard será parecido com esse:

Para fazer a visualização com os dados da GPU escolha a logs-* data view e filtre por event.dataset : "system.gpu", assim:

Eu deixarei como exercício para você cirar essa visualização :wink:

Importar e exportar dashboards

Para importar dashboards use a Kibana Saved Objects API.

curl -u USER:PASSWORD -X POST -H 'Content-Type: multipart/form-data' -H 'kbn-xsrf: true'  YOUR-KIBANA-HOST/api/saved_objects/_import\?createNewCopies\=true --form file=@steam-deck-dashboard.ndjson

Download o dashboard que eu criei aqui.

Para exportar um dashboarde, use

curl -u USER:PASSWORD -X POST -H 'Content-Type: application/json' -H 'kbn-xsrf: true' YOUR-KIBANA-HOST/api/saved_objects/_export \
-H "Content-Type: application/json; Elastic-Api-Version=2023-10-31" \
-H "kbn-xsrf: string" \
-d '{"objects":[{"id":"YOUR-DASHBOARD-ID","type":"dashboard"}],"excludeExportDetails":true,"includeReferencesDeep":true}' > steam-deck-dashboard.ndjson

Para achar o ID do dashboard, abra o dashboard, olhe a URL, será algo como:

https://KIBANA-HOST/app/dashboards#/view/<dashboard-id>?

https://KIBANA-HOST/app/dashboards#/view/bfcd09b3-effe-4a65-b58b-b6c3d528cc3e?

Conclusão

É bem legal usar a Elastic Stack para monitorar meu Steam Deck, conseguindo insights sobre sua performance, os recursos que os jogos usam, identificar os programas que estão rodado e o nome do binário de cada um deles.

Mais importante ainda, essa é uma forma divertida de começar a usar o Elastic Agent, coletar dados de monitoramento, criar visualizações e dashboards. Isso também nos dá uma ideia da vasta quantidade de dados que podemos coletar e nos inspira a usá-los de diferente formas. :slight_smile:

Tem um free trial na Elastic Cloud ou você pode rodar a sua Elastic Stack com Docker ou baixar e rodar você mesmo.

Agora você já sabe como o seu Steam Deck e rodar uma Elastic Stack, que tal fazer você mesmo?

1 Like