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

# Connectors

> OpenTelemetry Connectors components

export const ComponentList = ({items, type, columns}) => {
  const [search, setSearch] = React.useState("");
  const filtered = items.filter(item => item.name.toLowerCase().includes(search.toLowerCase()));
  const badgeColors = {
    stable: {
      bg: "rgba(34, 197, 94, 0.1)",
      text: "#16a34a",
      darkBg: "rgba(34, 197, 94, 0.15)",
      darkText: "#4ade80"
    },
    beta: {
      bg: "rgba(234, 179, 8, 0.1)",
      text: "#a16207",
      darkBg: "rgba(234, 179, 8, 0.15)",
      darkText: "#facc15"
    },
    alpha: {
      bg: "rgba(239, 68, 68, 0.1)",
      text: "#dc2626",
      darkBg: "rgba(239, 68, 68, 0.15)",
      darkText: "#f87171"
    },
    development: {
      bg: "rgba(249, 115, 22, 0.1)",
      text: "#c2410c",
      darkBg: "rgba(249, 115, 22, 0.15)",
      darkText: "#fb923c"
    },
    deprecated: {
      bg: "rgba(156, 163, 175, 0.1)",
      text: "#6b7280",
      darkBg: "rgba(156, 163, 175, 0.15)",
      darkText: "#9ca3af"
    },
    unknown: {
      bg: "rgba(156, 163, 175, 0.1)",
      text: "#6b7280",
      darkBg: "rgba(156, 163, 175, 0.15)",
      darkText: "#9ca3af"
    }
  };
  const StabilityBadge = ({level}) => {
    const colors = badgeColors[level] || badgeColors.unknown;
    return <span className="stability-badge" data-level={level} style={{
      display: "inline-block",
      padding: "0.125rem 0.5rem",
      borderRadius: "9999px",
      fontSize: "0.75rem",
      fontWeight: 500,
      lineHeight: "1.25rem",
      backgroundColor: colors.bg,
      color: colors.text
    }}>
        {level}
      </span>;
  };
  const stabilityLabel = levels => {
    if (!levels || levels.length === 0) return <span style={{
      color: "#6b7280"
    }}>-</span>;
    return <span style={{
      display: "flex",
      gap: "0.25rem",
      flexWrap: "wrap",
      justifyContent: "center"
    }}>
        {levels.map(level => <StabilityBadge key={level} level={level} />)}
      </span>;
  };
  const hasCol = col => columns.includes(col);
  return <div>
      <style>{`
        .dark .stability-badge[data-level="stable"] { background-color: ${badgeColors.stable.darkBg} !important; color: ${badgeColors.stable.darkText} !important; }
        .dark .stability-badge[data-level="beta"] { background-color: ${badgeColors.beta.darkBg} !important; color: ${badgeColors.beta.darkText} !important; }
        .dark .stability-badge[data-level="alpha"] { background-color: ${badgeColors.alpha.darkBg} !important; color: ${badgeColors.alpha.darkText} !important; }
        .dark .stability-badge[data-level="development"] { background-color: ${badgeColors.development.darkBg} !important; color: ${badgeColors.development.darkText} !important; }
        .dark .stability-badge[data-level="deprecated"] { background-color: ${badgeColors.deprecated.darkBg} !important; color: ${badgeColors.deprecated.darkText} !important; }
        .dark .stability-badge[data-level="unknown"] { background-color: ${badgeColors.unknown.darkBg} !important; color: ${badgeColors.unknown.darkText} !important; }
      `}</style>
      <div className="group/search" style={{
    position: "relative",
    marginBottom: "1.5rem"
  }}>
        <svg style={{
    position: "absolute",
    left: "0.75rem",
    top: "50%",
    transform: "translateY(-50%)",
    width: "1rem",
    height: "1rem",
    color: "#9ca3af",
    pointerEvents: "none"
  }} fill="none" stroke="currentColor" viewBox="0 0 24 24">
          <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
        </svg>
        <input type="text" placeholder={`Search ${items.length} ${type.toLowerCase()}...`} value={search} onChange={e => setSearch(e.target.value)} style={{
    width: "100%",
    padding: "0.5rem 0.75rem 0.5rem 2.25rem",
    borderRadius: "4px",
    border: "1px solid var(--border-color, #e5e7eb)",
    backgroundColor: "transparent",
    color: "inherit",
    fontSize: "0.875rem",
    outline: "none"
  }} />
      </div>
      <div style={{
    overflowX: "auto"
  }}>
        <table style={{
    width: "100%",
    borderCollapse: "collapse",
    fontSize: "0.875rem"
  }}>
          <thead>
            <tr>
              <th style={{
    textAlign: "left",
    padding: "0.5rem 0.75rem",
    fontWeight: 600,
    whiteSpace: "nowrap"
  }}>Name</th>
              {hasCol("distributions") && <th style={{
    textAlign: "left",
    padding: "0.5rem 0.75rem",
    fontWeight: 600
  }}>Distributions</th>}
              {hasCol("stability") && <th style={{
    textAlign: "center",
    padding: "0.5rem 0.75rem",
    fontWeight: 600
  }}>Stability</th>}
              {hasCol("traces") && <th style={{
    textAlign: "center",
    padding: "0.5rem 0.75rem",
    fontWeight: 600
  }}>Traces</th>}
              {hasCol("metrics") && <th style={{
    textAlign: "center",
    padding: "0.5rem 0.75rem",
    fontWeight: 600
  }}>Metrics</th>}
              {hasCol("logs") && <th style={{
    textAlign: "center",
    padding: "0.5rem 0.75rem",
    fontWeight: 600
  }}>Logs</th>}
            </tr>
          </thead>
          <tbody>
            {filtered.map(item => <tr key={item.slug}>
                <td style={{
    padding: "0.5rem 0.75rem",
    whiteSpace: "nowrap"
  }}>
                  <a href={item.slug} style={{
    textDecoration: "none",
    color: "inherit",
    fontWeight: 500
  }}>
                    {item.name}
                  </a>
                </td>
                {hasCol("distributions") && <td style={{
    padding: "0.5rem 0.75rem",
    fontSize: "0.8125rem"
  }}>
                    {item.distributions && item.distributions.length > 0 ? <span style={{
    display: "flex",
    gap: "0.25rem",
    flexWrap: "wrap"
  }}>
                          {item.distributions.map(d => <span key={d} style={{
    display: "inline-block",
    padding: "0.125rem 0.5rem",
    borderRadius: "9999px",
    fontSize: "0.75rem",
    fontWeight: 500,
    backgroundColor: "rgba(156, 163, 175, 0.1)",
    color: "#6b7280"
  }}>
                              {d}
                            </span>)}
                        </span> : <span style={{
    color: "#6b7280"
  }}>-</span>}
                  </td>}
                {hasCol("stability") && <td style={{
    textAlign: "center",
    padding: "0.5rem 0.75rem"
  }}>
                    {stabilityLabel(item.stability ? [item.stability] : [])}
                  </td>}
                {hasCol("traces") && <td style={{
    textAlign: "center",
    padding: "0.5rem 0.75rem"
  }}>
                    {stabilityLabel(item.traces)}
                  </td>}
                {hasCol("metrics") && <td style={{
    textAlign: "center",
    padding: "0.5rem 0.75rem"
  }}>
                    {stabilityLabel(item.metrics)}
                  </td>}
                {hasCol("logs") && <td style={{
    textAlign: "center",
    padding: "0.5rem 0.75rem"
  }}>
                    {stabilityLabel(item.logs)}
                  </td>}
              </tr>)}
          </tbody>
        </table>
      </div>
      {filtered.length === 0 && <p style={{
    color: "#9ca3af",
    textAlign: "center",
    marginTop: "2rem"
  }}>
          No {type.toLowerCase()} found matching "{search}"
        </p>}
    </div>;
};

