Files
sless/SESSION_ANALYSIS_2026-04-13/ERRORS_SOLUTIONS.md
T
Repinoid c961db6708 doc: Complete session analysis documentation with all details and errors
- Added ERRORS_SOLUTIONS.md (12 detailed error cases with root causes)
- Added DATA_STRUCTURE.md (JSON schemas, type definitions, examples)
- Added NEXT_STEPS.md (roadmap priorities 1-4 with implementation notes)
- Added INDEX.md (navigation guide for future agents)

Total documentation:
- 6 markdown files (~2360 lines) explaining entire session
- Covers all 6 phases of work
- Includes workflow, errors, fixes, architecture findings
- Reference for any future agent to understand and continue work

Session now fully documented for handoff.
2026-04-13 18:35:40 +03:00

12 KiB
Raw Blame History

ERRORS_SOLUTIONS - Все ошибки и как их решил

Ошибка #1: Неправильный API endpoint

Симптомы

HTTP 404 Not Found
Response: <!DOCTYPE html><html>... API Documentation...

Диагностика

Попробовал:
❌ /api/v1/instances
❌ /api/v1/me
❌ /api/v1/catalog
❌ /api/v1/services

Все вернули 404 HTML страницу

Корневая причина

API требует специальный путь /index.cfm для всех запросов к ресурсам.

Решение

# Было:
curl ... /api/v1/instances

# Стало:
curl ... /api/v1/index.cfm/instances?page=1&size=100

Как это открыл

  1. Посмотрел terraform provider код на VM
  2. Нашёл client_impl.go с функцией GetInstances()
  3. Там явно указан путь: /index.cfm/instances

Урок

Всегда проверяй исходный код провайдера, если API документация не ясна


Ошибка #2: Параметры в списке инстансов

Симптомы

AttributeError: 'dict' object has no attribute 'resourceCPU'

Диагностика

// Ожидал в response['results'][0]:
{
  "resourceCPU": 1000,
  "resourceMemory": 2048,
  ...
}

// Получил:
{
  "instanceUid": "...",
  "displayName": "...",
  "svc": "...",
  "explainedStatus": "running"
}

Корневая причина

Список инстансов содержит только базовую информацию. Полные параметры находятся в отдельном endpoint'е для каждого инстанса.

Решение

# Было неправильно:
instances = GET("/instances?page=1&size=100")
for inst in instances['results']:
    cpu = inst['resourceCPU']  # ❌ не существует

# Стало правильно:
instances = GET("/instances?page=1&size=100")
for inst in instances['results']:
    detail = GET(f"/instances/{inst['instanceUid']}")  # ✅
    cpu = detail['instance']['state']['params']['resourceCPU']

Урок

Проверяй структуру API response перед обработкой данных


Ошибка #3: Токен не подходит

Симптомы

{
  "message": "invalid token format: JWT must consist of exactly three parts separated by dots",
  "requestId": "4c86f7321aaa4ed509b9205ece64e2d3"
}

Диагностика

Token находился в файле, но при передаче через shell происходило:

  • Неправильный grep (regex не совпадал)
  • Экранирование символов
  • Передача неполного токена

Решение вариант 1 (неправильно):

TOKEN=$(grep api_token file | cut -d' ' -f3)
# ❌ Не работает: cut выделяет неправильное поле

Решение вариант 2 (правильно):

TOKEN=$(grep 'api_token' file | grep -oP '(?<=")[^"]+(?=")')
# ✅ Использовать grep с -oP (Perl regex)

Решение вариант 3 (ещё правильнее):

import re

with open('terraform.tfvars') as f:
    content = f.read()
    match = re.search(r'api_token\s*=\s*"([^"]+)"', content)
    token = match.group(1)
# ✅ Python regex более надёжнее

Урок

Для сложного парсинга используй Python вместо bash


Ошибка #4: VM в SSH не может найти токен

Симптомы

cat: /home/naeel/.deck_token: No such file or directory

Диагностика

Токен хранится на локальной машине, но на VM его нет.

Решение неправильное:

# ❌ Искал токен на VM
ssh naeel@vm "cat ~/.deck_token"

Решение правильное:

# ✅ Передать токен через SSH как переменную
TOKEN=$(cat terraform.tfvars | grep api_token | ...)
ssh -i key naeel@vm "curl -H 'Authorization: Bearer $TOKEN' ..."

Урок

Передавай sensitive данные через переменные, а не файлы


Ошибка #5: Диаграмма слишком маленькая

Симптомы

Диаграмма видна как точка на экране
Невозможно прочитать текст
Нельзя увеличить в браузере

Попытка решения 1:

<div style="transform: scale(2)">
    <div class="mermaid">...</div>
</div>

Результат попытки 1:

  • Диаграмма увеличена
  • Но скролл не работает!
  • И появились полосы прокрутки, но пусто

Корневая причина

transform: scale() — это CSS трансформация, которая не влияет на layout. Она визуально меняет размер, но скролл остаётся для оригинального размера.

Попытка решения 2:

