New post

Find

Article
· May 21 2m read

Usando %System.Monitor.LineByLine com %SYS.MONLBL para analisar seu código

Tenho certeza de que a maioria de vocês está familiarizada com a utilidade %SYS.MONLBL, que é crucial ao analisar gargalos de desempenho de código. Ela permite que você selecione várias rotinas que deseja monitorar em tempo de execução e também especifique qual(is) processo(s) você quer observar. MAS, e se você não souber exatamente qual processo executaria seu código? Isso é verdade para muitos aplicativos baseados na web (CSP/REST) hoje. Você quer minimizar a utilização de recursos em seu sistema de produção que precisa de análise. Então, que tal fazer uma pequena alteração?

1. Defina um arquivo INC com estas macros:

#define START(%level) try { ##continue 
s zzroutine=$p($view(-1,-3),"^",6) ##continue 
if ##class(%Monitor.System.LineByLine).IsActive(zzroutine)=0 { ##continue $$$ThrowOnError(##class(%Monitor.System.LineByLine).Start($lfs(zzroutine),$lfs(##class(%Monitor.System.LineByLine).GetMetrics(%level)),$lb($job))) ##continue } ##continue 
h 1 ##continue 
} catch (e) { ##continue
 d BACK^%ETN ##continue 
} 

#define PAUSE s sc=##class(%Monitor.System.LineByLine).Pause()

Na sua classe ou rotina, identifique um local que você deseja monitorar e insira estas duas macros para iniciar a coleta de dados e pausar a coleta, como neste exemplo:

$$$START(2)   // use 1 or 2 here

// code of your application here

$$$PAUSE

Sempre que você executar este código (método de uma classe ou rotina), ele tentará iniciar o %SYS.MONLBL para essa classe ou rotina e processo específicos.

Uma vez que seu código tenha terminado, você pode simplesmente ir ao terminal no namespace onde sua aplicação é executada e chamar d ^%SYS.MONLBL. Como a macro START iniciou o monitor, ele ainda estará em execução e você poderá facilmente coletar seus dados de desempenho, opcionalmente junto com o código-fonte. Não se esqueça de parar o monitor depois de coletar seus dados!

Se você precisar coletar dados para mais rotinas, pode facilmente modificar a macro START para permitir a entrada manual de uma lista de rotinas para análise.

Espero que você ache esta pequena alteração útil!

Discussion (0)1
Log in or sign up to continue
Question
· May 21

How to override the port used on a SOAP operation

WSDL for a CDC vendor was provided with a URL using a custom socket (non 443). Everything generated fine, but when making calls to their https:// URL that has their custom port in the URL - no response comes back. The assumption is, their server isn't even processing the request, as Postman does using the custom https://path.to.server:NNNN port in the URL.

I see with a normal web operation that uses %Net.HttpRequest overriding the port property is easily done - but no animal seems to exist for any generated SOAP Operation class. Is there a way to make a call in a SOAP operation using HTTPS but with a custom port? What needs to be overridden in the generated classes to do this? Is this even possible?

Thanks in advance!

3 Comments
Discussion (3)2
Log in or sign up to continue
Article
· May 21 2m read

Manipulando configuraciones de seguridad programáticamente

Pregunta:

¿Cómo podéis crear, modificar, etc., configuraciones de seguridad como Usuarios y Roles programáticamente?

Respuesta:

Podéis usar las clases del paquete Security en el NAMESPACE %SYS. Por ejemplo Security.Roles o Security.Users.

Por supuesto, para llevar a cabo estas acciones, necesitaréis la autorización correspondiente.

Aquí tenéis un pequeño ejemplo usando Security.Roles:

 
 // Create a Role
%SYS>Set status = ##class(Security.Roles).Create("testRole","a test Role","%Development:U,%DB_USER:R")
 

// Creation was successful
%SYS>Write status
1

// Now lets examine the Role created
%SYS>Set status = ##class(Security.Roles).Get("testRole",.properties)  

// We got the properties correctly         
%SYS>Write status
1

// The properties were returned by reference
%SYS>ZWrite properties
properties("Description")="a test Role"
properties("GrantedRoles")=""
properties("Resources")="%DB_USER:R,%Development:U"
 

// Now we want to add another permission
%SYS>Set properties("Resources")=properties("Resources")_",%DB_SAMPLES:RW"
 

// And modify our Role
%SYS>Set status = ##class(Security.Roles).Modify("testRole",.properties)
 
%SYS>Write status
1

// Let's verify this worked
%SYS>Set status = ##class(Security.Roles).Get("testRole",.latestProperties)
 
%SYS>ZWrite latestProperties
latestProperties("Description")="a test Role"
latestProperties("GrantedRoles")=""
latestProperties("Resources")="%DB_SAMPLES:RW,%DB_USER:R,%Development:U"

