← Recursos do servidor HQbird

Novo recurso — monitoramento leve baseado em um plugin de trace que atualiza contadores em tempo real. Os contadores ficam em memória compartilhada, o que funciona bem no Classic Server. As atualizações não usam locks. O tamanho padrão da memória compartilhada é 4 MB e não muda após a inicialização. Isso mantém o acesso aos contadores quase sem locks. O tamanho pode ser alterado com o parâmetro MemorySize do plugin (veja abaixo).

Hoje há um conjunto pequeno de contadores. O monitoramento cobre dois tipos de objetos: bancos e conexões. No nível do banco há um conjunto separado para conexões finalizadas, para acumular estatísticas.

API do serviço

Para ler os dados foi criado um novo serviço:

c
/* Lightweight monitoring */
#define isc_action_svc_lwmonitoring  32

O serviço tem dois parâmetros. O primeiro escolhe a operação. Hoje existe só “executar consulta”:

c
#define isc_spb_lwm_query  1

Há quatro tipos de consulta (abaixo). Passe o número (1–4) como valor inteiro de isc_spb_lwm_query.

O segundo parâmetro — nome do banco — é opcional e usa a tag isc_spb_dbname. Se definido, a consulta fica limitada a esse banco; senão retorna dados de todos os bancos conhecidos.

Formato da resposta

Todas as consultas devolvem texto, uma linha por elemento. Um elemento pode descrever um banco, uma conexão ou um agregado. As linhas são JSON.

A primeira linha é sempre o cabeçalho:

json
{"idQuery" : 1, "tsQuery" : "2024-04-17T00:17:58" }
idQuery
número da consulta (ID)
tsQuery
início da consulta (hora local do servidor, ISO-8601)

Consulta 1 — resumo

Resumo dos bancos e conexões conhecidos. Sempre uma linha:

json
{"cntDb" : 1, "activeAtt" : 1, "goneAtt" : 0}
cntDb
número de bancos
activeAtt
conexões ativas
goneAtt
conexões finalizadas

Consulta 2 — lista de bancos

Uma ou mais linhas:

json
{"dbName" : "SECURITY2.FDB", "activeAtt" : 1, "goneAtt" : 2}
dbName
nome do arquivo do banco
activeAtt
conexões ativas
goneAtt
conexões finalizadas

Consulta 3 — resumo por banco

Uma ou mais linhas:

json
{"dbName" : "SECURITY2.FDB", "activeAtt" : 1, "goneAtt" : 0, "doneTran" : 1, "activeTran" : 0, "prepReq" : 0, "execReq" : 0, "activeReq" : 0}
dbName
nome do arquivo do banco
activeAtt
conexões ativas
goneAtt
conexões finalizadas
doneTran
transações concluídas
activeTran
transações ativas
prepReq
statements preparados
execReq
statements executados
activeReq
statements ativos

Contadores adicionais:

rowsFetched
linhas devolvidas à aplicação
execTime
tempo de execução, ms
errors
erros devolvidos à aplicação
fetches
fetches de página
reads
leituras de página
marks
marks (antes de alterar uma página)
writes
escritas de página

Consulta 4 — detalhe das conexões

Várias linhas de dois tipos:

json
{"dbName" : "SECURITY2.FDB", "activeAtt" : 1, "goneAtt" : 0}
json
{"idAtt" : 0, "pidAtt" : 0, "doneTran" : 0, "activeTran" : 0, "prepReq" : 0, "execReq" : 0, "activeReq" : 0}
json
{"idAtt" : 13925, "pidAtt" : 11188, "doneTran" : 1, "activeTran" : 0, "prepReq" : 0, "execReq" : 0, "activeReq" : 0}

Linhas (a) descrevem bancos; linhas (b) descrevem conexões daquele banco. Depois de cada (a) há pelo menos uma (b).

idAtt
id da conexão, ou 0 para o agregado de conexões finalizadas
pidAtt
PID do processo do servidor que atende a conexão

Erros

Em falha o serviço devolve uma exceção no status vector ou uma linha JSON:

json
{"errorMsg" : "Error text"}

Exemplo:

json
{"errorMsg" : "Unknown query: 5"}

Exemplos de comando

Service manager local:

Command
fbsvcmgr service_mgr action_lwmonitoring lwm_query 1

Host remoto, consulta 4 para um banco:

Command
fbsvcmgr host:service_mgr action_lwmonitoring lwm_query 4 dbname employee

Configuração

Em firebird.conf há um parâmetro com o nome do plugin:

ini
MonitoringPlugin =

Por padrão o plugin não está definido e o monitoramento fica desligado. No HQbird o nome é fblwmon:

ini
MonitoringPlugin = fblwmon

O plugin vem na build do HQbird, no diretório plugins.

Os parâmetros do plugin se definem da forma usual (veja README.plugins.html), por exemplo em plugins.conf:

ini
Plugin = fblwmon
{
  Config = lwmConfig
}

Config = lwmConfig
{
  # default 4MB
  MemorySize = 1M
}

MemorySize — tamanho da memória compartilhada do plugin em bytes (ou com sufixo, por exemplo 1M).

Limite de conexões

Com base no monitoramento leve há um limite embutido de conexões simultâneas por banco. O valor do limite é o mesmo para todos os bancos (HQ 2.5 não tem ajuste por banco). Dois parâmetros inteiros em firebird.conf:

ini
WarnCountAttachments = 0
MaxCountAttachments = 0

A verificação ocorre na conexão e não conta a conexão que está sendo criada. Usa o contador de conexões ativas daquele banco:

  • se contador ≥ WarnCountAttachments e < MaxCountAttachments, a conexão é permitida e firebird.log recebe:
text
Database XXX: number of attachments is above warning level (N >= W)
  • se contador ≥ MaxCountAttachments, a conexão é recusada. O cliente vê:
text
Statement failed, SQLSTATE = HY000
Number of attachments exceeds allowed maximum

e em firebird.log:

text
Database XXX: number of attachments is above maximum level (N >= M)

Não são verificadas: conexões a security.db, conexões de serviço e conexões com isc_dpb_no_db_triggers no DPB.

  • WarnCountAttachments = 0 — sem avisos
  • MaxCountAttachments = 0 — sem bloqueio

Para o limite funcionar é preciso instalar e configurar o plugin de monitoramento leve (veja acima).