Nova postagem

検索

Artigo
· Fev. 17 6min de leitura

APM - Usando o Monitor de Histórico do IRIS ou Caché

O APM normalmente se concentra na atividade da aplicação, mas coletar informações sobre o uso do sistema fornece dados de contexto importantes que ajudam a entender e gerenciar o desempenho da sua aplicação, portanto estou incluindo o Monitor de Histórico do IRIS nesta série.

Neste artigo, descreverei brevemente como iniciar o Monitor de Histórico do IRIS ou Caché para criar um registro da atividade em nível de sistema, complementando as informações de atividade e desempenho da aplicação que você coleta. Também apresentarei exemplos de SQL para acessar as informações.

O que é o Monitor de Histórico do IRIS ou Caché?

O Monitor de Histórico está disponível no IRIS ou nas plataformas anteriores Caché e Ensemble. Ele é uma extensão do Monitor do Sistema do IRIS ou Caché. Mantém um registro persistente das métricas relacionadas à atividade do banco de dados (por exemplo, leituras e atualizações de globais) e ao uso do sistema (por exemplo, uso de CPU).

Existem várias ferramentas para coletar essas estatísticas, algumas das quais entram em enorme nível de detalhe, mas podem ser difíceis de entender. O Monitor de Histórico foi projetado para ser simples de usar, para executar continuamente em sistemas em produção e exigir menos esforço e conhecimento especializado para compreender a saída.

Ele armazena informações em um pequeno número de tabelas horárias e diárias que podem ser facilmente consultadas com SQL. Portanto, se você iniciá-lo hoje, o registro histórico estará disponível quando você precisar. E, claro, você ainda pode complementar o registro histórico com uma coleta de dados mais detalhada quando tiver um problema para investigar.

Quais são os custos e benefícios?

O Monitor de Histórico é muito leve e não adicionará uma carga significativa ao sistema em execução. O espaço em disco utilizado também é muito pequeno, com o armazenamento somando cerca de 130 MB por ano, mesmo que você opte por estender o tempo de retenção das estatísticas horárias, conforme recomendado neste artigo.

É fácil de configurar e a saída não requer análise adicional para ser utilizada.

No dia em que você ativar o Monitor de Histórico, verá pouca ou nenhuma vantagem em relação a outras ferramentas que podem fornecer detalhes mais imediatos. O benefício aparece semanas ou meses depois, quando você estiver trabalhando em um plano de capacidade ou investigando um problema de desempenho.

Ele fornece um registro histórico de muitas métricas importantes, incluindo:

  • Uso de CPU
  • Tamanho dos arquivos de banco de dados e dos journals
  • Referências e atualizações de globais
  • Leituras e gravações físicas
  • Uso de licenças

Também registra um grande número de métricas técnicas mais detalhadas que podem ser úteis ao investigar mudanças no desempenho de uma aplicação.

Como acesso os dados armazenados pelo Monitor de Histórico?

Tabelas

As informações são armazenadas no namespace %SYS. Elas podem ser facilmente acessadas usando SQL e, portanto, podem ser analisadas com qualquer ferramenta popular de relatórios. Existem quatro tabelas principais diárias: SYS_History.Daily_DB, SYS_History.Daily_Sys, SYS_History.Daily_Perf e SYS_History.Daily_WD, que armazenam os resumos diários. Existem tabelas equivalentes que armazenam os resumos horários.

Campos diários e horários

As tabelas diárias e horárias possuem, respectivamente, um campo diário ou horário no formato ‘64491||14400’, em que as duas partes correspondem aos valores de data e hora em $h no momento em que o processo em segundo plano foi executado para gerar os dados. A parte referente ao horário não tem muito significado nas tabelas diárias.

Campo Element_key

Algumas tabelas incluem os valores médios e máximos observados em cada período de tempo, além do desvio padrão. O tipo de registro é indicado pelo valor do campo element_key.

Portanto, uma consulta típica para visualizar o crescimento no uso médio diário de CPU seria:

SELECT Substr(DS.Daily,1,5) as DateH, (100-DS.Sys_CPUIdle) as AvgCPUBusy

FROM SYS_History.Daily_SYS    DS

WHERE element_key='Avg'

ORDER BY DateH

Como configuro e inicio o Monitor de Histórico?

Abra uma sessão de terminal do Caché e altere para o namespace %SYS. Em seguida, execute o comando

Do ^%SYSMONMGR

Serão apresentados vários menus de caracteres. Digite os números para fazer as seguintes seleções:

  1. Manage Application Monitor

