Skip to content

Commit 2fefb03

Browse files
committed
Merge branch 'next' into tomasarrachea-bring-main
2 parents 32fd787 + 20e8b4a commit 2fefb03

File tree

7 files changed

+139
-15
lines changed

7 files changed

+139
-15
lines changed

.dockerignore

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Rust
2+
target/
3+
debug/
4+
5+
# Git
6+
.git/
7+
.github/
8+
9+
# Docs build output
10+
book/
11+
12+
# Node
13+
**/node_modules/
14+
**/package-lock.json
15+
**/pnpm-lock.yaml
16+
**/yarn.lock
17+
18+
# Local env files
19+
.env
20+
21+
# OS / editor
22+
.DS_Store

.github/workflows/build-docker.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: Docker Build Check
2+
3+
on:
4+
push:
5+
branches: [main, next]
6+
pull_request:
7+
types: [opened, reopened, synchronize]
8+
9+
permissions:
10+
contents: read
11+
id-token: write
12+
13+
jobs:
14+
docker-build:
15+
name: docker-build
16+
runs-on: Linux-ARM64-Runner
17+
steps:
18+
- name: Set up Docker Buildx
19+
uses: docker/setup-buildx-action@v3
20+
21+
- name: Build
22+
uses: docker/build-push-action@v6
23+
with:
24+
push: false
25+
file: ./Dockerfile
26+
cache-from: type=gha
27+
# Only save cache on push into next
28+
cache-to: ${{ github.event_name == 'push' && github.ref == 'refs/heads/next' && 'type=gha,mode=max' || '' }}
29+

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Changelog
22

