> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Ruby VM

export const VersionRequirements = ({versions = []}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const boundaries = {
    upper: " or lower",
    exact: "",
    lower: " or higher"
  };
  const containerStyle = {
    marginTop: "0.5rem",
    marginBottom: "1.5rem"
  };
  const lineStyle = {
    display: "block",
    margin: "0 0 0.35rem 0",
    fontSize: "0.875rem",
    lineHeight: "1.4"
  };
  const pillBaseStyle = {
    display: "inline-block",
    padding: "0.1em 0.4em",
    borderRadius: "0.25rem",
    border: "1px solid",
    fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
    fontSize: "0.85em",
    fontWeight: 500
  };
  const pillColors = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#e9d5ff",
      color: "#9333ea"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#99f6e4",
      color: "#0d9488"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#bbf7d0",
      color: "#16a34a"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#bfdbfe",
      color: "#2563eb"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fecaca",
      color: "#dc2626"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fed7aa",
      color: "#ea580c"
    }
  };
  const defaultPillColor = {
    background: "#f4f4f5",
    borderColor: "#e4e4e7",
    color: "#52525b"
  };
  const getPillStyle = name => ({
    ...pillBaseStyle,
    ...pillColors[name] || defaultPillColor
  });
  const getBoundText = bound => {
    return boundaries[bound] || boundaries.lower;
  };
  return <div style={containerStyle}>
      {versions.map((v, i) => <p key={`${v.name}-${v.version}-${v.bound || "lower"}-${i}`} style={lineStyle}>
          This feature requires{" "}
          <code style={getPillStyle(v.name)}>{v.name}</code> version {v.version}
          {getBoundText(v.bound)}.
        </p>)}
    </div>;
};

<VersionRequirements
  versions={[
{ name: "AppSignal for Ruby", version: "3.3.9" },
{ name: "Ruby", version: "3.2" }
]}
/>

A Ruby VM (Máquina Virtual) agenda threads Ruby para execução. Em qualquer ponto, apenas uma thread por vez pode interagir com o estado da Ruby VM.

O AppSignal suporta a Ruby VM prontamente. Quando o AppSignal detecta métricas da Ruby VM, ele criará um [Magic Dashboard](#magic-dashboard), permitindo que você monitore métricas principais visualmente.

## Magic dashboards

Os magic dashboards aparecerão na seção de dashboard do app AppSignal.

<img src="https://mintcdn.com/appsignal-715f5a51/4TRZP0Sq9Zq7PAPW/assets/images/screenshots/ruby/integrations/ruby-vm/dashboard-created.png?fit=max&auto=format&n=4TRZP0Sq9Zq7PAPW&q=85&s=fae0dd2e21d593846e3567eeef14efe1" alt="Criação do magic dashboard da Ruby VM" width="2548" height="1430" data-path="assets/images/screenshots/ruby/integrations/ruby-vm/dashboard-created.png" />

O magic dashboard da Ruby VM terá os seguintes gráficos:

| Gráfico                                                     | Métricas                                                                                                                        | Tags                                 |
| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
| [Allocated objects](#allocated-objects-graph)               | `allocated_objects`                                                                                                             | `hostname`                           |
| [Garbage Collection Count](#garbage-collection-count-graph) | <li>`minor_gc_count`</li> <li>`minor_gc_count`</li> <li>`gc_count`</li>                                                         | <li>`metric`</li><li>`hostname`</li> |
| [Heap slots](#heap-slots-graph)                             | <li>`heap_live`</li> <li>`heap_free`</li>                                                                                       | <li>`metric`</li><li>`hostname`</li> |
| [Ruby VM](#ruby-vm-graph)                                   | <li>`class_serial`</li><li>`global_constant_state`</li><li>`constant_cache_invalidations`</li><li> `constant_cache_misses`</li> | <li>`metric`</li><li>`hostname`</li> |
| [Thread count](#thread-count-graph)                         | `thread_count`                                                                                                                  | `hostname`                           |

As tags fornecem um detalhamento contextual das informações de performance da Ruby VM. O AppSignal reporta as seguintes tags para performance da Ruby VM:

| Nome       | Descrição                                       |
| ---------- | ----------------------------------------------- |
| `hostname` | O nome do host do qual a métrica foi reportada. |
| `metric`   | O valor total da métrica para todos os hosts.   |

O AppSignal representará cada tag com uma linha colorida no gráfico:

<img src="https://mintcdn.com/appsignal-715f5a51/4TRZP0Sq9Zq7PAPW/assets/images/screenshots/ruby/integrations/ruby-vm/gc-count-graph.png?fit=max&auto=format&n=4TRZP0Sq9Zq7PAPW&q=85&s=2aea582a012bc62c561298e9c97a992d" alt="Exemplo de gráfico do magic dashboard da Ruby VM" width="1432" height="672" data-path="assets/images/screenshots/ruby/integrations/ruby-vm/gc-count-graph.png" />

### Gráfico Allocated objects

O gráfico Allocated objects mostra quantos valores Ruby complexos (objetos, não strings, inteiros, booleanos, etc.) estão usando memória na máquina virtual Ruby.

Você pode usar o gráfico Allocated objects para monitorar e otimizar o uso de memória e a performance da sua aplicação.

### Gráfico Garbage collection count

O gráfico de contagens de GC mostra a quantidade de eventos/execuções de garbage collection durante o último minuto, dividida entre eventos major e minor.

Você pode usar o gráfico de contagens de GC para monitorar a frequência do garbage collection e seu impacto na performance e no uso de memória da sua aplicação.

### Gráfico Heap slots

O gráfico Heap slots mostra os heap slots atualmente alocados pela máquina virtual Ruby, divididos entre slots live e free.

Você pode usar o gráfico Heap slots para monitorar a alocação de memória e identificar as causas potenciais de memory leaks ou fragmentação.

### Gráfico Ruby VM

<Warning>
  As métricas `constant_cache_misses` e `constant_cache_invalidations` estão
  disponíveis apenas nas versões Ruby 3.2.0 e superiores.
</Warning>

O gráfico Ruby VM mostra estatísticas do método RubyVM.stat sobre o constant cache e as classes criadas na sua aplicação.

Você pode usar o gráfico Ruby VM para monitorar o status do cache de valores constantes e como sua aplicação afeta o estado da Ruby VM.

### Gráfico Thread count

O gráfico Thread count mostra o número de threads atualmente executando na sua aplicação.

Você pode usar o gráfico Thread count para monitorar o threading da sua aplicação. O Ruby VM Lock executa serialmente, o que significa que pode executar apenas uma thread por vez. Uma alta contagem de threads pode levar a problemas de performance.
