chalk-remote-call-python 1.10.10__tar.gz → 1.10.12__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. {chalk_remote_call_python-1.10.10/chalk_remote_call_python.egg-info → chalk_remote_call_python-1.10.12}/PKG-INFO +1 -1
  2. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/Cargo.lock +1 -1
  3. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-server/Cargo.toml +1 -1
  4. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-server/src/metrics.rs +92 -5
  5. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-server/src/self_consumer.rs +12 -12
  6. chalk_remote_call_python-1.10.12/chalk_remote_call/_version.py +1 -0
  7. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12/chalk_remote_call_python.egg-info}/PKG-INFO +1 -1
  8. chalk_remote_call_python-1.10.10/chalk_remote_call/_version.py +0 -1
  9. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/MANIFEST.in +0 -0
  10. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/README.md +0 -0
  11. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/Cargo.toml +0 -0
  12. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-proto/Cargo.toml +0 -0
  13. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-proto/src/gen/chalk.auth.v1.rs +0 -0
  14. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-proto/src/gen/chalk.common.v1.rs +0 -0
  15. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-proto/src/gen/chalk.runtime.v1.rs +0 -0
  16. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-proto/src/gen/chalk.runtime.v1.tonic.rs +0 -0
  17. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-proto/src/gen/chalk.utils.v1.rs +0 -0
  18. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-proto/src/gen/descriptor.bin +0 -0
  19. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-proto/src/lib.rs +0 -0
  20. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-server/build.rs +0 -0
  21. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-server/src/async_service.rs +0 -0
  22. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-server/src/coalesce.rs +0 -0
  23. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-server/src/fnq_client.rs +0 -0
  24. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-server/src/lib.rs +0 -0
  25. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-server/src/python_bridge.rs +0 -0
  26. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-server/src/server.rs +0 -0
  27. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/chalk-remote-call-server/src/service.rs +0 -0
  28. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk-remote-call-rs/rust-toolchain.toml +0 -0
  29. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/__init__.py +0 -0
  30. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/__main__.py +0 -0
  31. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/__init__.py +0 -0
  32. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/__init__.py +0 -0
  33. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/auth/__init__.py +0 -0
  34. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/auth/v1/__init__.py +0 -0
  35. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/auth/v1/permissions_pb2.py +0 -0
  36. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/auth/v1/permissions_pb2_grpc.py +0 -0
  37. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/common/__init__.py +0 -0
  38. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/common/v1/__init__.py +0 -0
  39. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/common/v1/chalk_error_pb2.py +0 -0
  40. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/common/v1/chalk_error_pb2_grpc.py +0 -0
  41. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/runtime/__init__.py +0 -0
  42. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/runtime/v1/__init__.py +0 -0
  43. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/runtime/v1/fnq_consumer_pb2.py +0 -0
  44. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/runtime/v1/fnq_consumer_pb2_grpc.py +0 -0
  45. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/runtime/v1/remote_python_call_pb2.py +0 -0
  46. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/runtime/v1/remote_python_call_pb2_grpc.py +0 -0
  47. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/utils/__init__.py +0 -0
  48. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/utils/v1/__init__.py +0 -0
  49. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/utils/v1/encoding_pb2.py +0 -0
  50. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/utils/v1/encoding_pb2_grpc.py +0 -0
  51. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/utils/v1/field_change_pb2.py +0 -0
  52. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/utils/v1/field_change_pb2_grpc.py +0 -0
  53. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/utils/v1/large_pb2.py +0 -0
  54. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/utils/v1/large_pb2_grpc.py +0 -0
  55. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/utils/v1/sensitive_pb2.py +0 -0
  56. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_gen/chalk/utils/v1/sensitive_pb2_grpc.py +0 -0
  57. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/_native.pyi +0 -0
  58. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/arrow_utils.py +0 -0
  59. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/cli.py +0 -0
  60. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/errors.py +0 -0
  61. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/handler_loader.py +0 -0
  62. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/input_transform.py +0 -0
  63. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/logging.py +0 -0
  64. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/server.py +0 -0
  65. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/servicer.py +0 -0
  66. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call/tracing.py +0 -0
  67. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call_python.egg-info/SOURCES.txt +0 -0
  68. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call_python.egg-info/dependency_links.txt +0 -0
  69. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call_python.egg-info/entry_points.txt +0 -0
  70. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call_python.egg-info/requires.txt +0 -0
  71. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/chalk_remote_call_python.egg-info/top_level.txt +0 -0
  72. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/pyproject.toml +0 -0
  73. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/setup.cfg +0 -0
  74. {chalk_remote_call_python-1.10.10 → chalk_remote_call_python-1.10.12}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chalk-remote-call-python
