<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ezzio Moreira</title>
    <description>The latest articles on Forem by Ezzio Moreira (@ezziomoreira).</description>
    <link>https://forem.com/ezziomoreira</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1092969%2F2982ccdc-fc4f-4e38-a047-9ee0ebf0c9c4.jpeg</url>
      <title>Forem: Ezzio Moreira</title>
      <link>https://forem.com/ezziomoreira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ezziomoreira"/>
    <language>en</language>
    <item>
      <title>OpenTelemetry Collector ElasticBeanStalk</title>
      <dc:creator>Ezzio Moreira</dc:creator>
      <pubDate>Fri, 28 Jun 2024 14:27:15 +0000</pubDate>
      <link>https://forem.com/ezziomoreira/opentelemetry-collector-elasticbeanstalk-db</link>
      <guid>https://forem.com/ezziomoreira/opentelemetry-collector-elasticbeanstalk-db</guid>
      <description>&lt;p&gt;Este guia descreve os passos para implementar o OpenTelemetry Collector no Elastic Beanstalk  utilizando &lt;a href="https://docs.aws.amazon.com/pt_br/elasticbeanstalk/latest/dg/customize-containers-ec2.html"&gt;.ebextension&lt;/a&gt;. O processo inclui baixar o binário do OpenTelemetry Collector, configurar um serviço do Linux, copiar o arquivo de configuração e iniciar o serviço.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Criar a Pasta &lt;code&gt;.ebextensions&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Primeiro, crie um diretório chamada &lt;code&gt;.ebextensions&lt;/code&gt; no diretório raiz da sua aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Baixar o Binário do OpenTelemetry Collector
&lt;/h3&gt;

&lt;p&gt;Crie um arquivo de configuração chamado &lt;code&gt;01_download_collector.config&lt;/code&gt; no diretório &lt;code&gt;.ebextensions&lt;/code&gt; para baixar o binário do OpenTelemetry Collector.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/opt/otelcol-contrib/otelcol-contrib"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;000755"&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ec2-user&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ec2-user&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.103.1/otelcol-contrib_0.103.1_linux_arm64.tar.gz&lt;/span&gt;

&lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;extract_otel_collector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-xvzf&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/opt/otelcol-contrib/otelcol-contrib&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-C&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/opt/otelcol-contrib/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Criar o Serviço Linux para OtelColl
&lt;/h3&gt;

&lt;p&gt;Crie um arquivo de configuração chamado &lt;code&gt;02_create_service.config&lt;/code&gt; para configurar um serviço systemd para o OpenTelemetry Collector.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc/systemd/system/otelcol-contrib.service"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;000644"&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;[Unit]&lt;/span&gt;
      &lt;span class="s"&gt;Description=OpenTelemetry Collector Contrib&lt;/span&gt;
      &lt;span class="s"&gt;After=network.target&lt;/span&gt;

      &lt;span class="s"&gt;[Service]&lt;/span&gt;
      &lt;span class="s"&gt;User=ec2-user&lt;/span&gt;
      &lt;span class="s"&gt;ExecStart=/opt/otelcol-contrib/otelcol-contrib --config=/etc/otelcol-contrib/config.yaml&lt;/span&gt;
      &lt;span class="s"&gt;Restart=always&lt;/span&gt;

      &lt;span class="s"&gt;[Install]&lt;/span&gt;
      &lt;span class="s"&gt;WantedBy=multi-user.target&lt;/span&gt;

&lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;reload_systemd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sudo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;systemctl&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;daemon-reload"&lt;/span&gt;
  &lt;span class="na"&gt;enable_service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sudo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;systemctl&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;enable&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;otelcol-contrib"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Copiar o Arquivo de Configuração
&lt;/h3&gt;

&lt;p&gt;Crie um arquivo de configuração chamado &lt;code&gt;03_copy_config.config&lt;/code&gt; para copiar o arquivo de configuração do OpenTelemetry Collector.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc/otelcol-contrib/config.yaml"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;000644"&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ec2-user&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ec2-user&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;receivers:&lt;/span&gt;
        &lt;span class="s"&gt;otlp:&lt;/span&gt;
          &lt;span class="s"&gt;protocols:&lt;/span&gt;
            &lt;span class="s"&gt;grpc:&lt;/span&gt;
              &lt;span class="s"&gt;endpoint: "0.0.0.0:4317"&lt;/span&gt;
            &lt;span class="s"&gt;http:&lt;/span&gt;
              &lt;span class="s"&gt;endpoint: "0.0.0.0:4318"&lt;/span&gt;

        &lt;span class="s"&gt;prometheus:&lt;/span&gt;
          &lt;span class="s"&gt;config:&lt;/span&gt;
            &lt;span class="s"&gt;scrape_configs:&lt;/span&gt;
              &lt;span class="s"&gt;- job_name: otelcoll-metrics&lt;/span&gt;
                &lt;span class="s"&gt;scrape_interval: 60s&lt;/span&gt;
                &lt;span class="s"&gt;static_configs:&lt;/span&gt;
                  &lt;span class="s"&gt;- targets: ['localhost:8888']&lt;/span&gt;

      &lt;span class="s"&gt;processors:&lt;/span&gt;
        &lt;span class="s"&gt;batch:&lt;/span&gt;
          &lt;span class="s"&gt;send_batch_max_size: 1000&lt;/span&gt;
          &lt;span class="s"&gt;timeout: 60s&lt;/span&gt;
          &lt;span class="s"&gt;send_batch_size: 800&lt;/span&gt;

        &lt;span class="s"&gt;memory_limiter:&lt;/span&gt;
          &lt;span class="s"&gt;check_interval: 1s&lt;/span&gt;
          &lt;span class="s"&gt;limit_percentage: 70&lt;/span&gt;
          &lt;span class="s"&gt;spike_limit_percentage: 30&lt;/span&gt;

        &lt;span class="s"&gt;resourcedetection:&lt;/span&gt;
          &lt;span class="s"&gt;detectors: [env, elastic_beanstalk, ec2]&lt;/span&gt;
          &lt;span class="s"&gt;timeout: 2s&lt;/span&gt;
          &lt;span class="s"&gt;override: false&lt;/span&gt;

        &lt;span class="s"&gt;attributes/logs:&lt;/span&gt;
          &lt;span class="s"&gt;actions:&lt;/span&gt;
            &lt;span class="s"&gt;- action: insert&lt;/span&gt;
              &lt;span class="s"&gt;key: loki.attribute.labels&lt;/span&gt;
              &lt;span class="s"&gt;value: event.domain, event.name&lt;/span&gt;
            &lt;span class="s"&gt;- action: insert&lt;/span&gt;
              &lt;span class="s"&gt;key: loki.format&lt;/span&gt;
              &lt;span class="s"&gt;value: json&lt;/span&gt;

        &lt;span class="s"&gt;resource/logs:&lt;/span&gt;
          &lt;span class="s"&gt;attributes:&lt;/span&gt;
            &lt;span class="s"&gt;- action: insert&lt;/span&gt;
              &lt;span class="s"&gt;key: loki.resource.labels&lt;/span&gt;
              &lt;span class="s"&gt;value: service.name&lt;/span&gt;

      &lt;span class="s"&gt;exporters:&lt;/span&gt;
        &lt;span class="s"&gt;loki:&lt;/span&gt;
          &lt;span class="s"&gt;endpoint: http://ENPOINT:3100/loki/api/v1/push&lt;/span&gt;
          &lt;span class="s"&gt;tls:&lt;/span&gt;
            &lt;span class="s"&gt;insecure: true&lt;/span&gt;

        &lt;span class="s"&gt;otlphttp/tempo:&lt;/span&gt;
          &lt;span class="s"&gt;endpoint: http://ENPOINT:4318&lt;/span&gt;
          &lt;span class="s"&gt;tls:&lt;/span&gt;
            &lt;span class="s"&gt;insecure: true&lt;/span&gt;

        &lt;span class="s"&gt;prometheusremotewrite:&lt;/span&gt;
          &lt;span class="s"&gt;endpoint: http://ENPOINT:9009/api/v1/push&lt;/span&gt;
          &lt;span class="s"&gt;resource_to_telemetry_conversion:&lt;/span&gt;
            &lt;span class="s"&gt;enabled: true&lt;/span&gt;
          &lt;span class="s"&gt;target_info:&lt;/span&gt;
            &lt;span class="s"&gt;enabled: false&lt;/span&gt;

      &lt;span class="s"&gt;service:&lt;/span&gt;
        &lt;span class="s"&gt;telemetry:&lt;/span&gt;
          &lt;span class="s"&gt;logs:&lt;/span&gt;
            &lt;span class="s"&gt;level: info&lt;/span&gt;
          &lt;span class="s"&gt;metrics:&lt;/span&gt;
            &lt;span class="s"&gt;address: 0.0.0.0:8888&lt;/span&gt;

      &lt;span class="s"&gt;pipelines:&lt;/span&gt;
        &lt;span class="s"&gt;traces:&lt;/span&gt;
          &lt;span class="s"&gt;receivers: [otlp]&lt;/span&gt;
          &lt;span class="s"&gt;processors: [resourcedetection, batch, memory_limiter]&lt;/span&gt;
          &lt;span class="s"&gt;exporters: [otlphttp/tempo]&lt;/span&gt;

        &lt;span class="s"&gt;metrics:&lt;/span&gt;
          &lt;span class="s"&gt;receivers: [otlp, prometheus]&lt;/span&gt;
          &lt;span class="s"&gt;processors: [resourcedetection, batch, memory_limiter]&lt;/span&gt;
          &lt;span class="s"&gt;exporters: [prometheusremotewrite]&lt;/span&gt;

        &lt;span class="s"&gt;logs:&lt;/span&gt;
          &lt;span class="s"&gt;receivers: [otlp]&lt;/span&gt;
          &lt;span class="s"&gt;processors: [resourcedetection, resource/logs, attributes/logs, batch, memory_limiter]&lt;/span&gt;
          &lt;span class="s"&gt;exporters: [loki]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Iniciar o Serviço