2) Manage Monitor Classes

Em seguida, selecione a opção de ativar duas vezes e informe os nomes das classes

                 1)Activate/Deactivate Monitor Class

                            %Monitor.System.HistoryPerf

    Yes

1) Activate/Deactivate Monitor Class

     %Monitor.System.HistorySys

     Yes

Existem várias outras classes, mas não se sinta tentado a ativá-las sem testar primeiro. Algumas utilizam o PERFMON e não são adequadas para execução em um sistema em produção.

Em seguida, utilize a opção de sair até retornar ao primeiro menu. Para ativar as alterações, pare e depois inicie o monitor do sistema a partir do primeiro menu.

1) Start/Stop System Monitor

1) Start/Stop System Monitor

O Monitor de Histórico será executado continuamente, mesmo que o sistema seja reiniciado.

Você pode querer manter as estatísticas horárias por mais tempo do que o padrão de 60 dias. Para isso, utilize o método SetPurge(). Por exemplo, para manter as estatísticas horárias por um ano:

%SYS>do ##class(SYS.History.Hourly).SetPurge(365)

Exemplo de SQL mais complexo

Para um exemplo mais complicado, se você também quiser a média diária de CPU e o uso médio de CPU entre 9h e 12h, além de informações sobre referências e atualizações de globais:

SELECT Substr(DS.Daily,1,5) Day,

           (100-DS.Sys_CPUIdle) as Daily_Avg_CPU,

            Round(AVG(100-H1.Sys_CPUIdle),2) Morning_Avg_CPU ,

            DP.Perf_GloRef, DP.Perf_GloUpdate

FROM SYS_History.Daily_Perf DP,

           SYS_History.Daily_SYS DS,

           SYS_History.Hourly_Sys H1

WHERE DP.Daily=DS.Daily and DP.element_key='Avg' and DS.element_key='Avg'

and H1.element_key='Avg'and substr(DS.Daily,1,5)=Substr(H1.Hourly,1,5)

and Substr(H1.Hourly,8,12) in (32400,36000,39600)

GROUP BY DS.daily

 

O que no meu sistema de teste resulta em …

Day

Daily_Avg_CPU

Morning_Avg_CPU

Perf_GloRef

Perf_GloUpdate

64514

13.64

2.25

99.03

7.73

64515

19.94

14.67

91.95

6.32

64516

8.79

12.14

102.21

6.91

64517

14.09

3.36

39729.06

5393.97

64518

20.26

25.11

15036.53

60.63

64519

9.27

15.5

3898.47

153.68

64520

5.54

1.78

87.94

5.65

64521

6.08

1.89

117.49

6.73

64524

17.8

16.81

70.8

5.14

 

 

 

 

 

Documentação

O Monitor de Histórico é descrito completamente na documentação.

Discussão (0)1
Entre ou crie uma conta para continuar
Pergunta
· Fev. 17

Data Repoint NULLS Data In New Class Table When Old Class Property Is Changed & Saved

We are attempting to "Repoint" old class data to new class data to save disk space and data redundancy across multiple tables. This works to a point.  In essence the two classes are sharing the same data / Index / stream globals.  But if an ID in the Old_Class is opened, a property is modified, and saved the property that is in the New_Class (but not in the Old_Class) is NULLed / blanked.

Simplified explanation of data and what’s occurring.

Old Class Values   New Class Values
First_Name John   First_Name John
Middle_Initial Q   Middle_Initial Q
Last_Name Public   Last_Name Public
Date_Of_Birth 1/1/1965   Date_Of_Birth 1/1/1965
SSN 123-45-6789   SSN 123-45-6789
      Marital_Status Married

When the Old_Class is opened and any field in the Old_Class is modified and a %Save is run the Marital_Status becomes NULL / Blank.

Why does a %Save on the Old_Class result in a NULL / Blank value in the data storage global and in the New_Class table?  We have already checked Journaling and it sets a null into the $List position for "Marital_Status".

Is there a means to open the record via the Old_Class alter a property value, and perform a %Save without “losing” the value in the Marital_Status field in the New_Class?

10 novos comentários
Discussão (10)3
Entre ou crie uma conta para continuar
Artigo
· Fev. 17 3min de leitura

Operação de Ensemble: Chamando um Stored Procedure SQL

Utilizamos o JDBC Gateway do Caché para servidores Oracle e SQL para invocar diretamente seus stored procedures a partir do Ensemble. A obtenção de resultados de dados rápidos e em linha é normalmente tratada dentro da classe Functions.Library como uma função para envolver a consulta e formatar o retorno adequadamente.

