alicloud-observability-openclaw-sls-integration

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

OpenClaw SLS Integration

OpenClaw SLS 集成配置

This skill provisions Alibaba Cloud SLS observability for OpenClaw on Linux and keeps reruns safe.
At a high level, execute this flow:
  1. Check and install
    aliyun
    CLI (install latest when missing)
  2. Install
    LoongCollector
    by project region (skip if already running)
  3. Create an identifier-based machine group (local identifier + cloud machine group)
  4. Create
    logstore
    index and dashboards
  5. Create
    logstore
    collection config
  6. Bind the collection config to the machine group

本指南用于在Linux环境下为OpenClaw配置阿里云SLS可观测性能力,且所有操作支持重复执行(幂等性)。
整体执行流程如下:
  1. 检查并安装
    aliyun
    CLI(若未安装则安装最新版本)
  2. 根据项目地域安装
    LoongCollector
    (若已运行则跳过)
  3. 创建基于自定义标识的机器组(本地标识 + 云端机器组)
  4. 创建
    logstore
    索引和仪表盘
  5. 创建
    logstore
    采集配置
  6. 将采集配置绑定到机器组

Capture Intent Before Execution

执行前确认需求

Before running commands, make sure the user intent is complete:
  1. Confirm the target
    PROJECT
    and
    LOGSTORE
    .
  2. Confirm Linux host access with
    sudo
    available.
  3. Confirm AK/SK are already exported in environment variables.
  4. If any required input is missing, ask for it first and do not run partial setup.

在执行命令前,请确保用户的需求信息完整:
  1. 确认目标
    PROJECT
    LOGSTORE
    名称。
  2. 确认Linux主机拥有
    sudo
    权限。
  3. 确认环境变量中已配置AK/SK。
  4. 若缺少任何必要输入,请先向用户询问,不要执行部分配置步骤。

Prerequisites

前置条件

Required:
  • PROJECT
    : SLS project name
  • LOGSTORE
    : SLS logstore name
Read from environment variables:
  • ALIBABA_CLOUD_ACCESS_KEY_ID
  • ALIBABA_CLOUD_ACCESS_KEY_SECRET
  • ALIYUN_UID
    (used for the local UID file under
    /etc/ilogtail/users
    )
Recommended optional:
  • ALIBABA_CLOUD_REGION_ID
    (auto-resolved from
    PROJECT
    when not set)
If you use different AK/SK variable names, export them to these standard names first.

必填项:
  • PROJECT
    : SLS项目名称
  • LOGSTORE
    : SLS日志库名称
从环境变量读取:
  • ALIBABA_CLOUD_ACCESS_KEY_ID
  • ALIBABA_CLOUD_ACCESS_KEY_SECRET
  • ALIYUN_UID
    (用于
    /etc/ilogtail/users
    目录下的本地UID文件)
推荐可选配置:
  • ALIBABA_CLOUD_REGION_ID
    (未设置时将从
    PROJECT
    自动解析)
若您使用的AK/SK变量名不同,请先将其导出为上述标准变量名。

Expected Result

预期结果

After successful execution, the environment should contain:
  • Running
    LoongCollector
    (or
    ilogtaild
    ) on the host
  • Machine group
    openclaw-sls-collector
  • Logstore index created on the target
    LOGSTORE
  • Dashboards
    openclaw-audit
    and
    openclaw-gateway
  • Collection config
    openclaw-audit_${LOGSTORE}
  • Config binding between
    openclaw-audit_${LOGSTORE}
    and
    openclaw-sls-collector

