Files
AutoGPT/autogpt_platform/backend/backend/util/metrics.py
Reinier van der Leer e5e60921a3 fix(backend): Handle LaunchDarkly init failure (#11221)
LaunchDarkly is currently down and it's keeping our executor pods from
spinning up.

### Changes 🏗️

- Wrap `LaunchDarklyIntegration` init in a try/except

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - We'll see if it works once it deploys
2025-10-21 07:53:40 +02:00

89 lines
2.9 KiB
Python

import logging
from enum import Enum
import sentry_sdk
from pydantic import SecretStr
from sentry_sdk.integrations import DidNotEnable
from sentry_sdk.integrations.anthropic import AnthropicIntegration
from sentry_sdk.integrations.asyncio import AsyncioIntegration
from sentry_sdk.integrations.launchdarkly import LaunchDarklyIntegration
from sentry_sdk.integrations.logging import LoggingIntegration
from backend.util import feature_flag
from backend.util.settings import Settings
settings = Settings()
logger = logging.getLogger(__name__)
class DiscordChannel(str, Enum):
PLATFORM = "platform" # For platform/system alerts
PRODUCT = "product" # For product alerts (low balance, zero balance, etc.)
def sentry_init():
sentry_dsn = settings.secrets.sentry_dsn
integrations = []
if feature_flag.is_configured():
try:
integrations.append(LaunchDarklyIntegration(feature_flag.get_client()))
except DidNotEnable as e:
logger.error(f"Error enabling LaunchDarklyIntegration for Sentry: {e}")
sentry_sdk.init(
dsn=sentry_dsn,
traces_sample_rate=1.0,
profiles_sample_rate=1.0,
environment=f"app:{settings.config.app_env.value}-behave:{settings.config.behave_as.value}",
_experiments={"enable_logs": True},
integrations=[
AsyncioIntegration(),
LoggingIntegration(sentry_logs_level=logging.INFO),
AnthropicIntegration(
include_prompts=False,
),
]
+ integrations,
)
def sentry_capture_error(error: BaseException):
sentry_sdk.capture_exception(error)
sentry_sdk.flush()
async def discord_send_alert(
content: str, channel: DiscordChannel = DiscordChannel.PLATFORM
):
from backend.blocks.discord.bot_blocks import SendDiscordMessageBlock
from backend.data.model import APIKeyCredentials, CredentialsMetaInput, ProviderName
creds = APIKeyCredentials(
provider="discord",
api_key=SecretStr(settings.secrets.discord_bot_token),
title="Provide Discord Bot Token for the platform alert",
expires_at=None,
)
# Select channel based on enum
if channel == DiscordChannel.PLATFORM:
channel_name = settings.config.platform_alert_discord_channel
elif channel == DiscordChannel.PRODUCT:
channel_name = settings.config.product_alert_discord_channel
else:
channel_name = settings.config.platform_alert_discord_channel
return await SendDiscordMessageBlock().run_once(
SendDiscordMessageBlock.Input(
credentials=CredentialsMetaInput(
id=creds.id,
title=creds.title,
type=creds.type,
provider=ProviderName.DISCORD,
),
message_content=content,
channel_name=channel_name,
),
"status",
credentials=creds,
)