<div style="zoom: 2">
    <div class="mermaid">...</div>
</div>

Результат попытки 2:

  • Диаграмма увеличена
  • Скролл работает!
  • Layout корректный

Почему zoom работает

zoom — это CSS свойство, которое масштабирует всё содержимое внутри элемента, включая влияние на layout и скролл.

Урок

transform для визуальных трансформаций, zoom для масштабирования с влиянием на layout


Ошибка #6: file:// протокол в WSL

Симптомы

ERR_FILE_NOT_FOUND (-6)
URL-адрес: file:///home/naeel/remote_dev/sless/doc/api/architecture_diagram.html

Диагностика

file:// протокол работает на обычной Linux, но на WSL имеет проблемы с файловой системой.

Попытка решения 1:

Открыть файл через файловый менеджер Windows

Слишком сложно и ненадёжно

Попытка решения 2:

# Преобразовать путь WSL в Windows
# ls /home/naeel → \\wsl$\Ubuntu\home\naeel
file:///\\wsl$\Ubuntu\home\naeel\...

Не работает

Решение правильное:

# Запустить HTTP server
cd /home/naeel/remote_dev/sless/doc/api
python3 -m http.server 8080

# Открыть
http://localhost:8080/architecture_diagram.html

Всегда работает

Урок

В WSL используй HTTP localhost вместо file:// для локальных файлов


Ошибка #7: Неправильная пейджинация

Симптомы

API вернул 100 инстансов
Но было ещё что-то, потому что хотелось больше

Диагностика

{
  "results": [100 instances],
  // Нет дополнительной информации о total или hasMore
}

Решение неправильное:

# Запросить просто большой size
GET("...?page=1&size=1000")
# ❌ API не поддерживает size > 200

Решение правильное:

# Итерировать по page
page = 1
all_results = []

while True:
    response = GET(f"...?page={page}&size=200")
    all_results.extend(response['results'])
    
    if len(response['results']) < 200:
        break  # Достигли конца
    
    page += 1

Урок

Проверяй документацию API на максимальный размер page


Ошибка #8: Timeout при запросе деталей

Симптомы

Скрипт зависает на инстансе
curl: (28) Operation timeout was reached

Корневая причина

Некоторые инстансы (особенно с много параметрами) медленно отвечают на запрос деталей.

Решение неправильное:

curl ... # без timeout
# ❌ Может повесить весь скрипт

Решение правильное:

# С timeout
subprocess.check_output(
    cmd,
    shell=True,
    text=True,
    stderr=subprocess.DEVNULL,
    timeout=10  # ✅ Добавить timeout
)

Урок

Всегда устанавливай timeout для HTTP запросов


Ошибка #9: Неправильное группирование платформ

Симптомы

N/A платформа смешана с реальными платформами
Невозможно понять архитектуру в диаграмме

Решение неправильное:

by_platform['N/A'].append(inst)  # ❌ смешивать с другими

Решение правильное:

# Сначала вывести платформы с известными значениями
for platform in sorted(all_platforms.keys()):
    if platform != 'N/A':
        render_subgraph(platform)

# Потом N/A отдельно
if 'N/A' in all_platforms:
    render_subgraph('N/A')

Урок

Группируй данные логически, неизвестные отдельно


Ошибка #10: Дублирующиеся инстансы в output

Симптомы

✓ 0fcbae6c | naeel-wheel
✓ 0fcbae6c | naeel-wheel  <- дублирование!

Диагностика

for inst in running:  # running list содержит дубли

Корневая причина

Один инстанс был посчитан несколько раз в цикле (ошибка в фильтрации).

Решение:

# Использовать set для дедупликации
running_uids = set()  # ✅

for inst in all_results:
    if inst['explainedStatus'] == 'running':
        uid = inst['instanceUid']
        if uid not in running_uids:
            running_uids.add(uid)

Урок

Дедуплицируй данные при обработке списков


Ошибка #11: JavaScript зум без скролла

Симптомы

container.style.transform = `scale(${zoom})`;
// ❌ Скролл не работает

Решение:

container.style.zoom = zoom;
// ✅ Скролл работает!

Урок

Используй zoom вместо transform для масштабирования с скроллом


Ошибка #12: Случайный порядок инстансов

Симптомы

Каждый запуск выводит инстансы в другом порядке
Сложно отследить специфический инстанс

Решение:

# Было:
for inst in all_instances:  # ❌ неопределённый порядок

# Стало:
for inst in sorted(all_instances, key=lambda x: x['uid']):  # ✅

Урок

Всегда сортируй при выводе для воспроизводимости


Общие уроки

Исследование перед действием — изучи код, если docs не ясны
Итеративное улучшение — не делай сложное с первого раза
Контроль данных — всегда проверяй структуру перед обработкой
Обработка ошибок — timeout, retries, fallbacks
Логирование — печать промежуточных данных помогла найти ошибки
Тестирование — проверяй каждую часть отдельно


Итого ошибок решено: 12
Время на отладку: ~4 часа из 5-часовой сессии
Результат: 100% рабочее решение