执行成功后,环境将包含以下内容:
  • 主机上运行的
    LoongCollector
    (或
    ilogtaild
  • 机器组
    openclaw-sls-collector
  • 目标
    LOGSTORE
    已创建日志索引
  • 仪表盘
    openclaw-audit
    openclaw-gateway
  • 采集配置
    openclaw-audit_${LOGSTORE}
  • openclaw-audit_${LOGSTORE}
    openclaw-sls-collector
    的配置绑定关系

One-Time Execution Flow (Idempotent)

一次性执行流程(幂等性)

The commands below are designed as "exists -> skip" and are safe to rerun. Strict template mode: for index/config/dashboard payloads, always read from files in
references/
. Do not handcraft or simplify JSON bodies beyond required placeholder replacement.
bash
set -euo pipefail
以下命令设计为「已存在则跳过」,可安全重复执行。 严格模板模式:索引/配置/仪表盘的JSON内容请始终从
references/
目录下的文件读取。 除必要的占位符替换外,请勿手动编写或简化JSON内容。
bash
set -euo pipefail

===== User inputs =====

===== 用户输入 =====

: "${PROJECT:?Please export PROJECT}" : "${LOGSTORE:?Please export LOGSTORE}" : "${ALIBABA_CLOUD_ACCESS_KEY_ID:?Please export ALIBABA_CLOUD_ACCESS_KEY_ID}" : "${ALIBABA_CLOUD_ACCESS_KEY_SECRET:?Please export ALIBABA_CLOUD_ACCESS_KEY_SECRET}" : "${ALIYUN_UID:?Please export ALIYUN_UID}"
MACHINE_GROUP="openclaw-sls-collector" CONFIG_NAME="openclaw-audit_${LOGSTORE}"
: "${PROJECT:?Please export PROJECT}" : "${LOGSTORE:?Please export LOGSTORE}" : "${ALIBABA_CLOUD_ACCESS_KEY_ID:?Please export ALIBABA_CLOUD_ACCESS_KEY_ID}" : "${ALIBABA_CLOUD_ACCESS_KEY_SECRET:?Please export ALIBABA_CLOUD_ACCESS_KEY_SECRET}" : "${ALIYUN_UID:?Please export ALIYUN_UID}"
MACHINE_GROUP="openclaw-sls-collector" CONFIG_NAME="openclaw-audit_${LOGSTORE}"

1) Install aliyun CLI if missing (Linux)

1) Install aliyun CLI if missing (Linux)

if ! command -v aliyun >/dev/null 2>&1; then if command -v apt-get >/dev/null 2>&1; then sudo apt-get update sudo apt-get install -y aliyun-cli elif command -v dnf >/dev/null 2>&1; then sudo dnf install -y aliyun-cli elif command -v yum >/dev/null 2>&1; then sudo yum install -y aliyun-cli elif command -v zypper >/dev/null 2>&1; then sudo zypper -n install aliyun-cli else echo "aliyun CLI not found. Install aliyun-cli manually for your Linux distribution." >&2 exit 1 fi fi
if ! command -v aliyun >/dev/null 2>&1; then if command -v apt-get >/dev/null 2>&1; then sudo apt-get update sudo apt-get install -y aliyun-cli elif command -v dnf >/dev/null 2>&1; then sudo dnf install -y aliyun-cli elif command -v yum >/dev/null 2>&1; then sudo yum install -y aliyun-cli elif command -v zypper >/dev/null 2>&1; then sudo zypper -n install aliyun-cli else echo "aliyun CLI not found. Install aliyun-cli manually for your Linux distribution." >&2 exit 1 fi fi

Export auth variables for aliyun CLI

Export auth variables for aliyun CLI

export ALIBABA_CLOUD_ACCESS_KEY_ID export ALIBABA_CLOUD_ACCESS_KEY_SECRET
is_loong_running() { if sudo /etc/init.d/loongcollectord status 2>/dev/null | grep -qi "running"; then return 0 fi if sudo /etc/init.d/ilogtaild status 2>/dev/null | grep -qi "running"; then return 0 fi return 1 }
export ALIBABA_CLOUD_ACCESS_KEY_ID export ALIBABA_CLOUD_ACCESS_KEY_SECRET
is_loong_running() { if sudo /etc/init.d/loongcollectord status 2>/dev/null | grep -qi "running"; then return 0 fi if sudo /etc/init.d/ilogtaild status 2>/dev/null | grep -qi "running"; then return 0 fi return 1 }