&lt;/h3&gt;

&lt;p&gt;Crie um arquivo de configuração chamado &lt;code&gt;04_start_service.config&lt;/code&gt; para iniciar o serviço do OpenTelemetry Collector.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;start_otel_service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;sudo systemctl start otelcol-contrib&lt;/span&gt;
      &lt;span class="s"&gt;sudo systemctl status otelcol-contrib&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resumo
&lt;/h3&gt;

&lt;p&gt;Esta abordagem garante que o coletor inicie corretamente e comece a enviar dados para o Grafana após o lançamento da instância.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referencia
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/elasticbeanstalk/latest/dg/customize-containers-ec2.html"&gt;https://docs.aws.amazon.com/pt_br/elasticbeanstalk/latest/dg/customize-containers-ec2.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opentelemetry</category>
      <category>otelcoll</category>
      <category>observabilidade</category>
      <category>elasticbeanstalk</category>
    </item>
    <item>
      <title>Stack Grafana deployed on AWS ECS -Part 1 - Create a Cluster</title>
      <dc:creator>Ezzio Moreira</dc:creator>
      <pubDate>Fri, 26 Apr 2024 18:54:01 +0000</pubDate>
      <link>https://forem.com/ezziomoreira/stack-grafana-deployed-on-aws-ecs-part-1-create-a-cluster-b2f</link>
      <guid>https://forem.com/ezziomoreira/stack-grafana-deployed-on-aws-ecs-part-1-create-a-cluster-b2f</guid>
      <description>&lt;p&gt;This post is part of a series about the stack Grafana deployed on AWS ECS. This project is a simple MVP.&lt;/p&gt;

&lt;p&gt;In part 1, we will set up our cluster ECS and LoadBalance. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://aws.amazon.com/ecs/?nc1=h_ls" rel="noopener noreferrer"&gt;AWS ECS&lt;/a&gt;: is a container orchestration that helps us to deploy, manage, and scale applications.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Pre-Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Knowledge with Terraform&lt;/li&gt;
&lt;li&gt;AWS Account

&lt;ul&gt;
&lt;li&gt;2 subnets publics, with tag: &lt;code&gt;tier = public&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;2 subnets private, with tag: &lt;code&gt;tier = private&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  AWS VPC
&lt;/h2&gt;

&lt;p&gt;We need the following structure for AWS VPC. We'll get ID the subnets privates with the Terraform DataSource.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F16z79bv40mkb8qqew87l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F16z79bv40mkb8qqew87l.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember the add tag &lt;code&gt;tier = private&lt;/code&gt; for private subnets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3gde41xr83zl55gn8qnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3gde41xr83zl55gn8qnv.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember the add tag &lt;code&gt;tier = public&lt;/code&gt; for public subnets.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpto6bx0x2iaac337vxzu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpto6bx0x2iaac337vxzu.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ECS Cluster Type
&lt;/h2&gt;

&lt;p&gt;Currently, there are three types of the ECS cluster. Cluster EC2 instance, serverless Fargate, and on-primeses VM. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Consult the AWS documentations for more details. &lt;a href="https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-configuration.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-configuration.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We'll use the ECS EC2 cluster for this MVP. &lt;/p&gt;

&lt;h3&gt;
  
  
  Create ECS Cluster
&lt;/h3&gt;

