Namespaces são uma forma de agrupar incidentes de erro, incidentes de desempenho e métricas de ações. O AppSignal usa três namespaces por padrão:
web para requisições web
frontend para JavaScript de front-end
background para jobs em segundo plano
Os aplicativos podem ter qualquer número de namespaces. Por exemplo, você pode ter um namespace separado para o painel de administração do seu aplicativo, API ou tarefas agendadas. Este guia abordará as etapas necessárias para reportar ações em namespaces personalizados.
Configurando namespaces
Os namespaces são definidos pelo código do seu aplicativo. Com pequenos helpers, você pode personalizar o namespace de uma ação. Este guia ensinará como dividir as requisições em diferentes namespaces. Para este guia, criaremos um namespace “admin” e um namespace “critical” para jobs em segundo plano.
Os nomes de namespace só podem conter letras (a-z) e sublinhados
Não recomendamos ter mais de 15 namespaces por aplicativo.
Configurações por linguagem
Ruby
No Rails, podemos usar o callback before_action para chamar um método antes que uma requisição seja tratada. No exemplo de código abaixo, criamos um before_action que chama o método set_appsignal_namespace. Neste método, chamamos o método helper Appsignal.set_namespace para configurar “admin” como o namespace para esta requisição. Isso também funciona se outros controllers forem subclasses do AdminController.
# Em um controller Rails
# app/controllers/admin_controller.rb
class AdminController < ApplicationController
before_action :set_appsignal_namespace
def set_appsignal_namespace
# Configura todas as ações neste controller para reportar
# no namespace "admin"
Appsignal.set_namespace("admin")
end
# Qualquer outra ação do controller
end
Em seguida, definiremos o namespace do código executado pelos workers em segundo plano do Sidekiq do nosso aplicativo. Para definir corretamente o namespace dos erros disparados em nosso worker em segundo plano, devemos definir o namespace antes que qualquer outro código seja executado. No exemplo de código do worker Sidekiq abaixo, fazemos isso imediatamente no método perform, na linha 7.
# Em um worker Sidekiq
# app/workers/critical_worker.rb
class CriticalWorker
include Sidekiq::Worker
def perform
# Configura os jobs deste worker para reportar no namespace "critical"
Appsignal.set_namespace("critical")
# O código real do worker
end
end
Também é possível configurar o namespace ao criar uma transação usando o helper Appsignal.monitor. Ele aceita o namespace como um argumento de palavra-chave.
# Ao criar uma nova transação
Appsignal.monitor(namespace: "admin") do
# Seu código a ser instrumentado
end
Para transações que já foram criadas, você pode usar o método set_namespace para configurar o namespace da transação, como no exemplo abaixo:
# Ao alterar o namespace posteriormente para uma transação
transaction.set_namespace("slow_admin")
Uma nota sobre a localização do helper
Os helpers set_namespace usados neste guia podem ser chamados em qualquer ação que faça parte de uma amostra do AppSignal. Recomendamos chamar isso o mais cedo possível na requisição ou job em segundo plano, para que a transação seja configurada com o namespace fornecido antes que qualquer erro ocorra. Caso contrário, se ocorrer um erro ou qualquer outra coisa que pare o processo, a transação será enviada ao AppSignal antes que o helper set_namespace seja chamado, e a amostra será reportada sob o namespace padrão.
Leia mais
Elixir
Em controllers Phoenix, usamos um plug para chamar uma função antes que a requisição seja tratada pelo Phoenix. No exemplo de código abaixo, usamos plug para chamar a função set_appsignal_namespace (linha 5). Nesta função, chamamos o helper Appsignal.Span.set_namespace para configurar o namespace para esta requisição (linha 10).
# Em um controller Phoenix
defmodule AppsignalPhoenixExampleWeb.AdminController do
use AppsignalPhoenixExampleWeb, :controller
plug :set_appsignal_namespace
defp set_appsignal_namespace(conn, _params) do
# Configura todas as ações neste controller para reportar
# no namespace "admin"
Appsignal.Span.set_namespace(Appsignal.Tracer.root_span(), "admin")
conn
end
# ...
end
Em seguida, configuraremos o namespace para um job em segundo plano. Para capturar qualquer erro dentro do job dentro do namespace desejado, Appsignal.Span.set_namespace deve ser chamado no início da função antes de qualquer outro código, como na linha 4 do exemplo de código abaixo:
defmodule MyApp.CriticalJob do
def run do
# Configura os jobs deste worker para reportar no namespace "critical"
Appsignal.Span.set_namespace(Appsignal.Tracer.root_span(), "critical")
# O código real do worker
end
end
Também é possível configurar o namespace ao criar uma transação. Consulte a documentação para decorators ou helpers de instrumentação para mais informações sobre como configurar namespaces.
Uma nota sobre a localização do helper
Os helpers set_namespace usados neste guia podem ser chamados em qualquer ação que inicie uma transação do AppSignal. Recomendamos chamar isso o mais cedo possível na requisição ou job em segundo plano, para que a transação seja configurada com o namespace fornecido antes que qualquer erro ocorra. Caso contrário, se ocorrer um erro—ou qualquer outra coisa que pare o processo—a transação será enviada ao AppSignal antes que o código set_namespace seja chamado e será reportada sob o namespace padrão.
Leia mais
Node.js
Em aplicativos Node.js, o AppSignal funciona com o OpenTelemetry, que usa spans para rastrear metadados, como a qual namespace um span pertence. Use a função helper setNamespace como no exemplo abaixo para definir o namespace para o trace do span ativo.
import { setNamespace } from "@appsignal/nodejs";
setNamespace("custom-namespace");
Leia mais sobre como os spans funcionam em Node.js.
PHP
Em aplicativos PHP, o AppSignal funciona com o OpenTelemetry, que usa spans para rastrear metadados, como a qual namespace um span pertence. Use o método helper Appsignal::setNamespace para definir o namespace para o trace do span ativo.
Appsignal::setNamespace("admin");
Se você chamar este helper várias vezes dentro de um único trace, o AppSignal usará a chamada cujo span tenha o timestamp mais novo.
Leia mais sobre como a instrumentação personalizada funciona em PHP.
Python
Em aplicativos Python, o AppSignal funciona com o OpenTelemetry, que usa spans para rastrear metadados, como a qual namespace um span pertence. Use a função helper set_namespace como no exemplo abaixo para definir o namespace para o trace do span ativo.
from appsignal import set_namespace
set_namespace("custom-namespace")
Leia mais sobre como os spans funcionam em Python.
JavaScript de front-end
Em aplicativos JavaScript de front-end, o AppSignal funciona com spans para rastrear metadados, como o namespace de um span.
Diferente de Ruby, Node.js, PHP e Python, a API JavaScript de front-end não
possui um helper global setNamespace / set_namespace. Em vez disso, como Elixir,
Go e Java, você define o namespace diretamente em um span.
Ao criar este span, chame setNamespace com um valor String do nome do namespace desejado, conforme demonstrado no exemplo abaixo:
const span = appsignal.createSpan();
span.setNamespace("admin"); // um namespace personalizado para este span (padrão é `frontend`)
Leia mais sobre como os spans funcionam em JavaScript de front-end.
Em aplicativos Go, o AppSignal funciona com o OpenTelemetry, que usa spans para rastrear metadados, como a qual namespace um span pertence. Em qualquer span no trace, defina um atributo appsignal.namespace com um valor String do novo namespace.
span.SetAttributes(attribute.String("appsignal.namespace", "admin"))
Consulte a documentação de instrumentação personalizada Go sobre como buscar um span ou criar um novo.
Se vários atributos com o atributo appsignal.namespace forem encontrados, o span com o timestamp mais novo prevalece.
Leia mais sobre como a instrumentação personalizada funciona em Go.
Java
Em aplicativos Java, o AppSignal funciona com o OpenTelemetry, que usa spans para rastrear metadados, como a qual namespace um span pertence. Em qualquer span no trace, defina um atributo appsignal.namespace com um valor String do novo namespace.
span.setAttribute("appsignal.namespace", "admin");
Consulte a documentação de instrumentação personalizada Java sobre como buscar um span ou criar um novo.
Se vários atributos com o atributo appsignal.namespace forem encontrados, o span com o timestamp mais novo prevalece.
Leia mais sobre como a instrumentação personalizada funciona em Java.
Deploy
Quando seu aplicativo estiver configurado com seus novos helpers de namespace, faça o commit das alterações e o deploy do app. Quando o app iniciar/reiniciar, o AppSignal reportará ações sob seu novo namespace 🥳!
Os dados de deploys antigos permanecerão agrupados pelo seu namespace original.
Apenas ações recém-reportadas serão agrupadas pelos seus novos namespaces.
Os namespaces não estão sendo reportados corretamente? Não entre em pânico, entre em contato e nós o ajudaremos!
Leitura adicional