2) Resolve region and install LoongCollector (skip when already running)

2) Resolve region and install LoongCollector (skip when already running)

REGION_ID="${ALIBABA_CLOUD_REGION_ID:-}" if [ -z "$REGION_ID" ]; then REGION_ID="$(aliyun sls GetProject --project "$PROJECT" --cli-query 'region' --quiet 2>/dev/null | tr -d '"' || true)" fi if [ -z "$REGION_ID" ]; then echo "Cannot resolve region from project: $PROJECT. Please set ALIBABA_CLOUD_REGION_ID." >&2 exit 1 fi
if ! is_loong_running; then wget "https://aliyun-observability-release-${REGION_ID}.oss-${REGION_ID}.aliyuncs.com/loongcollector/linux64/latest/loongcollector.sh" -O loongcollector.sh chmod +x loongcollector.sh ./loongcollector.sh install "${REGION_ID}" fi
REGION_ID="${ALIBABA_CLOUD_REGION_ID:-}" if [ -z "$REGION_ID" ]; then REGION_ID="$(aliyun sls GetProject --project "$PROJECT" --cli-query 'region' --quiet 2>/dev/null | tr -d '"' || true)" fi if [ -z "$REGION_ID" ]; then echo "Cannot resolve region from project: $PROJECT. Please set ALIBABA_CLOUD_REGION_ID." >&2 exit 1 fi
if ! is_loong_running; then wget "https://aliyun-observability-release-${REGION_ID}.oss-${REGION_ID}.aliyuncs.com/loongcollector/linux64/latest/loongcollector.sh" -O loongcollector.sh chmod +x loongcollector.sh ./loongcollector.sh install "${REGION_ID}" fi

Post-install verification: one of loongcollectord/ilogtaild must be running.

Post-install verification: one of loongcollectord/ilogtaild must be running.

if ! is_loong_running; then sudo /etc/init.d/loongcollectord start >/dev/null 2>&1 || true sudo /etc/init.d/ilogtaild start >/dev/null 2>&1 || true fi if ! is_loong_running; then echo "LoongCollector installation check failed: neither loongcollectord nor ilogtaild is running." >&2 exit 1 fi
if ! is_loong_running; then sudo /etc/init.d/loongcollectord start >/dev/null 2>&1 || true sudo /etc/init.d/ilogtaild start >/dev/null 2>&1 || true fi if ! is_loong_running; then echo "LoongCollector installation check failed: neither loongcollectord nor ilogtaild is running." >&2 exit 1 fi

3) Local user-defined identifier + create machine group

3) Local user-defined identifier + create machine group