&lt;p&gt;You can use this Terraform module to create cluster ECS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/EzzioMoreira/aws-terraform-module/releases/tag/v0.0.1-ecs-cluster-alb" rel="noopener noreferrer"&gt;https://github.com/EzzioMoreira/aws-terraform-module/releases/tag/v0.0.1-ecs-cluster-alb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below an example how to use this module. That will provide a cluster ECS type of EC2, and Application LoadBalance.  &lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="c1"&gt;####################################################################################################&lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;### ECS Cluster o11y ###&lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;####################################################################################################&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"ecs_cluster"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;a href="https://github.com/EzzioMoreira/aws-terraform-module//modules/ecs-cluster?ref=v0.0.1-ecs-cluster-alb" rel="noopener noreferrer"&gt;https://github.com/EzzioMoreira/aws-terraform-module//modules/ecs-cluster?ref=v0.0.1-ecs-cluster-alb&lt;/a&gt;"&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="nx"&gt;cluster_name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ecs-cluster-example"&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;min_size&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;max_size&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;desired_size&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3a.medium"&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;vpc_id&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"vpc-xxxxxxxx"&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;created_by&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"terraform"&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;documentation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"null"&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;env&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod"&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;repository&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ezziomoreira/aws-terraform-modules"&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;service&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"observability"&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;team&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sre"&lt;/span&gt;&lt;br&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="c1"&gt;####################################################################################################&lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;### Loadbalance o11y ###&lt;/span&gt;&lt;br&gt;
&lt;span class="c1"&gt;####################################################################################################&lt;/span&gt;&lt;br&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"loadbalance"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;a href="https://github.com/EzzioMoreira/aws-terraform-module//modules/loadbalance?ref=v0.0.1-ecs-cluster-alb" rel="noopener noreferrer"&gt;https://github.com/EzzioMoreira/aws-terraform-module//modules/loadbalance?ref=v0.0.1-ecs-cluster-alb&lt;/a&gt;"&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="nx"&gt;name&lt;/span&gt;               &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ecs-cluster-example-internal"&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;               &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"application"&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;internal&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;subnet_ids&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"subnet-xyxyx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"subnet-yxyxyx"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;security_group_ids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;sg-123123123&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;br&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;created_by&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"terraform"&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;documentation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"null"&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;env&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"prod"&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;repository&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ezziomoreira/aws-terraform-modules"&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;service&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"observability"&lt;/span&gt;&lt;br&gt;
    &lt;span class="nx"&gt;team&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sre"&lt;/span&gt;&lt;br&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  References&lt;br&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/AmazonECS/latest/developerguide/Welcome.html" rel="noopener noreferrer"&gt;AWS Elastic Container Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/terraform/language/modules" rel="noopener noreferrer"&gt;Terraform Modules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>grafana</category>
      <category>observability</category>
      <category>ecs</category>
      <category>aws</category>
    </item>
    <item>
      <title>Siglas da Observabilidade SLI, SLO, SLE, MTTA, MTTR, MTBF e MTTF</title>
      <dc:creator>Ezzio Moreira</dc:creator>
      <pubDate>Fri, 22 Sep 2023 13:56:57 +0000</pubDate>
      <link>https://forem.com/ezziomoreira/siglas-da-observabilidade-sli-slo-sle-mtta-mttr-mtbf-e-mttf-558k</link>
      <guid>https://forem.com/ezziomoreira/siglas-da-observabilidade-sli-slo-sle-mtta-mttr-mtbf-e-mttf-558k</guid>
      <description>&lt;p&gt;Nesta postagem, abordaremos alguns termos relacionados a conceitos cruciais na área de administração de serviços e sistemas, especialmente no que se refere à análise de desempenho e observabilidade. &lt;br&gt;
Essas siglas ajudam a avaliar e melhorar a confiabilidade, disponibilidade e eficiência de sistemas.&lt;br&gt;
As equipes podem estabelecer metas e otimizar processos de reparo e manutenção garantindo serviços de alta qualidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  SLA, SLO e SLI
&lt;/h2&gt;

&lt;p&gt;Conforme mencionado no livro escrito por membros do time SRE do Google &lt;a href="https://sre.google/sre-book/service-level-objectives/"&gt;Site Reliability Engineering&lt;/a&gt;, SLI, SLO e SLA são &lt;strong&gt;indicadores de nível de serviço, objetivo e acordo&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Essas características definem quais métricas são relevantes, quais valores desejamos que essas métricas contenham e como as equipes devem agir caso o serviço não atenda às expectativas dos clientes.&lt;/p&gt;

&lt;h3&gt;
  
  
  SLA: Acordos de Nível de Serviço
&lt;/h3&gt;

&lt;p&gt;É um acordo entre o provedor com clientes, sejam clientes externos ou outras equipes dentro de sua organização. O SLA é um acordo que diz quanto tempo o serviço estará disponível para os clientes e quais são as consequências se o acordo for quebrado. As consequências são facilmente percebidas, quando envolvem penalidades financeiras. &lt;/p&gt;

&lt;h3&gt;
  
  
  SLO: Objetivos de Nível de Serviço
&lt;/h3&gt;

&lt;p&gt;É um acordo para o desempenho de um serviço, baseado no SLI. Por exemplo, 99% das requisições HTTP serão concluídas em menos de 50 ms. O SLO define o que o cliente espera do sistema e quais metas devem ser atingidas pelas equipes de engenharia.&lt;/p&gt;

&lt;h3&gt;
  
  
  SLI: Indicadores de Nível de Serviço
&lt;/h3&gt;

&lt;p&gt;SLIs são métricas usadas na avaliação de SLOs, como latência, taxa de transferência ou taxa de erro que indicam o desempenho do sistema. &lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;

&lt;p&gt;Através do SLI mediremos a disponibilidade de um site, queremos que o site esteja disponível 99,8% do tempo.&lt;/p&gt;

&lt;p&gt;Definiremos um SLO de 99,8%, o que significa que nosso objetivo é manter o site disponível 99,8% do tempo.&lt;/p&gt;

&lt;p&gt;No SLA, documentamos o acordo entre o provedor do sistema e o cliente.&lt;/p&gt;

&lt;p&gt;SLI é a métrica de disponibilidade, o SLO é a meta que queremos alcançar (99,8% de disponibilidade), e o SLA é o acordo que formaliza esse compromisso com os clientes do site.&lt;/p&gt;

&lt;h2&gt;
  
  
  MTTA, MTTR, MTBF e MTTF
&lt;/h2&gt;

&lt;p&gt;O custo de um período de indisponibilidade (downtime) para um sistema pode variar significativamente com base no tipo de negócio, no tamanho da empresa, no setor, entre outros. &lt;/p&gt;

&lt;p&gt;Durante um período de inatividade teremos custos associados como, perda de receita, perda de cliente, custo de recuperação, perda de credibilidade da marca, etc. O MTTA, MTTR, MTBF e MTTF são métricas importantes para gerenciar incidente e confiabilidade, para minimizar o impacto do downtime e melhorar a eficiência das operações.&lt;/p&gt;

&lt;h3&gt;
  
  
  MTTA (Mean Time To Acknowledge) Tempo Médio para Reconhecimento
&lt;/h3&gt;

&lt;p&gt;O MTTA é o tempo médio que levamos para reconhecer uma falha. Isso inclui desde quando a falha ocorreu até o momento em que é ela foi reconhecida e registrada.&lt;/p&gt;

&lt;p&gt;É crucial identificar falhas de forma rápida e reduzir o tempo total de inatividade do sistema. Dessa forma, podemos resolver o problema quanto antes.&lt;/p&gt;

&lt;h3&gt;
  
  
  MTTR (Mean Time To Repair) Tempo Médio para Reparo
&lt;/h3&gt;

&lt;p&gt;O MTTR indica o tempo médio que leva para reparar o sistema ou resolver um problema após o reconhecimento.&lt;/p&gt;

&lt;p&gt;Mostra a eficiência e velocidade com que a equipe resolve problemas e restaurando os serviços para os usuários.&lt;/p&gt;

&lt;h3&gt;
  
  
  MTBF (Mean Time Between Failures) Tempo Médio entre Falhas
&lt;/h3&gt;

&lt;p&gt;É o tempo médio entre falhas de um sistema. Para calcular o MTBF dividimos o tempo total de operação pelo número de falhas ocorridas durante esse período.&lt;/p&gt;

&lt;p&gt;Essa métrica é utilizada para entender a confiabilidade de um sistema e permite planejar manutenções preventivas. &lt;/p&gt;

&lt;h3&gt;
  
  
  MTTF (Mean Time To Failure) Tempo Médio sem Falhas
&lt;/h3&gt;

