Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: release app binary on tag
name: build app binary on tag

# push to branch
on:
Expand Down
52 changes: 52 additions & 0 deletions .github/workflows/publish-test-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: publish test image

on:
workflow_dispatch:
inputs:
test_tag:
description: "Optional test tag (e.g. test-v0.11.1-rc1)"
required: false
type: string
push:
tags:
- "test-v*"

jobs:
build-and-publish-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Login to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.AMN_PAT }}

- name: Compute tags
id: vars
run: |
INPUT_TAG="${{ github.event.inputs.test_tag }}"
REF_TAG="${GITHUB_REF_NAME}"
TAG="${INPUT_TAG:-$REF_TAG}"
if [ -z "$TAG" ]; then TAG="test-${GITHUB_SHA::7}"; fi
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
# echo "sha_tag=test-${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"

- name: Build and push chronos test image
run: |
docker build -f Dockerfile.chronos . --tag ghcr.io/${{ github.repository }}:${{ steps.vars.outputs.tag }}
docker push ghcr.io/${{ github.repository }}:${{ steps.vars.outputs.tag }}

- name: Build and push migration test image
run: |
docker build -f Dockerfile.chronos-pg-migrations . --tag ghcr.io/${{ github.repository }}/db-migration:${{ steps.vars.outputs.tag }}
docker push ghcr.io/${{ github.repository }}/db-migration:${{ steps.vars.outputs.tag }}

# In case sha tag is needed, use the following:
# docker build -f Dockerfile.chronos . \
# --tag ghcr.io/${{ github.repository }}:${{ steps.vars.outputs.tag }} \
# --tag ghcr.io/${{ github.repository }}:${{ steps.vars.outputs.sha_tag }}
# docker push ghcr.io/${{ github.repository }}:${{ steps.vars.outputs.sha_tag }}
2 changes: 0 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ name: release app binary on tag
# and creating a GitHub release
# and publish the release to GitHub
on:
release:
types: [created]
push:
tags:
# only build on tags that start with 'v'
Expand Down
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion chronos_bin/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "chronos_bin"
version = "0.2.1"
version = "0.2.4"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
Expand Down
1 change: 0 additions & 1 deletion chronos_bin/src/bin/chronos.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ use std::time::Duration;

#[tokio::main]
async fn main() {
env_logger::init();
dotenvy::dotenv().ok();

//registering traces
Expand Down
16 changes: 10 additions & 6 deletions chronos_bin/src/telemetry/otlp_collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,16 @@ impl OtlpCollector {
.map_err(|_| std::io::Error::new(std::io::ErrorKind::Other, "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT not set"))?;

global::set_text_map_propagator(TraceContextPropagator::new());
log::debug!("[telemetry] setting text map propagator");

let exporter = opentelemetry_otlp::SpanExporter::builder().with_tonic().with_endpoint(endpoint).build()?;

log::debug!("[telemetry] setting exporter");
let provider = SdkTracerProvider::builder().with_batch_exporter(exporter).build();

log::debug!("[telemetry] setting tracer provider");
global::set_tracer_provider(provider.clone());

log::debug!("[telemetry] setting tracer provider");
let service_name = std::env::var("OTEL_SERVICE_NAME").unwrap_or_else(|_| "chronos".to_string());
log::debug!("[telemetry] setting service name");
Ok(provider.tracer(service_name))
}

Expand All @@ -32,14 +34,16 @@ impl OtlpCollector {
.map_err(|_| std::io::Error::new(std::io::ErrorKind::Other, "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT not set"))?;

global::set_text_map_propagator(TraceContextPropagator::new());
log::debug!("[telemetry] setting text map propagator");

let exporter = opentelemetry_otlp::SpanExporter::builder().with_http().with_endpoint(endpoint).build()?;

log::debug!("[telemetry] setting exporter");
let provider = SdkTracerProvider::builder().with_batch_exporter(exporter).build();

log::debug!("[telemetry] setting tracer provider");
global::set_tracer_provider(provider.clone());

log::debug!("[telemetry] setting tracer provider");
let service_name = std::env::var("OTEL_SERVICE_NAME").unwrap_or_else(|_| "chronos".to_string());
log::debug!("[telemetry] setting service name");
Ok(provider.tracer(service_name))
}
}
49 changes: 35 additions & 14 deletions chronos_bin/src/telemetry/register_telemetry.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use std::panic::{catch_unwind, AssertUnwindSafe};
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};

use super::otlp_collector::OtlpCollector;
Expand All @@ -24,35 +25,55 @@ impl TelemetryCollector {
}

pub fn register_traces(self) {
let tracer = match self.collector_type {
TelemetryCollectorType::Otlp => {
let otlp_collector = OtlpCollector::new();
let protocol = std::env::var("OTEL_EXPORTER_OTLP_PROTOCOL").unwrap_or_else(|_| "grpc".to_string());
if protocol.to_lowercase().contains("grpc") {
otlp_collector.grpc_collector_connect()
} else {
otlp_collector.http_collector_connect()
}
let protocol = std::env::var("OTEL_EXPORTER_OTLP_PROTOCOL").unwrap_or_else(|_| "grpc".to_string());
let traces_endpoint = std::env::var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT").unwrap_or_else(|_| "<unset>".to_string());
let service_name = std::env::var("OTEL_SERVICE_NAME").unwrap_or_else(|_| "<unset>".to_string());
log::info!(
"[telemetry] starting register_traces collector=Otlp protocol={} endpoint={} service={}",
protocol,
traces_endpoint,
service_name
);
let tracer_result = catch_unwind(AssertUnwindSafe(|| {
let otlp_collector = OtlpCollector::new();
if protocol.to_lowercase().contains("grpc") {
log::debug!("[telemetry] using grpc_collector_connect");
otlp_collector.grpc_collector_connect()
} else {
log::debug!("[telemetry] using http_collector_connect");
otlp_collector.http_collector_connect()
}
}));
let tracer = match tracer_result {
Ok(result) => result,
Err(panic_payload) => {
log::error!("[telemetry] PANIC while creating tracer: {:?}", panic_payload);
return; // keep app alive, logs still work
}
};

match tracer {
Ok(tracer) => {
log::debug!("[telemetry] tracer created successfully, initializing subscriber");
let otel_layer = tracing_opentelemetry::layer().with_tracer(tracer);
let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));

let init_result = tracing_subscriber::registry()
.with(filter)
.with(tracing_subscriber::fmt::layer())
.with(otel_layer)
.try_init();

if let Err(e) = init_result {
eprintln!("failed to initialize tracing subscriber: {e}");
log::error!("[telemetry] subscriber init failed: {e}");
} else {
log::debug!("[telemetry] subscriber init OK");
}
}
Err(e) => {
log::error!("error while initializing tracing {}", e);
log::error!("[telemetry] tracer creation returned error: {e}");
let mut source = e.source();
while let Some(s) = source {
log::error!("[telemetry] caused by: {s}");
source = s.source();
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion pg_mig/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "pg_mig"
version = "0.2.1"
version = "0.2.4"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
Expand Down
Loading