sudo mkdir -p /etc/ilogtail sudo mkdir -p /etc/ilogtail/users if [ ! -f /etc/ilogtail/user_defined_id ]; then sudo touch /etc/ilogtail/user_defined_id fi RAND8="$(LC_ALL=C tr -dc 'a-z0-9' </dev/urandom | head -c 8)" USER_DEFINED_ID_PREFIX="${PROJECT}openclaw_sls_collector" EXISTING_USER_DEFINED_ID="$(sudo awk -v p="${USER_DEFINED_ID_PREFIX}" 'index($0,p)==1 {print; exit}' /etc/ilogtail/user_defined_id 2>/dev/null || true)" if [ -n "${EXISTING_USER_DEFINED_ID}" ]; then USER_DEFINED_ID="${EXISTING_USER_DEFINED_ID}" else USER_DEFINED_ID="${USER_DEFINED_ID_PREFIX}${RAND8}" echo "${USER_DEFINED_ID}" | sudo tee -a /etc/ilogtail/user_defined_id >/dev/null fi if ! sudo grep -Fxq "${USER_DEFINED_ID}" /etc/ilogtail/user_defined_id 2>/dev/null; then echo "Failed to persist USER_DEFINED_ID to /etc/ilogtail/user_defined_id" >&2 exit 1 fi if [ ! -f "/etc/ilogtail/users/${ALIYUN_UID}" ]; then sudo touch "/etc/ilogtail/users/${ALIYUN_UID}" fi if [ ! -f "/etc/ilogtail/users/${ALIYUN_UID}" ]; then echo "Failed to create UID marker file: /etc/ilogtail/users/${ALIYUN_UID}" >&2 exit 1 fi
if ! aliyun sls GetMachineGroup --project "$PROJECT" --machineGroup "$MACHINE_GROUP" >/dev/null 2>&1; then cat > /tmp/openclaw-machine-group.json <<EOF { "groupName": "${MACHINE_GROUP}", "groupType": "", "machineIdentifyType": "userdefined", "machineList": ["${USER_DEFINED_ID}"] } EOF aliyun sls CreateMachineGroup
--project "$PROJECT"
--body "$(cat /tmp/openclaw-machine-group.json)" fi if ! aliyun sls GetMachineGroup --project "$PROJECT" --machineGroup "$MACHINE_GROUP" >/dev/null 2>&1; then echo "Machine group was not created successfully: ${MACHINE_GROUP}" >&2 exit 1 fi
sudo mkdir -p /etc/ilogtail sudo mkdir -p /etc/ilogtail/users if [ ! -f /etc/ilogtail/user_defined_id ]; then sudo touch /etc/ilogtail/user_defined_id fi RAND8="$(LC_ALL=C tr -dc 'a-z0-9' </dev/urandom | head -c 8)" USER_DEFINED_ID_PREFIX="${PROJECT}openclaw_sls_collector" EXISTING_USER_DEFINED_ID="$(sudo awk -v p="${USER_DEFINED_ID_PREFIX}" 'index($0,p)==1 {print; exit}' /etc/ilogtail/user_defined_id 2>/dev/null || true)" if [ -n "${EXISTING_USER_DEFINED_ID}" ]; then USER_DEFINED_ID="${EXISTING_USER_DEFINED_ID}" else USER_DEFINED_ID="${USER_DEFINED_ID_PREFIX}${RAND8}" echo "${USER_DEFINED_ID}" | sudo tee -a /etc/ilogtail/user_defined_id >/dev/null fi if ! sudo grep -Fxq "${USER_DEFINED_ID}" /etc/ilogtail/user_defined_id 2>/dev/null; then echo "Failed to persist USER_DEFINED_ID to /etc/ilogtail/user_defined_id" >&2 exit 1 fi if [ ! -f "/etc/ilogtail/users/${ALIYUN_UID}" ]; then sudo touch "/etc/ilogtail/users/${ALIYUN_UID}" fi if [ ! -f "/etc/ilogtail/users/${ALIYUN_UID}" ]; then echo "Failed to create UID marker file: /etc/ilogtail/users/${ALIYUN_UID}" >&2 exit 1 fi
if ! aliyun sls GetMachineGroup --project "$PROJECT" --machineGroup "$MACHINE_GROUP" >/dev/null 2>&1; then cat > /tmp/openclaw-machine-group.json <<EOF { "groupName": "${MACHINE_GROUP}", "groupType": "", "machineIdentifyType": "userdefined", "machineList": ["${USER_DEFINED_ID}"] } EOF aliyun sls CreateMachineGroup
--project "$PROJECT"
--body "$(cat /tmp/openclaw-machine-group.json)" fi if ! aliyun sls GetMachineGroup --project "$PROJECT" --machineGroup "$MACHINE_GROUP" >/dev/null 2>&1; then echo "Machine group was not created successfully: ${MACHINE_GROUP}" >&2 exit 1 fi

4) Create logstore (if missing) + index + multiple dashboards

4) Create logstore (if missing) + index + multiple dashboards

if ! aliyun sls GetLogStore --project "$PROJECT" --logstore "$LOGSTORE" >/dev/null 2>&1; then aliyun sls CreateLogStore --project "$PROJECT"
--body "{"logstoreName":"${LOGSTORE}","ttl":30,"shardCount":2}" fi
if ! aliyun sls GetIndex --project "$PROJECT" --logstore "$LOGSTORE" >/dev/null 2>&1; then