&lt;p&gt;Mostra quanto tempo um sistema leva para falhar. O MTTF auxilia na compreensão do tempo que o sistema leva para apresentar falhas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A utilização correta de SLIs, SLOs, SLEs, MTTA, MTTR, MTBF e MTTF permite um gerenciamento eficaz dos sistemas, garantindo que os serviços atendam às necessidades e expectativas dos usuários, aumentando a confiabilidade e a disponibilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sre.google/sre-book/service-level-objectives/"&gt;Google Site Reliability Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.datadoghq.com/blog/set-and-monitor-slas/"&gt;Monitoring services and setting SLAs with Datadog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/br/incident-management/kpis/common-metrics"&gt;Atlanssian - MTBF, MTTR, MTTA e MTTF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/blog/opsgenie/measuring-and-evaluating-service-level-objectives"&gt;Opsgenie - Measuring and evaluating Service Level Objectives (SLOs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://allugg.com.br/tecnologia/mtbf-mttr-mtta-mttf-metricas-de-manutencao/"&gt;Allugg - MTBF, MTTR, MTTA e MTTF: Métricas Importantes para Manutenção de Equipamentos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>observability</category>
      <category>monitoring</category>
      <category>sre</category>
    </item>
    <item>
      <title>Conceitos OpenTelemetry</title>
      <dc:creator>Ezzio Moreira</dc:creator>
      <pubDate>Fri, 15 Sep 2023 11:08:04 +0000</pubDate>
      <link>https://forem.com/ezziomoreira/conceitos-opentelemetry-9k0</link>
      <guid>https://forem.com/ezziomoreira/conceitos-opentelemetry-9k0</guid>
      <description>&lt;p&gt;Em 2019, houve a fusão entre dois projetos, &lt;a href="https://opencensus.io/" rel="noopener noreferrer"&gt;OpenCensus&lt;/a&gt; e &lt;a href="https://opentracing.io/" rel="noopener noreferrer"&gt;OpenTracing&lt;/a&gt; que resultou no OpenTelemetry. Os dois projetos queriam resolver um problema comum, definir um padrão para instrumentação, coleta e envio de dados de telemetria para um backend de observabilidade.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opentracing.io/" rel="noopener noreferrer"&gt;OpenTracing&lt;/a&gt; é composto por uma especificação de APIs, permitindo enviar dados de telemetria para um vendor de observabilidade. &lt;br&gt;
&lt;a href="https://opencensus.io/" rel="noopener noreferrer"&gt;OpenCensus&lt;/a&gt; incluía um conjunto de bibliotecas suportada por diversas linguagens para instrumentar código e enviar dados para o backend de observabilidade.&lt;/p&gt;

&lt;p&gt;A combinação dos pontos fortes de cada projeto permite que os usuários resolvam os desafios da observabilidade utilizando um padrão único de bibliotecas, APIs, coleta, processamento e envio de dados de telemetria agnóstico de vendors de observabilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é OpenTelemetry?
&lt;/h2&gt;

&lt;p&gt;É um framework de observabilidade que sustenta um conjunto de APIs, SDKs, agentes e outros elementos que permite gerar, processar e transmitir dados de telemetria de forma unificada e agnóstico ao provedor de observabilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceitos do OpenTelemetry
&lt;/h2&gt;

&lt;p&gt;Antes de começar a usar o OpenTelemetry, é importante entender quais são os principais componentes e terminologias.&lt;/p&gt;

&lt;p&gt;Isso nos ajuda a compreender como funciona o OpenTelemetry.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Existe outros componentes e terminologias que não foram citadas aqui, consulte a &lt;a href="https://opentelemetry.io/docs/concepts/" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; oficial do projeto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O projeto é composto por:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://opentelemetry.io/docs/concepts/signals/" rel="noopener noreferrer"&gt;Signals&lt;/a&gt; (Sinais)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://opentelemetry.io/docs/concepts/instrumentation/" rel="noopener noreferrer"&gt;Instrumentation&lt;/a&gt; (Instrumentação)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://opentelemetry.io/docs/concepts/semantic-conventions/" rel="noopener noreferrer"&gt;Semantic Conventions&lt;/a&gt; (Convenção Semântica)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://opentelemetry.io/docs/concepts/sampling/" rel="noopener noreferrer"&gt;Sampling&lt;/a&gt; (Amostragem)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Signals
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://opentelemetry.io/docs/concepts/signals/metrics/" rel="noopener noreferrer"&gt;Métrica&lt;/a&gt;, &lt;a href="https://opentelemetry.io/docs/concepts/signals/logs/" rel="noopener noreferrer"&gt;log&lt;/a&gt;, &lt;a href="https://opentelemetry.io/docs/concepts/signals/traces/" rel="noopener noreferrer"&gt;trace&lt;/a&gt; e &lt;a href="https://opentelemetry.io/docs/concepts/signals/baggage/" rel="noopener noreferrer"&gt;bagagem&lt;/a&gt; são exemplos de sinais ou tipos de telemetria que formam a estrutura em torno do OpenTelemetry. Cada sinal representa um conjunto lógico e autônomo.&lt;/p&gt;

&lt;p&gt;Esses sinais são importantes para a observabilidade, troubleshooting e monitoramento. Eles auxiliam os engenheiros a entender o que está acontecendo em um sistema, rastrear problemas e tomar decisões mais assertivas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instrumentation
&lt;/h3&gt;

&lt;p&gt;Para tornar um sistema observável, é necessário que ele seja instrumentado. É adicionado um código ao sistema para coletar dados de telemetria. &lt;/p&gt;

&lt;p&gt;Algumas linguagens suportam a &lt;a href="https://opentelemetry.io/docs/concepts/instrumentation/automatic/" rel="noopener noreferrer"&gt;autoinstrumentação&lt;/a&gt;, que provê uma forma de instrumentar seu aplicativo sem alterar o código-fonte do sistema.&lt;/p&gt;

&lt;p&gt;Existem outros mecanismos para instrumentar um sistema, &lt;a href="https://opentelemetry.io/docs/concepts/instrumentation/manual/" rel="noopener noreferrer"&gt;instrumentação manual&lt;/a&gt; e utilizando &lt;a href="https://opentelemetry.io/docs/concepts/instrumentation/libraries/" rel="noopener noreferrer"&gt;bibliotecas&lt;/a&gt; fornecidas pelo projeto OpenTelemtry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Semantic Conventions
&lt;/h3&gt;

&lt;p&gt;A convenção semântica é composto por vários documentos que especificam nomenclaturas comuns para os diferentes tipos de dados. &lt;/p&gt;

&lt;p&gt;Por exemplo, se o servidor &lt;strong&gt;A&lt;/strong&gt; possui uma métrica &lt;code&gt;http.server.duration&lt;/code&gt; e o servidor &lt;strong&gt;B&lt;/strong&gt; uma métrica &lt;code&gt;http.server.request_duration&lt;/code&gt;, como podemos comparar a duração total entre os dois serviços se as métricas têm nomes diferentes? &lt;/p&gt;

&lt;p&gt;A imagem mostra algumas especificações de atributos para Spans de cliente/servidor HTTP.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsv9onuo6dus2ngs4228j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsv9onuo6dus2ngs4228j.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sampling
&lt;/h3&gt;

&lt;p&gt;Através do rastreamento distribuído, podemos observar a latência das requisições que passa entre os serviços. &lt;/p&gt;

&lt;p&gt;No entanto, se a maioria das requisições tem um status bem-sucedido com latência num período previsível, precisamos de todos esses dados? &lt;br&gt;
Nem sempre é necessário um grande volume de dados para encontrar os insights corretos. Você só precisa da amostragem correta desses dados.&lt;/p&gt;

&lt;p&gt;A ideia por trás da amostragem é controlar a quantidade de dados que você envia para o backend de observabilidade, muitas vezes esses provedores de observabilidade cobram por dados ingestados.&lt;/p&gt;

&lt;p&gt;Os principais objetivos da amostragem são: gerenciamento de custos, foco no rastreamento relevantes e filtrar ruídos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Exploramos um pouco da história do OpenTelemetry e podemos entender a origem do projeto. Compreender os conceitos do OpenTelemetry nos auxiliará a superar os desafios para desenvolver observabilidade de alta qualidade.&lt;/p&gt;

&lt;p&gt;Os sinais são compostos por trace, métricas, logs e baggage, os quais geram telemetria. Conhecer as convenções semânticas e a propagação de contexto ajuda na correlação dos eventos entre os sinais, através da amostragem podemos gerenciar os dados que serão enviados para o backend de observabilidade mantendo o foco nos dados relevantes para o sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://opentelemetry.io/docs/what-is-opentelemetry/" rel="noopener noreferrer"&gt;What is OpenTelemetry?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opentelemetry.io/docs/concepts/" rel="noopener noreferrer"&gt;OpenTelemtry Concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opentelemetry.io/docs/concepts/" rel="noopener noreferrer"&gt;https://opentelemetry.io/docs/concepts/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Cloud-Native-Observability-OpenTelemetry-visibility-combining-ebook/dp/B09TTCQBM7" rel="noopener noreferrer"&gt;Cloud-Native Observability with OpenTelemetry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>observability</category>
      <category>opentelemetry</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Três Pilares da Observabilidade</title>
      <dc:creator>Ezzio Moreira</dc:creator>
      <pubDate>Mon, 26 Jun 2023 23:41:54 +0000</pubDate>
      <link>https://forem.com/ezziomoreira/tres-pilares-da-observabilidade-1p6d</link>
      <guid>https://forem.com/ezziomoreira/tres-pilares-da-observabilidade-1p6d</guid>
      <description>&lt;p&gt;Como foi mencionado no texto &lt;a href="https://dev.to/ezziomoreira/observabilidade-e-monitoramento-1p1a"&gt;Observabilidade e Monitoramento&lt;/a&gt;, a observabilidade permite que as equipes atuem com mais rapidez e eficiência nos efeitos e causas geradas por sistemas.&lt;/p&gt;

&lt;p&gt;Para isso, podemos contar com os 3 pilares da observabilidade, métrica, trace e log, no capítulo 4 do ebook &lt;a href="https://unlimited.humio.com/rs/756-LMY-106/images/Distributed-Systems-Observability-eBook.pdf" rel="noopener noreferrer"&gt;Distributed-Systems-Observability&lt;/a&gt;, a autora menciona, que ter acesso à métrica, trace e log não necessariamente torna o sistema mais observável, esses sinais são importantes e se bem compreendidos, podem gerar insights valiosos para melhorar o sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Log
&lt;/h3&gt;

&lt;p&gt;Log é um registro de evento relevante e imutável gerado por sistema computacional ao longo do tempo. Imagine um diário de bordo, onde os navegadores registram os acontecimentos mais importantes de sua jornada mar adentro.&lt;/p&gt;

&lt;p&gt;Os registos de log são considerados um dos elementos fundamentais para qualquer sistema, e todos os registos de log possuem no mínimo 3 características, carimbo de data e hora do momento que o evento foi gerado, uma mensagem que descreve o acontecimento e uma severidade (INFO, WARN, ERROR, EMERGENCY) que classifica o tipo de evento. &lt;br&gt;
Em ambientes distribuídos, os logs podem se tornar complexos devido ao excesso de informações geradas pelos sistemas.&lt;/p&gt;

&lt;p&gt;A grande maioria das equipes adotam padrões e boas práticas para gerenciar eventos de logs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Logs devem ser registrados no formato JSON, é adotado devido à sua estrutura organizada e fácil de analisar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Informações de origem do registro do evento de logs, esse tipo de informação é muito útil em ambientes distribuídos. Segundo a &lt;a href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/overview.md#resources" rel="noopener noreferrer"&gt;documentação do OpenTelemetry&lt;/a&gt;, com esse tipo de abordagem podemos capturar a hierarquia de identificação da entidade que originou o evento. O log deve conter informação que descreve qual é o cluster, host, namespace, pod, contêiner, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;É esperado que toda inicialização e encerramento do sistema seja logado, isso ajuda a identificar possíveis problemas durante o processo de inicialização e encerramento do sistema. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Erros e Exceções, causas não esperadas na lógica do sistema precisam ser registradas. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Correlação de log e trace, segundo a &lt;a href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/overview.md#resources" rel="noopener noreferrer"&gt;documentação do OpenTelemetry&lt;/a&gt;, é uma prática padrão registrar o &lt;a href="https://www.w3.org/TR/trace-context/#trace-context-http-headers-format" rel="noopener noreferrer"&gt;contexto de rastreamento&lt;/a&gt; (IDs de rastreamento e span, bem como &lt;strong&gt;&lt;em&gt;contexto&lt;/em&gt;&lt;/strong&gt;* definido pelo usuário) nos spans. O OpenTelemetry desenvolve essa prática aos logs incluindo TraceId e SpanId nos eventos de log.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification/context" rel="noopener noreferrer"&gt;O que é &lt;strong&gt;&lt;em&gt;contexto&lt;/em&gt;&lt;/strong&gt;*?&lt;/a&gt; são informações importantes do sistema, estado do sistema, configuração, metadados de telemetria e outras informações que ajudam a entender o funcionamento e o comportamento do sistema.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cuidado com dados sensíveis, os registros de log não podem conter dados sensíveis como dados de usuário, chaves de segurança, segredos, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Padrão de atributos de logs, em ambientes distribuídos cada equipe adota uma linguagem de programação para desenvolver seus sistemas. Cada linguagem possui bibliotecas e frameworks para instrumentar log e cada uma pode conter campos e formatos diferentes. Por exemplo, em um sistema desenvolvido em Python o campo http status code pode ser &lt;em&gt;http.status_code&lt;/em&gt; enquanto na linguagem golang esse mesmo campo pode ser &lt;em&gt;http.statuscode&lt;/em&gt;, essas diferenças entre atributos de log pode dificultar pesquisas no vendor de observabilidade. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas são apenas algumas recomendações propostas pela grande maioria dos serviços que coletam, processam, transmitem e armazenam dados de telemetria. É importante salientar que cada organização pode adotar um padrão próprio, conforme o negócio.&lt;/p&gt;

&lt;p&gt;A seguir temos um exemplo de um log em JSON, isso ajuda a entender o modelo de dados dos eventos gerados por sistemas distribuídos. O objetivo do log é registrar, &lt;em&gt;o que aconteceu&lt;/em&gt; e &lt;em&gt;quando aconteceu&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1687520180000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//carimbo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;hora&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;formato&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;epoch&lt;/span&gt;&lt;span class="w"&gt;                             
  &lt;/span&gt;&lt;span class="nl"&gt;"Attributes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//atributos&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;evento&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;gerado&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;pelo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;sistema&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"http.scheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"http.method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"http.status_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"http.url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://rapadura.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"http.target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"/order"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"my.custom.application.tag"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"blablabla"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//informações&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;da&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;origem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;que&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;gerou&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;evento&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"service.name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rapadura-shop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"service.version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"k8s.cluster.name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k8s-cluster-prd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"k8s.namespace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"app-rapadura"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"k8s.pod.uid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1138528c-c36e-11e9-a1a7-42010a800198"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"TraceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"f4dbb3edd765f620"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//informações&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;para&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;correlacionar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ao&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;trace&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"SpanId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"43222c2d51a7abe3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"SeverityText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ERROR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//categoria&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;log&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"SeverityNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"I like rapadura"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//mensagem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;acontecimento&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Trace
&lt;/h3&gt;

&lt;p&gt;Também conhecido como rastreamento, trace ou tracing, possibilita acompanhar o fluxo e a condição de uma transação. Segundo a &lt;a href="https://github.com/open-telemetry/opentelemetry.io/blob/main/content/en/docs/concepts/signals/traces.md" rel="noopener noreferrer"&gt;documentação do OpenTelemetry&lt;/a&gt;, os traces fornece uma visão geral do caminho e o que acontece quando uma solicitação é feita em um sistema.&lt;br&gt;
O trace conta a história da interação entre sistemas distribuídos, uma transação pode interagir com vários sistemas o trace possibilita identificar qual sistema está causando a falha.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7d6ej2p64w5l3bjd8247.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7d6ej2p64w5l3bjd8247.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A imagem acima representa um trace, e cada interação nessa requisição é chamada de span (período), cada trace e cada span possui um identificador único, são conhecidos como traceid e spanid, esses valores serve para identificar as interações na transação. &lt;br&gt;
Na figura é possível perceber que o tempo total dessa requisição foi de 320 milissegundos, bem como quais componentes essa transação interagiu e o tempo de interação.&lt;/p&gt;

&lt;p&gt;Os registros de trace auxiliam as equipes a compreender as dependências entre sistemas, aumento de latência, onde a requisição falhou, o trace ajuda a atribuir um possível problema a um o serviço específico.&lt;/p&gt;

&lt;h3&gt;
  
  
  Métrica
&lt;/h3&gt;

&lt;p&gt;Métrica é uma representação numérica de uma informação em relação ao tempo. As métricas fornecem uma visão geral da integridade do sistema ou ambiente. &lt;/p&gt;

&lt;p&gt;As métricas também são úteis para escalar o ambiente para atender a demanda do sistema, sendo muito utilizados para criar alerta e são mais adequadas para criar dashboards.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9zxpxls85tnzpqwx0f7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9zxpxls85tnzpqwx0f7.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A métrica é composta por um nome da métrica (por exemplo, &lt;code&gt;http_requests_total&lt;/code&gt;), o registro de data e hora (com precisão em milissegundos), pelo valor da métrica (um valor float64) e tags, é a possibilidade de agregação da métrica (por exemplo, solicitações HTTP com método POST).&lt;/p&gt;

&lt;p&gt;Após a coleta, as métricas apresentam maior flexibilidade para cálculos matemáticos, probabilidade, estatistificas, amostragem, etc. Essas características tornam as métricas mais adequadas para demostrar a integridade do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Os três pilares da observabilidade trace, métrica e log são complementares para compreender o comportamento e do desempenho de um sistema. &lt;/p&gt;

&lt;p&gt;Como Brian Knox menciona: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The goal of an Observability team is not to collect logs, metrics, or traces. It is to build a culture of engineering based on facts and feedback, and then spread that culture within the broader organization.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A observabilidade não se limita a trace, log e métrica, trata-se de construir uma cultura onde as equipes sejam guiadas por fatos e comunicação. &lt;/p&gt;

&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md" rel="noopener noreferrer"&gt;OpenTelemetry - Logs Data Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unlimited.humio.com/rs/756-LMY-106/images/Distributed-Systems-Observability-eBook.pdf" rel="noopener noreferrer"&gt;Humio - eBook Free - Distributed Systems Observability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://elven.works/os-3-pilares-da-observabilidade-em-sistemas-distribuidos/" rel="noopener noreferrer"&gt;Elven Works - Os 3 Pilares da Observabilidade em sistemas distribuídos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sre.google/sre-book/monitoring-distributed-systems/" rel="noopener noreferrer"&gt;eBook SRE Google - Chapter 6 - Monitoring Distributed Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coralogix.com/blog/tracing-vs-logging-what-to-know/" rel="noopener noreferrer"&gt;Coralogix - Tracing vs. Logging: What You Need To Know&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/TR/trace-context/#traceparent-header" rel="noopener noreferrer"&gt;W3 - Trace Context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/concepts/data_model" rel="noopener noreferrer"&gt;Prometheus - Data Model&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sre</category>
      <category>observability</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Observabilidade e Monitoramento</title>
      <dc:creator>Ezzio Moreira</dc:creator>
      <pubDate>Tue, 20 Jun 2023 11:54:17 +0000</pubDate>
      <link>https://forem.com/ezziomoreira/observabilidade-e-monitoramento-1p1a</link>
      <guid>https://forem.com/ezziomoreira/observabilidade-e-monitoramento-1p1a</guid>
      <description>&lt;p&gt;&lt;strong&gt;Revisado por&lt;/strong&gt;: &lt;a href="https://www.linkedin.com/in/fernandabarros98/" rel="noopener noreferrer"&gt;Fernanda Santos Barros&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resolver conflitos de serviços entre ambientes distintos, escalar sistemas rapidamente e ter sistemas menos acoplados são alguns dos benefícios de se adotar uma arquitetura de sistemas distribuídos. Tais sistemas possuem uma alta complexidade, necessitando de um esforço adicional para manter a sua arquitetura.&lt;/p&gt;

&lt;p&gt;Em sistemas distribuídos, a questão mais complexa em termos de depuração não é compreender o código em execução, mas sim identificar onde o código com problema está localizado.   &lt;/p&gt;

&lt;p&gt;Pensando nisso, como as equipes poderiam garantir o máximo de confiabilidade desses sistemas?&lt;/p&gt;

&lt;p&gt;Como seria possível identificar rapidamente qual sistema está causando falha ou lentidão no processamento das requisições?&lt;/p&gt;

&lt;p&gt;Como os times poderiam melhorar esses sistemas em um ambiente complexo?&lt;/p&gt;

&lt;p&gt;Sistemas distribuídos podem conter inúmeros serviços em execução, assim, é primordial garantir a confiabilidade e a segurança de todos os recursos.&lt;/p&gt;

&lt;p&gt;Esse formato de sistema possui algumas características importantes, são elas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compartilhamento de recursos&lt;/strong&gt;: conforme o ambiente de execução do microsserviço, pode ocorrer o compartilhamento de recursos. O ambiente Kubernetes pode ser um exemplo, nele ocorre o compartilhamento de CPU, memória, disco, rede e outros.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Processo simultâneo&lt;/strong&gt;: um cluster é composto por diversos hosts; dessa forma um mesmo microsserviço pode existir em diversos hosts ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escalonamento&lt;/strong&gt;: um microsserviço, ou recurso computacional, deve ser capaz de aumentar ou diminuir a sua capacidade conforme a utilização.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resiliência&lt;/strong&gt;: microsserviços são projetados para serem tolerantes à falha.&lt;/p&gt;

&lt;p&gt;Em suma, devido à quantidade de componentes, a complexidade do ambiente e a imprevisibilidade, torna-se evidente a necessidade de utilizar os conceitos e as ferramentas que a engenharia de confiabilidade nos oferece. Sendo assim, é&lt;br&gt;
importante destacar dois conceitos: observabilidade e monitoramento.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é observabilidade?
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Observabilidade é a capacidade de achar repostas para perguntas que ainda não temos: &lt;br&gt;
by &lt;a href="https://twitter.com/jpkrohling" rel="noopener noreferrer"&gt;Juraci Paixão&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A observabilidade nada mais é do que a capacidade de compreender o estado interno de um sistema com base em seu comportamento.&lt;br&gt;
Para um sistema ser considerado minimamente observável é necessário cumprir alguns requisitos, sendo eles: permitir a coleta de logs, métricas e traces distribuídos.&lt;/p&gt;

&lt;p&gt;Observabilidade é a capacidade de preservar o máximo de contexto possível em torno de qualquer solicitação, permitindo a reconstrução do ambiente e das circunstâncias que provocaram um novo ponto de falha.&lt;/p&gt;

&lt;p&gt;Conforme essa definição, alguns pontos que podem surgir em um sistema observável: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Por qual motivo esse(s) cliente(s) apresenta(am) uma alta latência nas requisições do sistema X?&lt;/li&gt;
&lt;li&gt;Quais são os serviços envolvidos em uma transação específica?&lt;/li&gt;
&lt;li&gt;Quais são os impactos de uma alteração no ecossistema de microserviço? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os engenheiros que praticam a observabilidade conseguem questionar o sistema fazendo perguntas exploratórias, usando as respostas para conduzir a outras investigações. &lt;/p&gt;

&lt;p&gt;Essas simples perguntas auxiliam no processo de investigação da causa raiz de possíveis problemas e permitem a obtenção de insights sobre o comportamento dos sistemas. Tais questionamentos podem ser realizados em diferentes estágios do ciclo de vida do sistema, de acordo com o contexto da situação enfrentada.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é o monitoramento?
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Monitoramento é a prática de obter resposta rápida para perguntas frequentes.&lt;br&gt;
by &lt;a href="https://twitter.com/jpkrohling" rel="noopener noreferrer"&gt;Juraci Paixão&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O monitoramento se concentra em coletar e analisar dados de telemetria, visando garantir o desempenho e a disponibilidade do sistema.&lt;/p&gt;

&lt;p&gt;O monitoramento tradicional é totalmente reativo, e se concentra em métrica, alerta e dashboards. Dashboard repleta de gráficos, e talvez não sabemos o que todos os gráficos realmente dizem. &lt;/p&gt;

&lt;p&gt;Seguindo esse conceito, um sistema monitorado é capaz de produzir respostas para várias perguntas previamente conhecidas. Dentre elas, temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como estão os níveis de consumo de recursos computacional (CPU, memória, disco, rede)?&lt;/li&gt;
&lt;li&gt;Quais são as taxas de erros da última hora?&lt;/li&gt;
&lt;li&gt;Qual é o tempo médio das requisições?&lt;/li&gt;
&lt;li&gt;Existe algum alerta ativo? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As respostas para esses questionamentos nos permitem determinar, em tempo real, qual o estado do sistema e como está sendo o seu desempenho. Essas informações são cruciais em análises de causa raiz e na definição de ações corretivas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;O monitoramento é para os desconhecidos conhecidos, a observabilidade é para os desconhecidos. &lt;/p&gt;

&lt;p&gt;Monitoramento e observabilidade são conceitos que se complementam para garantir um sistema confiável. O primeiro nos fornece uma abordagem mais reativa, com base em números concretos, enquanto o outro nos permite realizar uma análise mais profunda e estratégica do sistema e do negócio.&lt;br&gt;
Com essa união, torna-se possível que as equipes de operações e engenharia atuem com mais rapidez e eficiência nas inconsistências que ocorrem durante a utilização de sistemas distribuídos. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrq996y71zwtxy5vakcn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrq996y71zwtxy5vakcn.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Referências:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/br/microservices/microservices-architecture/distributed-architecture" rel="noopener noreferrer"&gt;Qual é a diferença entre um sistema centralizado e um distribuído?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sre.google/workbook/monitoring/" rel="noopener noreferrer"&gt;eBook Free - Monitoring - Google SRE Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unlimited.humio.com/rs/756-LMY-106/images/Distributed-Systems-Observability-eBook.pdf" rel="noopener noreferrer"&gt;eBook Free - Distributed Systems Observability&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sre</category>
      <category>observability</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Controle de fluxo com Python</title>
      <dc:creator>Ezzio Moreira</dc:creator>
      <pubDate>Wed, 31 May 2023 23:40:25 +0000</pubDate>
      <link>https://forem.com/ezziomoreira/controle-de-fluxo-if-else-com-python-36lf</link>
      <guid>https://forem.com/ezziomoreira/controle-de-fluxo-if-else-com-python-36lf</guid>
      <description>&lt;p&gt;Na ciência da computação, estrutura de seleção (ou expressão condicional, ou construção condicional) é uma estrutura de desvio do fluxo de controle presente em linguagens de programação que realiza diferentes ações dependendo se a condição é verdadeira ou falsa, a expressão é processada e transformada em um valor booleano.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comando if
&lt;/h3&gt;

&lt;p&gt;O controle de fluxo em Python é realizado por meio de estruturas condicionais, como o &lt;code&gt;if&lt;/code&gt; e o &lt;code&gt;else&lt;/code&gt;. Essas estruturas permitem que você execute diferentes blocos de código com base em condições específicas.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo básico de controle de fluxo em Python usando &lt;code&gt;if&lt;/code&gt; e &lt;code&gt;else&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A condição 3 é maior que 2, é verdadeira?

&lt;ul&gt;
&lt;li&gt;Se sim, imprima &lt;code&gt;Funciona!&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Se não, imprima &lt;code&gt;3 é maior que 2&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Funciona!'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'3 é maior que 2'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perceba que existe uma edentação de quatro espaços do no print em relação ao &lt;code&gt;if&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;É possível utilizar o &lt;code&gt;elif&lt;/code&gt; (abreviação de "else if") para verificar múltiplas condições em uma estrutura condicional. &lt;/p&gt;

&lt;p&gt;Veja um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Digite sua idade: "&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Voto não permitido!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Voto obrigatório!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Voto opcional!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo, o Python espera que usuário entre com um valor que representa sua idade.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se, a idade for menor que 16.

&lt;ul&gt;
&lt;li&gt;Imprima, &lt;code&gt;Voto não permitido!&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Senão, idade for maior ou igual a 16 e menos ou igual a 65 anos.

&lt;ul&gt;
&lt;li&gt;Imprima &lt;code&gt;Voto obrigatório!&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Outro, se as condições &lt;code&gt;if&lt;/code&gt; e &lt;code&gt;elfi&lt;/code&gt; forem falsas.

&lt;ul&gt;
&lt;li&gt;Imprima, &lt;code&gt;Voto opcional!&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
    </item>
    <item>
      <title>Observability in Kong API Gateway</title>
      <dc:creator>Ezzio Moreira</dc:creator>
      <pubDate>Wed, 31 May 2023 11:03:30 +0000</pubDate>
      <link>https://forem.com/ezziomoreira/observability-in-kong-api-gateway-49oa</link>
      <guid>https://forem.com/ezziomoreira/observability-in-kong-api-gateway-49oa</guid>
      <description>&lt;p&gt;This article explains some points about monitoring and observability of the Kong API Gateway system through the three pillars of observability: metrics, trace, and logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metrics
&lt;/h2&gt;

&lt;p&gt;Kong has the Prometheus plugin, which exports service metrics through the endpoint &lt;a href="http://endpoint-kong:8001/metrics" rel="noopener noreferrer"&gt;http://endpoint-kong:8001/metrics&lt;/a&gt;. These metrics provide insight into the performance of the service.&lt;/p&gt;

&lt;p&gt;To configure metric collection: &lt;a href="https://docs.konghq.com/hub/kong-inc/prometheus/" rel="noopener noreferrer"&gt;https://docs.konghq.com/hub/kong-inc/prometheus/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2c1xhsfo0fo60bkkecn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2c1xhsfo0fo60bkkecn.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Trace
&lt;/h2&gt;

&lt;p&gt;Kong has the OpenTelemetry plugin, which sends trace and spans generated by the service to an HTTP or gRPC endpoint of the OpenTelemetry collector. The OpenTelemetry collector receives this data, processes it, and sends it to the vendor for observability.&lt;/p&gt;

&lt;p&gt;It is necessary to declare the environment variable KONG_OPENTELEMETRY_TRACING: all, to enable OTEL tracing on Kong, another imported variable is KONG_OPENTELEMETRY_TRACING_SAMPLING_RATE: 1.0, which defines the proportion of traces sample collected and sent to the vendor of observability.&lt;/p&gt;

&lt;p&gt;To configure trace collection: &lt;a href="https://docs.konghq.com/hub/kong-inc/opentelemetry/" rel="noopener noreferrer"&gt;https://docs.konghq.com/hub/kong-inc/opentelemetry/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6k3o33w5tzp0xc1e9ine.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6k3o33w5tzp0xc1e9ine.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Logs
&lt;/h2&gt;

&lt;p&gt;Kong offers many plugins for collecting, processing, and sending logs. I can recommend using a Fluentbit sidecar for collecting these logs and send to an observability provider.&lt;/p&gt;

&lt;p&gt;It is possible to use the NGINX HTTP logs module to help us define which attributes will be added to the logs.&lt;/p&gt;

&lt;p&gt;Module ngx_http_log_module: &lt;a href="http://nginx.org/en/docs/http/ngx_http_log_module.html" rel="noopener noreferrer"&gt;http://nginx.org/en/docs/http/ngx_http_log_module.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To configure logs collection: &lt;a href="https://docs.konghq.com/hub/?category=logging" rel="noopener noreferrer"&gt;https://docs.konghq.com/hub/?category=logging&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdeg4gvs2q9b2ei4nfqx3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdeg4gvs2q9b2ei4nfqx3.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>kong</category>
      <category>apigateway</category>
    </item>
    <item>
      <title>Operadores em Python</title>
      <dc:creator>Ezzio Moreira</dc:creator>
      <pubDate>Wed, 31 May 2023 10:53:41 +0000</pubDate>
      <link>https://forem.com/ezziomoreira/operadores-em-python-5574</link>
      <guid>https://forem.com/ezziomoreira/operadores-em-python-5574</guid>
      <description>&lt;p&gt;Em Python existe uma grande variedade de operadores lógicos, operadores são símbolos que representa uma expressão, soma, multiplicação, maior, menor ou igual, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operadores Aritméticos
&lt;/h3&gt;

&lt;p&gt;Python suporta cálculos matemáticos mistos de forma simples.&lt;/p&gt;

&lt;p&gt;Exemplos de expressões matemáticas em Python.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operador&lt;/th&gt;
&lt;th&gt;Nome&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;x + y&lt;/td&gt;
&lt;td&gt;Adição&lt;/td&gt;
&lt;td&gt;Realiza a soma de x e y.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x - y&lt;/td&gt;
&lt;td&gt;Subtração&lt;/td&gt;
&lt;td&gt;Realiza a subtração de x e y.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x * y&lt;/td&gt;
&lt;td&gt;Multiplicação&lt;/td&gt;
&lt;td&gt;Realiza a multiplicação de x e y.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x / y&lt;/td&gt;
&lt;td&gt;Divisão&lt;/td&gt;
&lt;td&gt;Realiza a divisão de x e y.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x % y&lt;/td&gt;
&lt;td&gt;Resto&lt;/td&gt;
&lt;td&gt;Retorna o resto da divisão de x e y.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x ** y&lt;/td&gt;
&lt;td&gt;Exponencial&lt;/td&gt;
&lt;td&gt;Retorna o resultado de x elevado a y.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Utilização de cada operador aritmético:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Soma (+):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;soma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: 8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Subtração (-):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;subtracao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subtracao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: 2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Multiplicação (*):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;multiplicacao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;multiplicacao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: 15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Divisão (/):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;divisao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;divisao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: 1.6666666666666667
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Divisão inteira (//):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;divisao_inteira&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;divisao_inteira&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: 1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resto da divisão (%) ou módulo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;resto_divisao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resto_divisao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: 2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Potência (&lt;/strong&gt;):**&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;potencia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;potencia&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: 8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Operadores de Comparação
&lt;/h3&gt;

&lt;p&gt;Existe oito operadores de comparação no Python, comparações podem ser encadeadas arbitrariamente; por exemplo, x &amp;lt; y &amp;lt;= z é equivalente a x &amp;lt; y and y &amp;lt;= z.&lt;/p&gt;

&lt;p&gt;Operadores de comparação em Python.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operador&lt;/th&gt;
&lt;th&gt;Nome&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;==&lt;/td&gt;
&lt;td&gt;Igual a&lt;/td&gt;
&lt;td&gt;True se um valor é igual ao outro.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;!=&lt;/td&gt;
&lt;td&gt;Diferente de&lt;/td&gt;
&lt;td&gt;True se um valor é diferente ao outro.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;&lt;/td&gt;
&lt;td&gt;Maior que&lt;/td&gt;
&lt;td&gt;True se um valor é maior que outro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;=&lt;/td&gt;
&lt;td&gt;Maior ou Igual&lt;/td&gt;
&lt;td&gt;True se um valor é maior ou igual ao outro.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;&lt;/td&gt;
&lt;td&gt;Menor que&lt;/td&gt;
&lt;td&gt;True se um valor é menor que outro.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;=&lt;/td&gt;
&lt;td&gt;Menor ou Igual&lt;/td&gt;
&lt;td&gt;True se um valor é menor ou igual ao outro.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Utilização de cada operador comparação:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Igual (==):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Diferente (!=):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: True
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Maior que (&amp;gt;):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: True
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Menor que (&amp;lt;):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Maior ou igual que (&amp;gt;=):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: True
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Menor ou igual que (&amp;lt;=):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Operadores Lógicos
&lt;/h3&gt;

&lt;p&gt;Os operadores lógicos servem para unir duas ou mais expressões. Isso é feito utilizando as palavras reservadas AND (e), OR (ou) e NOT (não).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operador&lt;/th&gt;
&lt;th&gt;Nome&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;and&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;Retorna True se as duas expressões forem verdadeiras&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;or&lt;/td&gt;
&lt;td&gt;OU&lt;/td&gt;
&lt;td&gt;Retorna True se uma das expressões for verdadeira&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;not&lt;/td&gt;
&lt;td&gt;NÃO&lt;/td&gt;
&lt;td&gt;Inverte o resultado da expressão&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Utilização de cada operador lógicos:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: False
&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Saída: True
&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# Saída: False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Operadores em Python são símbolos especiais que realizam operações em valores ou variáveis. Eles permitem realizar cálculos, comparações e operações lógicas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3/"&gt;Documentação Python 3 - Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3/library/stdtypes.html#"&gt;Operadores - Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3/reference/expressions.html"&gt;Expressões - Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
    </item>
  </channel>
</rss>
