1.2: Sandboxing #7
@@ -19,7 +19,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|||||||
|
|
||||||
RUN groupadd --gid ${USER_GID:-1000} $USERNAME \
|
RUN groupadd --gid ${USER_GID:-1000} $USERNAME \
|
||||||
&& useradd --uid ${USER_UID:-1000} --gid ${USER_GID:-1000} -m $USERNAME \
|
&& useradd --uid ${USER_UID:-1000} --gid ${USER_GID:-1000} -m $USERNAME \
|
||||||
&& rustup component add clippy
|
&& rustup component add clippy \
|
||||||
|
&& rustup component add rustfmt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,10 @@
|
|||||||
{
|
{
|
||||||
|
"languages": {
|
||||||
|
"Rust": {
|
||||||
|
"format_on_save": "on",
|
||||||
|
"formatter": "language_server"
|
||||||
|
}
|
||||||
|
},
|
||||||
"lsp": {
|
"lsp": {
|
||||||
"rust-analyzer": {
|
"rust-analyzer": {
|
||||||
"initialization_options": {
|
"initialization_options": {
|
||||||
|
|||||||
@@ -67,7 +67,9 @@ pub enum ParseError {
|
|||||||
impl TryFrom<(DevContainerSchema, PathBuf)> for DevContainer {
|
impl TryFrom<(DevContainerSchema, PathBuf)> for DevContainer {
|
||||||
type Error = ParseError;
|
type Error = ParseError;
|
||||||
|
|
||||||
fn try_from((schema, devcontainer_path): (DevContainerSchema, PathBuf)) -> Result<Self, Self::Error> {
|
fn try_from(
|
||||||
|
(schema, devcontainer_path): (DevContainerSchema, PathBuf),
|
||||||
|
) -> Result<Self, Self::Error> {
|
||||||
let base_dir = devcontainer_path
|
let base_dir = devcontainer_path
|
||||||
.parent()
|
.parent()
|
||||||
.ok_or_else(|| ParseError::InvalidDevContainerPath(devcontainer_path.clone()))?;
|
.ok_or_else(|| ParseError::InvalidDevContainerPath(devcontainer_path.clone()))?;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
gitea::{GiteaAPI, WebhookType}, metrics, open_router::OpenRouterClient,
|
gitea::{GiteaAPI, WebhookType},
|
||||||
|
metrics,
|
||||||
|
open_router::OpenRouterClient,
|
||||||
};
|
};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use std::{collections::HashSet, sync::Arc};
|
use std::{collections::HashSet, sync::Arc};
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
use crate::{bot::Bot, gitea::{GiteaAPI, WebhookType}, open_router::OpenRouterClient, state::AppState};
|
use crate::{
|
||||||
|
bot::Bot,
|
||||||
|
gitea::{GiteaAPI, WebhookType},
|
||||||
|
open_router::OpenRouterClient,
|
||||||
|
state::AppState,
|
||||||
|
};
|
||||||
|
|
||||||
use dotenvy::dotenv;
|
use dotenvy::dotenv;
|
||||||
use tokio::signal::unix::{SignalKind, signal};
|
use tokio::signal::unix::{SignalKind, signal};
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
use std::{net::SocketAddr, str::FromStr};
|
use std::{net::SocketAddr, str::FromStr};
|
||||||
|
|
||||||
use metrics::{Unit, describe_counter, describe_gauge, counter, gauge};
|
use metrics::{Unit, counter, describe_counter, describe_gauge, gauge};
|
||||||
|
|
||||||
pub fn webhook_received(event_type: &str) {
|
pub fn webhook_received(event_type: &str) {
|
||||||
counter!("herald_webhooks_received_total", "event_type" => event_type.to_string())
|
counter!("herald_webhooks_received_total", "event_type" => event_type.to_string()).increment(1);
|
||||||
.increment(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn webhook_duplicate(event_type: &str) {
|
pub fn webhook_duplicate(event_type: &str) {
|
||||||
@@ -31,8 +30,7 @@ pub fn task_completed(event_type: &str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn task_failed(event_type: &str) {
|
pub fn task_failed(event_type: &str) {
|
||||||
counter!("herald_bot_tasks_failed_total", "event_type" => event_type.to_string())
|
counter!("herald_bot_tasks_failed_total", "event_type" => event_type.to_string()).increment(1);
|
||||||
.increment(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn openrouter_cost_usd(cost: f64) {
|
pub fn openrouter_cost_usd(cost: f64) {
|
||||||
@@ -40,13 +38,41 @@ pub fn openrouter_cost_usd(cost: f64) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn describe() {
|
pub fn describe() {
|
||||||
describe_counter!("herald_webhooks_received_total", Unit::Count, "Total webhooks received");
|
describe_counter!(
|
||||||
describe_counter!("herald_webhooks_duplicate_total", Unit::Count, "Webhooks rejected as duplicates");
|
"herald_webhooks_received_total",
|
||||||
describe_counter!("herald_webhooks_channel_full_total", Unit::Count, "Webhooks dropped because the bot channel was full");
|
Unit::Count,
|
||||||
describe_gauge!("herald_bot_tasks_active", Unit::Count, "Bot tasks currently in progress");
|
"Total webhooks received"
|
||||||
describe_counter!("herald_bot_tasks_completed_total", Unit::Count, "Bot tasks completed successfully");
|
);
|
||||||
describe_counter!("herald_bot_tasks_failed_total", Unit::Count, "Bot tasks that failed");
|
describe_counter!(
|
||||||
describe_counter!("herald_openrouter_cost_cents_total", Unit::Count, "Total OpenRouter cost in cents (divide by 100 for USD)");
|
"herald_webhooks_duplicate_total",
|
||||||
|
Unit::Count,
|
||||||
|
"Webhooks rejected as duplicates"
|
||||||
|
);
|
||||||
|
describe_counter!(
|
||||||
|
"herald_webhooks_channel_full_total",
|
||||||
|
Unit::Count,
|
||||||
|
"Webhooks dropped because the bot channel was full"
|
||||||
|
);
|
||||||
|
describe_gauge!(
|
||||||
|
"herald_bot_tasks_active",
|
||||||
|
Unit::Count,
|
||||||
|
"Bot tasks currently in progress"
|
||||||
|
);
|
||||||
|
describe_counter!(
|
||||||
|
"herald_bot_tasks_completed_total",
|
||||||
|
Unit::Count,
|
||||||
|
"Bot tasks completed successfully"
|
||||||
|
);
|
||||||
|
describe_counter!(
|
||||||
|
"herald_bot_tasks_failed_total",
|
||||||
|
Unit::Count,
|
||||||
|
"Bot tasks that failed"
|
||||||
|
);
|
||||||
|
describe_counter!(
|
||||||
|
"herald_openrouter_cost_cents_total",
|
||||||
|
Unit::Count,
|
||||||
|
"Total OpenRouter cost in cents (divide by 100 for USD)"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn install(bind_addr: &str) -> anyhow::Result<()> {
|
pub fn install(bind_addr: &str) -> anyhow::Result<()> {
|
||||||
|
|||||||
Reference in New Issue
Block a user