Use the index template as-is from references/index.json

aliyun sls CreateIndex
--project "$PROJECT"
--logstore "$LOGSTORE"
--body "$(cat references/index.json)" fi
sed "s/${logstoreName}/${LOGSTORE}/g" references/dashboard-audit.json > /tmp/openclaw-audit-dashboard.json sed "s/${logstoreName}/${LOGSTORE}/g" references/dashboard-gateway.json > /tmp/openclaw-gateway-dashboard.json
if ! aliyun sls GetLogStore --project "$PROJECT" --logstore "$LOGSTORE" >/dev/null 2>&1; then aliyun sls CreateLogStore --project "$PROJECT"
--body "{"logstoreName":"${LOGSTORE}","ttl":30,"shardCount":2}" fi
if ! aliyun sls GetIndex --project "$PROJECT" --logstore "$LOGSTORE" >/dev/null 2>&1; then

Use the index template as-is from references/index.json

aliyun sls CreateIndex
--project "$PROJECT"
--logstore "$LOGSTORE"
--body "$(cat references/index.json)" fi
sed "s/${logstoreName}/${LOGSTORE}/g" references/dashboard-audit.json > /tmp/openclaw-audit-dashboard.json sed "s/${logstoreName}/${LOGSTORE}/g" references/dashboard-gateway.json > /tmp/openclaw-gateway-dashboard.json

Create dashboard uses project + body(detail). Update uses path + project + body.

Create dashboard uses project + body(detail). Update uses path + project + body.

if aliyun sls GET "/dashboards/openclaw-audit" --project "$PROJECT" >/dev/null 2>&1; then aliyun sls PUT "/dashboards/openclaw-audit"
--project "$PROJECT"
--body "$(cat /tmp/openclaw-audit-dashboard.json)" else aliyun sls POST "/dashboards"
--project "$PROJECT"
--body "$(cat /tmp/openclaw-audit-dashboard.json)" fi
if aliyun sls GET "/dashboards/openclaw-gateway" --project "$PROJECT" >/dev/null 2>&1; then aliyun sls PUT "/dashboards/openclaw-gateway"
--project "$PROJECT"
--body "$(cat /tmp/openclaw-gateway-dashboard.json)" else aliyun sls POST "/dashboards"
--project "$PROJECT"
--body "$(cat /tmp/openclaw-gateway-dashboard.json)" fi
if aliyun sls GET "/dashboards/openclaw-audit" --project "$PROJECT" >/dev/null 2>&1; then aliyun sls PUT "/dashboards/openclaw-audit"
--project "$PROJECT"
--body "$(cat /tmp/openclaw-audit-dashboard.json)" else aliyun sls POST "/dashboards"
--project "$PROJECT"
--body "$(cat /tmp/openclaw-audit-dashboard.json)" fi
if aliyun sls GET "/dashboards/openclaw-gateway" --project "$PROJECT" >/dev/null 2>&1; then aliyun sls PUT "/dashboards/openclaw-gateway"
--project "$PROJECT"
--body "$(cat /tmp/openclaw-gateway-dashboard.json)" else aliyun sls POST "/dashboards"
--project "$PROJECT"
--body "$(cat /tmp/openclaw-gateway-dashboard.json)" fi

5) Create collection config (update when already exists)

5) Create collection config (update when already exists)

Render collector config strictly from references/collector-config.json

Render collector config strictly from references/collector-config.json