<ComponentList items={[{"name":"Count","slug":"/components/connector/countconnector","status":"alpha","distributions":["contrib","k8s"],"stability":"alpha","traces":[],"metrics":[],"logs":[]},{"name":"Datadog","slug":"/components/connector/datadogconnector","status":"beta","distributions":["contrib"],"stability":"beta","traces":[],"metrics":[],"logs":[]},{"name":"Exceptions","slug":"/components/connector/exceptionsconnector","status":"alpha","distributions":["contrib","k8s"],"stability":"alpha","traces":[],"metrics":[],"logs":[]},{"name":"Failover","slug":"/components/connector/failoverconnector","status":"alpha","distributions":["contrib","k8s"],"stability":"alpha","traces":[],"metrics":[],"logs":[]},{"name":"Grafanacloud","slug":"/components/connector/grafanacloudconnector","status":"alpha","distributions":["contrib"],"stability":"alpha","traces":[],"metrics":[],"logs":[]},{"name":"Metricsaslogs","slug":"/components/connector/metricsaslogsconnector","status":"development","distributions":[],"stability":"development","traces":[],"metrics":[],"logs":[]},{"name":"Otlpjson","slug":"/components/connector/otlpjsonconnector","status":"alpha","distributions":["contrib","k8s"],"stability":"alpha","traces":[],"metrics":[],"logs":[]},{"name":"Roundrobin","slug":"/components/connector/roundrobinconnector","status":"beta","distributions":["contrib","k8s"],"stability":"beta","traces":[],"metrics":[],"logs":[]},{"name":"Routing","slug":"/components/connector/routingconnector","status":"alpha","distributions":["contrib","k8s"],"stability":"alpha","traces":[],"metrics":[],"logs":[]},{"name":"Servicegraph","slug":"/components/connector/servicegraphconnector","status":"alpha","distributions":["contrib","k8s"],"stability":"alpha","traces":[],"metrics":[],"logs":[]},{"name":"Signaltometrics","slug":"/components/connector/signaltometricsconnector","status":"alpha","distributions":["contrib"],"stability":"alpha","traces":[],"metrics":[],"logs":[]},{"name":"Slowsql","slug":"/components/connector/slowsqlconnector","status":"development","distributions":[],"stability":"development","traces":[],"metrics":[],"logs":[]},{"name":"Spanmetrics","slug":"/components/connector/spanmetricsconnector","status":"alpha","distributions":["contrib"],"stability":"alpha","traces":[],"metrics":[],"logs":[]},{"name":"Sum","slug":"/components/connector/sumconnector","status":"alpha","distributions":["contrib"],"stability":"alpha","traces":[],"metrics":[],"logs":[]}]} columns={["distributions"]} type="Connectors" />