3
- Version: 1.10.10
3
+ Version: 1.10.12
4
4
  Summary: Chalk remote call Python runtime interface client
5
5
  Author: Chalk AI, Inc.
6
6
  Project-URL: Homepage, https://chalk.ai
@@ -511,7 +511,7 @@ dependencies = [
511
511
  [[package]]
512
512
  name = "chalk-queue"
513
513
  version = "0.0.0"
514
- source = "git+https://github.com/chalk-ai/chalk-private.git?rev=1460144ea659debbaee9dccadcd4d7dbf383ccf8#1460144ea659debbaee9dccadcd4d7dbf383ccf8"
514
+ source = "git+https://github.com/chalk-ai/chalk-private.git?rev=6156b025245e28f409bd6c115cfa158ed60203ea#6156b025245e28f409bd6c115cfa158ed60203ea"
515
515
  dependencies = [
516
516
  "base64 0.22.1",
517
517
  "redis",
@@ -45,7 +45,7 @@ futures-util = "0.3"
45
45
  # `[patch.crates-io]` here it builds against vanilla crates.io redis (it only
46
46
  # uses standard APIs). Metrics and StatsD share a revision so their client types agree.
47
47
  [target.'cfg(target_os = "linux")'.dependencies]
48
- chalk-queue = { git = "https://github.com/chalk-ai/chalk-private.git", rev = "1460144ea659debbaee9dccadcd4d7dbf383ccf8" }
48
+ chalk-queue = { git = "https://github.com/chalk-ai/chalk-private.git", rev = "6156b025245e28f409bd6c115cfa158ed60203ea" }
49
49
  chalk_metrics = { git = "https://github.com/chalk-ai/chalk-private.git", rev = "a0f8932ec10d3b8340af3e98cf63b800d60b4926" }
50
50
  chalk_statsd = { git = "https://github.com/chalk-ai/chalk-private.git", rev = "a0f8932ec10d3b8340af3e98cf63b800d60b4926" }
51
51
 
@@ -19,7 +19,7 @@ use chalk_statsd::metrics::MetricsClient;
19
19
  use tracing::{debug, warn};
20
20
 
21
21
  const DEQUEUED_METRIC: &str = "chalk.function_call.dequeued";
22
- const PROCESSING_LATENCY_METRIC: &str = "chalk.function_call.processing_latency";
22
+ const CALL_DURATION_METRIC: &str = "chalk.function_call.call_duration";
23
23
 
24
24
  // Batch tuning — chalk_function_queue's defaults (METRICS_BATCH_* ), inlined.
25
25
  const BATCH_MAX_MESSAGES: usize = 1000;
@@ -220,7 +220,7 @@ pub fn record_completed_call(
220
220
  if let Some(statsd) = &metrics.statsd {
221
221
  let tags = call_tags(&function_name, success, mode);
222
222
  statsd.publish_count_eager(DEQUEUED_METRIC, 1, &tags);
223
- statsd.publish_distribution_eager(PROCESSING_LATENCY_METRIC, elapsed_ms, &tags);
223
+ statsd.publish_distribution_eager(CALL_DURATION_METRIC, elapsed_ms, &tags);
224
224
  }
225
225
 
226
226
  if let Some(pipeline) = &metrics.pipeline {
@@ -302,7 +302,7 @@ mod tests {
302
302
  }
303
303
 
304
304
  #[test]
305
- fn emits_count_and_latency_over_udp() {
305
+ fn emits_count_and_call_duration_over_udp() {
306
306
  let sink = UdpSocket::bind("127.0.0.1:0").unwrap();
307
307
  sink.set_read_timeout(Some(Duration::from_secs(5))).unwrap();
308
308
  let metrics = CallMetrics {
@@ -325,13 +325,13 @@ mod tests {
325
325
 
326
326
  let mut seen = String::new();
327
327
  let mut buf = [0u8; 2048];
328
- while !(seen.contains(DEQUEUED_METRIC) && seen.contains(PROCESSING_LATENCY_METRIC)) {
328
+ while !(seen.contains(DEQUEUED_METRIC) && seen.contains(CALL_DURATION_METRIC)) {
329
329
  let n = sink.recv(&mut buf).expect("statsd packet");
330
330
  seen.push_str(&String::from_utf8_lossy(&buf[..n]));
331
331
  }
332
332
  assert!(seen.contains("chalk.function_call.dequeued:1|c"), "{seen}");
333
333
  assert!(
334
- seen.contains("chalk.function_call.processing_latency:250|d"),
334
+ seen.contains("chalk.function_call.call_duration:250|d"),
335
335
  "{seen}"
336
336
  );
337
337
  assert!(seen.contains("function_name:fn_a"), "{seen}");
@@ -340,6 +340,93 @@ mod tests {
340
340
  assert!(seen.contains("kind:function"), "{seen}");
341
341
  }
342
342
 
343
+ #[tokio::test]
344
+ async fn measures_real_python_handler_duration_over_udp() {
345
+ use crate::python_bridge::{ChunkBuffer, PythonHandler};
346
+ use pyo3::prelude::*;
347
+
348
+ Python::initialize();
349
+ let handler = Python::attach(|py| {
350
+ Arc::new(PythonHandler::new(
351
+ py.eval(
352
+ pyo3::ffi::c_str!("lambda: __import__('time').sleep(0.06)"),
353
+ None,
354
+ None,
355
+ )
356
+ .unwrap()
357
+ .unbind(),
358
+ py.eval(
359
+ pyo3::ffi::c_str!(
360
+ "lambda data, handler, args, context, emit: (handler(), emit(b'result'))"
361
+ ),
362
+ None,
363
+ None,
364
+ )
365
+ .unwrap()
366
+ .unbind(),
367
+ None,
368
+ ))
369
+ });
370
+ let sink = UdpSocket::bind("127.0.0.1:0").unwrap();
371
+ sink.set_read_timeout(Some(Duration::from_secs(5))).unwrap();
372
+ let metrics = CallMetrics {
373
+ statsd: Some(Arc::new(
374
+ MetricsClient::new_from_datadog_config_unbatched(DatadogConnection::UdpSocket(
375
+ sink.local_addr().unwrap().to_string(),
376
+ ))
377
+ .unwrap(),
378
+ )),
379
+ pipeline: None,
380
+ };
381
+
382
+ let started = std::time::Instant::now();
383
+ let result = handler
384
+ .call_into_buffer(
385
+ vec![1],
386
+ "real_handler".to_string(),
387
+ HashMap::new(),
388
+ String::new(),
389
+ ChunkBuffer::new().into_shared(),
390
+ )
391
+ .await;
392
+ let elapsed = started.elapsed();
393
+ assert!(result.is_ok(), "handler failed: {result:?}");
394
+ record_completed_call(&metrics, "real_handler", true, elapsed, Mode::Async);
395
+
396
+ let mut packets = Vec::new();
397
+ let mut buf = [0u8; 2048];
398
+ while packets.len() < 2 {
399
+ let n = sink.recv(&mut buf).expect("StatsD packet");
400
+ packets.push(String::from_utf8_lossy(&buf[..n]).to_string());
401
+ }
402
+ let distribution_value = |name: &str| -> f64 {
403
+ let packet = packets
404
+ .iter()
405
+ .find(|packet| packet.starts_with(name))
406
+ .unwrap_or_else(|| panic!("missing {name}: {packets:?}"));
407
+ let value = packet
408
+ .strip_prefix(name)
409
+ .unwrap()
410
+ .split('|')
411
+ .next()
412
+ .unwrap()
413
+ .parse::<f64>()
414
+ .unwrap();
415
+ assert!(packet.contains("|d"), "expected distribution: {packet}");
416
+ value
417
+ };
418
+ let call_duration = distribution_value("chalk.function_call.call_duration:");
419
+ assert!(
420
+ call_duration >= 50.0,
421
+ "60 ms handler sleep yielded {call_duration} ms call duration"
422
+ );
423
+ assert!(
424
+ (call_duration - elapsed.as_secs_f64() * 1000.0).abs() < 1.0,
425
+ "emitted {call_duration} ms, measured {elapsed:?}"
426
+ );
427
+ println!("60 ms Python handler sleep yielded {call_duration:.2} ms call duration");
428
+ }
429
+
343
430
  fn call_metrics(pipeline: &Arc<PublishingMetricsPipeline>) -> Arc<CallMetrics> {
344
431
  Arc::new(CallMetrics {
345
432
  statsd: None,
@@ -42,7 +42,7 @@ use std::str::FromStr;
42
42
  use std::sync::{Arc, Mutex};
43
43
  use std::time::{Duration, Instant};
44
44
 
45
- use chalk_queue::semaphore::renew_many;
45
+ use chalk_queue::semaphore::{release_many, renew_many};
46
46
  use chalk_queue::stream_writer;
47
47
  use chalk_queue::types::{DeliveryAttempt, QueuedCall};
48
48
  use chalk_queue::{
@@ -802,7 +802,7 @@ async fn run_stream_dispatch_loop(
802
802
  input_queue: BoundFunctionQueue,
803
803
  legacy_queue: Option<BoundFunctionQueue>,
804
804
  sem: chalk_queue::DistributedSemaphore,
805
- conn: ConnectionManager,
805
+ mut conn: ConnectionManager,
806
806
  consumer_name: String,
807
807
  live_calls: LiveCalls,
808
808
  handler: Arc<PythonHandler>,
@@ -877,23 +877,23 @@ async fn run_stream_dispatch_loop(
877
877
  }
878
878
  }
879
879
 
880
+ // Return unused reservations in one round-trip before dispatching work.
881
+ // Transferring the tokens prevents Drop from also releasing each lease.
882
+ let used = deliveries.len().min(leases.len());
883
+ let unused_tokens = leases
884
+ .split_off(used)
885
+ .into_iter()
886
+ .map(SemaphoreLease::into_token)
887
+ .collect::<Vec<_>>();
888
+ let _ = release_many(&mut conn, sem.key(), &unused_tokens).await;
889
+
880
890
  if deliveries.is_empty() {
881
- for lease in leases {
882
- let _ = lease.release().await;
883
- }
884
891
  tokio::time::sleep(backoff).await;
885
892
  backoff = (backoff * 2).min(config.poll_backoff_max);
886
893
  continue;
887
894
  }
888
895
 
889
896
  backoff = config.poll_backoff_initial;
890
- // `dequeue_many` can return fewer records than requested. Only retain
891
- // one lease per record and immediately return the unneeded capacity.
892
- let used = deliveries.len().min(leases.len());
893
- let unused = leases.split_off(used);
894
- for lease in unused {
895
- let _ = lease.release().await;
896
- }
897
897
  for (delivery, lease) in deliveries.into_iter().zip(leases) {
898
898
  dispatch_delivery(
899
899
  queue.clone(),
@@ -0,0 +1 @@
1
+ __version__ = "1.10.12"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chalk-remote-call-python
3
- Version: 1.10.10
3
+ Version: 1.10.12
4
4
  Summary: Chalk remote call Python runtime interface client
5
5
  Author: Chalk AI, Inc.
6
6
  Project-URL: Homepage, https://chalk.ai
@@ -1 +0,0 @@
1
- __version__ = "1.10.10"