Mas e quanto a stored procedures mais elaborados, feitos para postar dados sem congestionar um Router? As operações para construir esses pipelines de dados podem se tornar cansativas, especialmente quando mudanças são necessárias. O que se segue é um gerador de código para criar uma nova classe de Ensemble Message a partir de um SQL Stored Procedure que seja compatível para envio a uma Business Operation. A listagem do código-fonte do pacote está anexada.

Exemplo prático:

Passo 1) Importe a chamada do SQL Stored Procedure via SMP Explorer: SQL Link Wizard

Passo 2) Crie sua nova classe de projeto que aponte para o nome da classe proxy SQL criada pelo Assistente:

Class Pacs.JDBC.MakeImageLab Extends Common.JDBC.MakeRequestClass
{
  // forneça o nome da classe proxy JDBC criada pelo SQL Link Procedure Wizard.
  Parameter LINK = "dbo.Imagehl7add1";
  // forneça o nome da classe de mensagem gerada para o DTL
  Parameter MAKE = "Pacs.JDBC.ImageLabRequest";
}

Passo 3) Ao Salvar e Compilar o Passo nº 2, uma nova classe de Mensagem é gerada usando o nome fornecido em MAKE

/// NÃO TOQUE!
/// gerado automaticamente por Common.JDBC.MakeRequestClass via Pacs.JDBC.MakeImageLab
/// Escrito por Robert Hurst
Class Pacs.JDBC.ImageLabRequest Extends Common.JDBC.StoredProcedureRequest [ GeneratedBy = Pacs.JDBC.MakeImageLab.CLS, Not ProcedureBlock ]
{
  
Property x01mrn As %String(MAXLEN = 20);
 
Property x02ptname As %String(MAXLEN = 50);
 
Property x03gender As %String(MAXLEN = 1);
 
Property x04dob As %TimeStamp;
 
Property x05clipnum As %String(MAXLEN = 75);
  
Property x06studydesc As %String(MAXLEN = 200);
 
Property x07observdt As %TimeStamp;
 
Property x08orderphys As %String(MAXLEN = 80);
 
Property x09clinicalinfo As %String(MAXLEN = 300);
 
Property x10billingcode As %String(MAXLEN = 20);
 
Property x11ptnameCCC As %String(MAXLEN = 50);
 
Property x12reporttext As %Stream.GlobalCharacter;
 
Property x13reportdt As %TimeStamp;
 
Property x14reportstatus As %String(MAXLEN = 12);
 
Property x15reportby As %String(MAXLEN = 500);
 
Property x16ordercomments As %String(MAXLEN = 2500);

  
/// informa se a classe de mensagem é um grupo de mensagens ou não
  Parameter GROUP As INTEGER = 0; /// o nome da classe proxy JDBC criada pelo SQL Link Procedure Wizard
  Parameter LINK = "dbo.Imagehl7add1"; 
 }

Observe o prefixo usado na frente do nome de cada parâmetro. Isso serve para reforçar sua posição ordinal quando ele for exibido dentro do Construtor de DTL:

Passo 4) Crie sua Business Operation de destino usando a classe JDBC.StoredProcedureOperation, fornecendo o nome da mensagem de entrada no campo RequestClassname em suas Additional Settings apresentadas. Neste exemplo prático, o nome da classe de mensagem de destino saindo do DTL é: Pacs.JDBC.ImageLabRequest

Repita o processo com outros stored procedures SQL. Em frente!

Discussão (0)1
Entre ou crie uma conta para continuar
Artigo
· Fev. 17 12min de leitura

Agentes de IA do Zero - Parte 2: Dando um Corpo ao Cérebro

cover

Na Parte 1, estabelecemos a base técnica do MAIS (Multi-Agent Interoperability Systems). Conectamos com sucesso o "Cérebro", construímos um Adapter robusto usando LiteLLM, protegemos nossas chaves de API com o IRIS Credentials e, finalmente, deciframos o código do quebra-cabeça da interoperabilidade com Python.

Discussão (0)1
Entre ou crie uma conta para continuar
Artigo
· Fev. 17 4min de leitura

Las Vegas to Los Angeles Bus Travel Guide & Best Deals

Traveling from Las Vegas to Los Angeles is one of the most popular road journeys in the United States. Every day, thousands of tourists, students, workers, and weekend travelers move between these two iconic cities. One city offers nonstop entertainment and nightlife, while the other delivers beaches, culture, and endless opportunities.

Discussão (0)1
Entre ou crie uma conta para continuar