sed
-e "s/${configName}/${CONFIG_NAME}/g"
-e "s/${logstoreName}/${LOGSTORE}/g"
-e "s/${region_id}/${REGION_ID}/g"
references/collector-config.json > /tmp/openclaw-collector-config.json
if aliyun sls GetConfig --project "$PROJECT" --configName "$CONFIG_NAME" >/dev/null 2>&1; then aliyun sls UpdateConfig
--project "$PROJECT"
--configName "$CONFIG_NAME"
--body "$(cat /tmp/openclaw-collector-config.json)" else aliyun sls CreateConfig
--project "$PROJECT"
--body "$(cat /tmp/openclaw-collector-config.json)" fi
sed
-e "s/${configName}/${CONFIG_NAME}/g"
-e "s/${logstoreName}/${LOGSTORE}/g"
-e "s/${region_id}/${REGION_ID}/g"
references/collector-config.json > /tmp/openclaw-collector-config.json
if aliyun sls GetConfig --project "$PROJECT" --configName "$CONFIG_NAME" >/dev/null 2>&1; then aliyun sls UpdateConfig
--project "$PROJECT"
--configName "$CONFIG_NAME"
--body "$(cat /tmp/openclaw-collector-config.json)" else aliyun sls CreateConfig
--project "$PROJECT"
--body "$(cat /tmp/openclaw-collector-config.json)" fi

6) Bind collection config to machine group

6) Bind collection config to machine group

aliyun sls ApplyConfigToMachineGroup
--project "$PROJECT"
--machineGroup "$MACHINE_GROUP"
--configName "$CONFIG_NAME"
echo "OpenClaw SLS observability setup completed."

---
aliyun sls ApplyConfigToMachineGroup
--project "$PROJECT"
--machineGroup "$MACHINE_GROUP"
--configName "$CONFIG_NAME"
echo "OpenClaw SLS observability setup completed."

---

Response Format

结果返回格式

When this skill completes, return a concise status report with:
  1. Inputs used:
    PROJECT
    ,
    LOGSTORE
    , resolved
    REGION_ID
  2. Created/updated resources (machine group, index, dashboards, config, binding)
  3. Any skipped steps (already existed / already running)
  4. Next verification commands for the user

本指南执行完成后,请返回简洁的状态报告,包含以下内容:
  1. 使用的输入参数:
    PROJECT
    LOGSTORE
    、解析后的
    REGION_ID
  2. 创建/更新的资源(机器组、索引、仪表盘、配置、绑定关系)
  3. 跳过的步骤(资源已存在/服务已运行)
  4. 提供给用户的后续验证命令

Verification Commands

验证命令

bash
aliyun sls GetMachineGroup --project "$PROJECT" --machineGroup openclaw-sls-collector
aliyun sls GetIndex --project "$PROJECT" --logstore "$LOGSTORE"
aliyun sls GetDashboard --project "$PROJECT" --dashboardName openclaw-audit
aliyun sls GetDashboard --project "$PROJECT" --dashboardName openclaw-gateway
aliyun sls GetConfig --project "$PROJECT" --configName "openclaw-audit_${LOGSTORE}"

bash
aliyun sls GetMachineGroup --project "$PROJECT" --machineGroup openclaw-sls-collector
aliyun sls GetIndex --project "$PROJECT" --logstore "$LOGSTORE"
aliyun sls GetDashboard --project "$PROJECT" --dashboardName openclaw-audit
aliyun sls GetDashboard --project "$PROJECT" --dashboardName openclaw-gateway
aliyun sls GetConfig --project "$PROJECT" --configName "openclaw-audit_${LOGSTORE}"

Reference Files

参考文件

  • Command flow:
    references/cli-commands.md
  • Index definition:
    references/index.json
  • Dashboard templates:
    references/dashboard-audit.json
    ,
    references/dashboard-gateway.json
  • Collection config template:
    references/collector-config.json
Read reference files only when needed:
  • Use
    cli-commands.md
    for step-by-step troubleshooting.
  • Use JSON templates when creating/updating resources.
  • 命令流程:
    references/cli-commands.md
  • 索引定义:
    references/index.json
  • 仪表盘模板:
    references/dashboard-audit.json
    references/dashboard-gateway.json
  • 采集配置模板:
    references/collector-config.json
仅在需要时读取参考文件:
  • 分步排障请使用
    cli-commands.md
  • 创建/更新资源时请使用JSON模板。