Nota: Tened en cuenta que el comportamiento actual (a partir de la versión 2016.1) es que, si la lista de Recursos separada por comas incluye un elemento vacío (por ejemplo, 'aaa,,bbb'), la adición de recursos se detendrá en ese punto.

Este comportamiento ha sido registrado para que se examine si así lo deseáis, y en caso contrario, se corregirá.

 

Además, en la comunidad inglesa, @Evgeny Shvarov añadió:

"Sigue siendo útil con los años

Simplemente añado aquí el código para asignar un rol a un usuario:"

ClassMethod AddRoleToUser(user = "CSPSystem", role = "DB_USER_Read") As %Status
{

// Change to the %SYS namespace.
new $NAMESPACE
set $NAMESPACE="%SYS"
set status=##class(Security.Users).Get(user, .MyUserProps)

set $p(MyUserProps("Roles"),",",*)=role

set status=##class(Security.Users).Modify(user,.MyUserProps)



// Announce success.
if $$$ISOK(status) {

write !, "Roles for the user "_user_" were successfully modified."
}

Quit status

}
Discussion (0)1
Log in or sign up to continue
Article
· May 20 3m read

A knockout of weight

image

Just like a knockout punch, without giving the opponent a chance, Kubernetes, as an open source platform, has a universe of opportunities due to its availability (i.e., the ease of finding support, services and tools). It is a platform that can manage jobs and services in containers, which greatly simplifies the configuration and automation of these processes.

But let's justify the title image and give the tool in question the “correct” name: InterSystems Kubernetes Operator.

Discussion (0)1
Log in or sign up to continue
Article
· May 20 3m read

Um nocaute de peso

Desenho de animal com a boca aberta O conteúdo gerado por IA pode estar incorreto., Imagem 

 

Assim como um nocaute, sem dar chances ao adversário, o Kubernetes, enquanto uma plataforma de código aberto, tem um universo de oportunidades devido à sua disponibilidade (isto é, a facilidade para encontrar suporte, serviços e ferramentas). Ele é uma plataforma que pode gerenciar os trabalhos e serviços em contêineres, o que simplifica e muito a configuração e automação destes processos. 

Mas, vamos justificar a imagem título e dar o nome “correto” à ferramenta em questão: InterSystems Kubernetes Operator. 

O princípio é básico, escolhem-se os serviços e definem-se as regras para o jogo (aqui remetendo ao Knockout novamente), e tudo será fornecido da forma mais transparente e eficiente possível, e isto é válido para a instalação, reparação ou eventual restauração, quando isto fugir dos requisitos pré-definidos.  

Mas, o que diferencia o IKO de qualquer outro operador? Como uma extensão da API do Kubernetes (Vamos passar a chama-lo de K8s para abreviar), o componente personalizado IrisCluster, que tem como opções a implantação como cluster bloqueado IRIS, um cluster Caché distribuído ou ainda uma instância anônima. Tudo isto nas mais diversas plataformas disponíveis Kubernetes. Por último, mas, não menos importante, também engloba recursos de gerenciamento de cluster InterSystems, que permitem automatizar algumas tarefas com a adição de nós, outrora, só poderia ser realizado manualmente. 

Tudo isto é muito bonito, fez referência a algum esporte ou jogo, mas, por que eu preciso disto? A resposta é relativamente simples. Eu não preciso do IrisCluster para levar o InterSystems IRIS para o K8s, entretanto, como o K8s é um aplicação independente, seria necessário crias as definições e eventuais scripts para configurar estas instâncias IRIS. Desta forma, o IKO automatiza este processo, facilitando a manutenção. A utilização de contêineres é uma ótima forma de para empacotar esta coleção de atividades que devem acontecer. 

Entretanto, aproveitando a oportunidade, você sabe o que é um contêiner? Uma dica, não é somente o jogo de tabuleiro. 

Container, the Shipping Container Board Game, Imagem 

A resposta está muito mais para o “transporte” de alguma encomenda, pois, ele empacota e isola aplicações e serviços, para que sejam executadas à parte do restante. Facilitando assim o “transporte” de um ambiente para outro, de acordo com a necessidade. 

Aproveitando-se da vasta documentação da InterSystems, abaixo segue o link para a instalação do IKO e subsequentes etapas de configuração e ajustes. 

Para ninguém ficar curioso a respeito do apelido K8s. A origem do nome Kubernetes vem do grego, que significa nada mais, nada menos que pilotou ou timoeiro, enfim, àquele que direciona. E, a quantidade de caracteres entre as letras “K” do início e “S” do fim, é 8. Desta forma, “K8s”. 

Discussion (0)1
Log in or sign up to continue