3-
## 0.13.1 (TBD)
3+
## 0.14.0 (TBD)
4+
5+
- OpenTelemetry traces are now flushed before program termination on panic ([#222](https://github.com/0xMiden/miden-faucet/pull/222)).
6+
7+
## 0.13.1 (2026-02-18)
48

59
- Replaced hidden wallet icon with explicit "Connect Wallet" / "Disconnect" button next to recipient address input ([#228](https://github.com/0xMiden/miden-faucet/pull/228)).
610
- Removed automatic wallet connection popup during private note minting ([#228](https://github.com/0xMiden/miden-faucet/pull/228)).

Cargo.lock

Lines changed: 6 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ miden-faucet-lib = { path = "crates/faucet", version = "0.13" }
2323
miden-pow-rate-limiter = { path = "crates/pow", version = "0.13" }
2424

2525
# Miden dependencies.
26-
miden-client = { version = "0.13" }
27-
miden-client-cli = { version = "0.13" }
28-
miden-client-sqlite-store = { version = "0.13" }
26+
miden-client = { branch = "next", git = "https://github.com/0xMiden/miden-client" }
27+
miden-client-cli = { branch = "next", git = "https://github.com/0xMiden/miden-client" }
28+
miden-client-sqlite-store = { branch = "next", git = "https://github.com/0xMiden/miden-client" }
2929

3030
# External dependencies
3131
anyhow = { version = "1.0" }

README.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,50 @@ miden-faucet start \
3535
--explorer-url https://testnet.midenscan.com \
3636
--network testnet
3737
```
38+
## Docker
39+
40+
```bash
41+
docker pull ghcr.io/0xmiden/miden-faucet:latest
42+
```
43+
44+
**Data dir:** Store defaults to `/faucet/store.sqlite`. Mount a volume at `/faucet` for persistence.
45+
46+
Run `init` first, then `start`.
47+
48+
**1. Init — new account (testnet):**
49+
50+
```bash
51+
docker run --rm -v miden-faucet-data:/faucet \
52+
-e MIDEN_FAUCET_NETWORK=testnet \
53+
-e MIDEN_FAUCET_NODE_URL=https://rpc.testnet.miden.io \
54+
-e MIDEN_FAUCET_TOKEN_SYMBOL=MIDEN \
55+
-e MIDEN_FAUCET_DECIMALS=6 \
56+
-e MIDEN_FAUCET_MAX_SUPPLY=100000000000000000 \
57+
ghcr.io/0xmiden/miden-faucet:latest init
58+
```
59+
60+
**2. Init — import existing account:**
61+
62+
```bash
63+
docker run --rm -v miden-faucet-data:/faucet \
64+
-e MIDEN_FAUCET_NETWORK=testnet \
65+
-e MIDEN_FAUCET_NODE_URL=https://rpc.testnet.miden.io \
66+
-e MIDEN_FAUCET_IMPORT_ACCOUNT_PATH=/faucet/accounts/faucet_miden.mac \
67+
-v /path/to/your/accounts:/faucet/accounts:ro \
68+
ghcr.io/0xmiden/miden-faucet:latest init
69+
```
70+
71+
Put `faucet_miden.mac` in your local `./accounts` dir before running.
72+
73+
**3. Start the faucet:**
74+
75+
```bash
76+
docker run --rm -p 8000:8000 -p 8080:8080 \
77+
-v miden-faucet-data:/faucet \
78+
ghcr.io/0xmiden/miden-faucet:latest
79+
```
80+
81+
See `bin/faucet/.env` for all options.
3882

3983
## Requesting tokens from a live faucet
4084

bin/faucet/src/logging.rs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::str::FromStr;
2+
use std::sync::OnceLock;
23

34
use anyhow::Result;
45
use opentelemetry::trace::TracerProvider as _;
@@ -10,6 +11,12 @@ use tracing_opentelemetry::OpenTelemetryLayer;
1011
use tracing_subscriber::layer::{Filter, SubscriberExt};
1112
use tracing_subscriber::{Layer, Registry};
1213

14+
/// Global tracer provider for flushing traces on panic.
15+
///
16+
/// This is necessary because the panic hook needs access to the tracer provider to flush
17+
/// pending spans before the program terminates.
18+
static TRACER_PROVIDER: OnceLock<SdkTracerProvider> = OnceLock::new();
19+
1320
/// Configures [`setup_tracing`] to enable or disable the open-telemetry exporter.
1421
#[derive(Clone, Copy)]
1522
pub enum OpenTelemetry {
@@ -58,7 +65,15 @@ pub fn setup_tracing(otel: OpenTelemetry) -> Result<Option<OtelGuard>> {
5865
// `then_some`) to avoid crashing sync callers (with OpenTelemetry::Disabled set). Examples of
5966
// such callers are tests with logging enabled.
6067
let tracer_provider = if otel.is_enabled() {
61-
Some(init_tracer_provider()?)
68+
let provider = init_tracer_provider()?;
69+
70+
// Store the provider globally so the panic hook can flush it.
71+
// SdkTracerProvider is internally reference-counted, so cloning is cheap.
72+
TRACER_PROVIDER
73+
.set(provider.clone())
74+
.expect("setup_tracing should only be called once");
75+
76+
Some(provider)
6277
} else {
6378
None
6479
};
@@ -72,8 +87,21 @@ pub fn setup_tracing(otel: OpenTelemetry) -> Result<Option<OtelGuard>> {
7287
tracing::subscriber::set_global_default(subscriber).map_err(Into::<anyhow::Error>::into)?;
7388

7489
// Register panic hook now that tracing is initialized.
75-
std::panic::set_hook(Box::new(|info| {
90+
// This chains with the default panic hook to preserve backtrace printing.
91+
let default_hook = std::panic::take_hook();
92+
std::panic::set_hook(Box::new(move |info| {
7693
tracing::error!(panic = true, "{info}");
94+
95+
// Flush traces before the program terminates.
96+
// This ensures the panic trace is exported even though the OtelGuard won't be dropped.
97+
if let Some(provider) = TRACER_PROVIDER.get()
98+
&& let Err(err) = provider.force_flush()
99+
{
100+
eprintln!("Failed to flush traces on panic: {err:?}");
101+
}
102+
103+
// Call the default hook to print the backtrace.
104+
default_hook(info);
77105
}));
78106

79107
Ok(tracer_provider.map(|tracer_provider| OtelGuard { tracer_provider }))

0 commit comments

Comments
 (0)