opendal 0.1.6.pre.rc.1
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.
- checksums.yaml +7 -0
- data/.standard.yml +20 -0
- data/.tool-versions +1 -0
- data/.yardopts +1 -0
- data/Cargo.toml +65 -0
- data/DEPENDENCIES.md +9 -0
- data/DEPENDENCIES.rust.tsv +277 -0
- data/Gemfile +35 -0
- data/README.md +159 -0
- data/Rakefile +149 -0
- data/build.rs +22 -0
- data/core/CHANGELOG.md +4929 -0
- data/core/CONTRIBUTING.md +61 -0
- data/core/Cargo.lock +10259 -0
- data/core/Cargo.toml +437 -0
- data/core/DEPENDENCIES.md +3 -0
- data/core/DEPENDENCIES.rust.tsv +185 -0
- data/core/LICENSE +201 -0
- data/core/README.md +228 -0
- data/core/benches/README.md +18 -0
- data/core/benches/ops/README.md +26 -0
- data/core/benches/ops/main.rs +25 -0
- data/core/benches/ops/read.rs +100 -0
- data/core/benches/ops/utils.rs +59 -0
- data/core/benches/ops/write.rs +106 -0
- data/core/benches/types/README.md +9 -0
- data/core/benches/types/buffer.rs +114 -0
- data/core/benches/types/main.rs +23 -0
- data/core/benches/types/tasks.rs +64 -0
- data/core/benches/vs_fs/Cargo.toml +32 -0
- data/core/benches/vs_fs/README.md +35 -0
- data/core/benches/vs_fs/src/main.rs +83 -0
- data/core/benches/vs_s3/Cargo.toml +38 -0
- data/core/benches/vs_s3/README.md +55 -0
- data/core/benches/vs_s3/src/main.rs +123 -0
- data/core/edge/README.md +3 -0
- data/core/edge/file_write_on_full_disk/Cargo.toml +31 -0
- data/core/edge/file_write_on_full_disk/README.md +14 -0
- data/core/edge/file_write_on_full_disk/src/main.rs +43 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/Cargo.toml +30 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs +34 -0
- data/core/edge/s3_read_on_wasm/.gitignore +3 -0
- data/core/edge/s3_read_on_wasm/Cargo.toml +38 -0
- data/core/edge/s3_read_on_wasm/README.md +42 -0
- data/core/edge/s3_read_on_wasm/src/lib.rs +60 -0
- data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
- data/core/examples/README.md +23 -0
- data/core/examples/basic/Cargo.toml +29 -0
- data/core/examples/basic/README.md +15 -0
- data/core/examples/basic/src/main.rs +51 -0
- data/core/examples/concurrent-upload/Cargo.toml +29 -0
- data/core/examples/concurrent-upload/README.md +15 -0
- data/core/examples/concurrent-upload/src/main.rs +68 -0
- data/core/examples/multipart-upload/Cargo.toml +29 -0
- data/core/examples/multipart-upload/README.md +15 -0
- data/core/examples/multipart-upload/src/main.rs +56 -0
- data/core/fuzz/.gitignore +5 -0
- data/core/fuzz/Cargo.toml +92 -0
- data/core/fuzz/README.md +68 -0
- data/core/fuzz/fuzz_reader.rs +102 -0
- data/core/fuzz/fuzz_writer.rs +123 -0
- data/core/src/blocking/delete.rs +74 -0
- data/core/src/blocking/list.rs +71 -0
- data/core/src/blocking/mod.rs +33 -0
- data/core/src/blocking/operator.rs +729 -0
- data/core/src/blocking/read/buffer_iterator.rs +66 -0
- data/core/src/blocking/read/mod.rs +27 -0
- data/core/src/blocking/read/reader.rs +124 -0
- data/core/src/blocking/read/std_bytes_iterator.rs +69 -0
- data/core/src/blocking/read/std_reader.rs +95 -0
- data/core/src/blocking/write/mod.rs +22 -0
- data/core/src/blocking/write/std_writer.rs +82 -0
- data/core/src/blocking/write/writer.rs +109 -0
- data/core/src/docs/comparisons/mod.rs +30 -0
- data/core/src/docs/comparisons/vs_object_store.md +183 -0
- data/core/src/docs/concepts.rs +135 -0
- data/core/src/docs/internals/accessor.rs +306 -0
- data/core/src/docs/internals/layer.rs +42 -0
- data/core/src/docs/internals/mod.rs +62 -0
- data/core/src/docs/mod.rs +43 -0
- data/core/src/docs/performance/concurrent_write.md +101 -0
- data/core/src/docs/performance/http_optimization.md +124 -0
- data/core/src/docs/performance/mod.rs +32 -0
- data/core/src/docs/rfcs/0000_example.md +74 -0
- data/core/src/docs/rfcs/0000_foyer_integration.md +111 -0
- data/core/src/docs/rfcs/0041_object_native_api.md +185 -0
- data/core/src/docs/rfcs/0044_error_handle.md +198 -0
- data/core/src/docs/rfcs/0057_auto_region.md +160 -0
- data/core/src/docs/rfcs/0069_object_stream.md +145 -0
- data/core/src/docs/rfcs/0090_limited_reader.md +155 -0
- data/core/src/docs/rfcs/0112_path_normalization.md +79 -0
- data/core/src/docs/rfcs/0191_async_streaming_io.md +328 -0
- data/core/src/docs/rfcs/0203_remove_credential.md +96 -0
- data/core/src/docs/rfcs/0221_create_dir.md +89 -0
- data/core/src/docs/rfcs/0247_retryable_error.md +87 -0
- data/core/src/docs/rfcs/0293_object_id.md +67 -0
- data/core/src/docs/rfcs/0337_dir_entry.md +191 -0
- data/core/src/docs/rfcs/0409_accessor_capabilities.md +67 -0
- data/core/src/docs/rfcs/0413_presign.md +154 -0
- data/core/src/docs/rfcs/0423_command_line_interface.md +268 -0
- data/core/src/docs/rfcs/0429_init_from_iter.md +107 -0
- data/core/src/docs/rfcs/0438_multipart.md +163 -0
- data/core/src/docs/rfcs/0443_gateway.md +73 -0
- data/core/src/docs/rfcs/0501_new_builder.md +111 -0
- data/core/src/docs/rfcs/0554_write_refactor.md +96 -0
- data/core/src/docs/rfcs/0561_list_metadata_reuse.md +210 -0
- data/core/src/docs/rfcs/0599_blocking_api.md +157 -0
- data/core/src/docs/rfcs/0623_redis_service.md +300 -0
- data/core/src/docs/rfcs/0627_split_capabilities.md +89 -0
- data/core/src/docs/rfcs/0661_path_in_accessor.md +126 -0
- data/core/src/docs/rfcs/0793_generic_kv_services.md +209 -0
- data/core/src/docs/rfcs/0926_object_reader.md +93 -0
- data/core/src/docs/rfcs/0977_refactor_error.md +151 -0
- data/core/src/docs/rfcs/1085_object_handler.md +73 -0
- data/core/src/docs/rfcs/1391_object_metadataer.md +110 -0
- data/core/src/docs/rfcs/1398_query_based_metadata.md +125 -0
- data/core/src/docs/rfcs/1420_object_writer.md +147 -0
- data/core/src/docs/rfcs/1477_remove_object_concept.md +159 -0
- data/core/src/docs/rfcs/1735_operation_extension.md +117 -0
- data/core/src/docs/rfcs/2083_writer_sink_api.md +106 -0
- data/core/src/docs/rfcs/2133_append_api.md +88 -0
- data/core/src/docs/rfcs/2299_chain_based_operator_api.md +99 -0
- data/core/src/docs/rfcs/2602_object_versioning.md +138 -0
- data/core/src/docs/rfcs/2758_merge_append_into_write.md +79 -0
- data/core/src/docs/rfcs/2774_lister_api.md +66 -0
- data/core/src/docs/rfcs/2779_list_with_metakey.md +143 -0
- data/core/src/docs/rfcs/2852_native_capability.md +58 -0
- data/core/src/docs/rfcs/2884_merge_range_read_into_read.md +80 -0
- data/core/src/docs/rfcs/3017_remove_write_copy_from.md +94 -0
- data/core/src/docs/rfcs/3197_config.md +237 -0
- data/core/src/docs/rfcs/3232_align_list_api.md +69 -0
- data/core/src/docs/rfcs/3243_list_prefix.md +128 -0
- data/core/src/docs/rfcs/3356_lazy_reader.md +111 -0
- data/core/src/docs/rfcs/3526_list_recursive.md +59 -0
- data/core/src/docs/rfcs/3574_concurrent_stat_in_list.md +80 -0
- data/core/src/docs/rfcs/3734_buffered_reader.md +64 -0
- data/core/src/docs/rfcs/3898_concurrent_writer.md +66 -0
- data/core/src/docs/rfcs/3911_deleter_api.md +165 -0
- data/core/src/docs/rfcs/4382_range_based_read.md +213 -0
- data/core/src/docs/rfcs/4638_executor.md +215 -0
- data/core/src/docs/rfcs/5314_remove_metakey.md +120 -0
- data/core/src/docs/rfcs/5444_operator_from_uri.md +162 -0
- data/core/src/docs/rfcs/5479_context.md +140 -0
- data/core/src/docs/rfcs/5485_conditional_reader.md +112 -0
- data/core/src/docs/rfcs/5495_list_with_deleted.md +81 -0
- data/core/src/docs/rfcs/5556_write_returns_metadata.md +121 -0
- data/core/src/docs/rfcs/5871_read_returns_metadata.md +112 -0
- data/core/src/docs/rfcs/6189_remove_native_blocking.md +106 -0
- data/core/src/docs/rfcs/6209_glob_support.md +132 -0
- data/core/src/docs/rfcs/6213_options_api.md +142 -0
- data/core/src/docs/rfcs/README.md +62 -0
- data/core/src/docs/rfcs/mod.rs +278 -0
- data/core/src/docs/upgrade.md +1556 -0
- data/core/src/layers/async_backtrace.rs +174 -0
- data/core/src/layers/await_tree.rs +202 -0
- data/core/src/layers/capability_check.rs +239 -0
- data/core/src/layers/chaos.rs +170 -0
- data/core/src/layers/complete.rs +385 -0
- data/core/src/layers/concurrent_limit.rs +322 -0
- data/core/src/layers/correctness_check.rs +440 -0
- data/core/src/layers/dtrace.rs +294 -0
- data/core/src/layers/error_context.rs +310 -0
- data/core/src/layers/fastmetrics.rs +525 -0
- data/core/src/layers/fastrace.rs +271 -0
- data/core/src/layers/http_client.rs +206 -0
- data/core/src/layers/immutable_index.rs +408 -0
- data/core/src/layers/logging.rs +842 -0
- data/core/src/layers/metrics.rs +182 -0
- data/core/src/layers/mime_guess.rs +199 -0
- data/core/src/layers/mod.rs +130 -0
- data/core/src/layers/observe/metrics.rs +936 -0
- data/core/src/layers/observe/mod.rs +93 -0
- data/core/src/layers/otelmetrics.rs +496 -0
- data/core/src/layers/oteltrace.rs +203 -0
- data/core/src/layers/prometheus.rs +686 -0
- data/core/src/layers/prometheus_client.rs +519 -0
- data/core/src/layers/retry.rs +933 -0
- data/core/src/layers/throttle.rs +204 -0
- data/core/src/layers/timeout.rs +513 -0
- data/core/src/layers/tracing.rs +349 -0
- data/core/src/layers/type_eraser.rs +91 -0
- data/core/src/lib.rs +204 -0
- data/core/src/raw/accessor.rs +856 -0
- data/core/src/raw/adapters/kv/api.rs +164 -0
- data/core/src/raw/adapters/kv/backend.rs +253 -0
- data/core/src/raw/adapters/kv/mod.rs +31 -0
- data/core/src/raw/adapters/mod.rs +50 -0
- data/core/src/raw/adapters/typed_kv/api.rs +171 -0
- data/core/src/raw/adapters/typed_kv/backend.rs +279 -0
- data/core/src/raw/adapters/typed_kv/mod.rs +29 -0
- data/core/src/raw/atomic_util.rs +57 -0
- data/core/src/raw/azure.rs +570 -0
- data/core/src/raw/chrono_util.rs +109 -0
- data/core/src/raw/enum_utils.rs +201 -0
- data/core/src/raw/futures_util.rs +470 -0
- data/core/src/raw/http_util/body.rs +144 -0
- data/core/src/raw/http_util/bytes_content_range.rs +239 -0
- data/core/src/raw/http_util/bytes_range.rs +260 -0
- data/core/src/raw/http_util/client.rs +276 -0
- data/core/src/raw/http_util/error.rs +68 -0
- data/core/src/raw/http_util/header.rs +356 -0
- data/core/src/raw/http_util/mod.rs +78 -0
- data/core/src/raw/http_util/multipart.rs +1180 -0
- data/core/src/raw/http_util/uri.rs +190 -0
- data/core/src/raw/layer.rs +295 -0
- data/core/src/raw/mod.rs +101 -0
- data/core/src/raw/oio/buf/flex_buf.rs +118 -0
- data/core/src/raw/oio/buf/mod.rs +25 -0
- data/core/src/raw/oio/buf/pooled_buf.rs +126 -0
- data/core/src/raw/oio/buf/queue_buf.rs +117 -0
- data/core/src/raw/oio/delete/api.rs +102 -0
- data/core/src/raw/oio/delete/batch_delete.rs +127 -0
- data/core/src/raw/oio/delete/mod.rs +30 -0
- data/core/src/raw/oio/delete/one_shot_delete.rs +79 -0
- data/core/src/raw/oio/entry.rs +89 -0
- data/core/src/raw/oio/list/api.rs +69 -0
- data/core/src/raw/oio/list/flat_list.rs +137 -0
- data/core/src/raw/oio/list/hierarchy_list.rs +135 -0
- data/core/src/raw/oio/list/mod.rs +35 -0
- data/core/src/raw/oio/list/page_list.rs +105 -0
- data/core/src/raw/oio/list/prefix_list.rs +64 -0
- data/core/src/raw/oio/mod.rs +40 -0
- data/core/src/raw/oio/read/api.rs +119 -0
- data/core/src/raw/oio/read/mod.rs +21 -0
- data/core/src/raw/oio/write/api.rs +103 -0
- data/core/src/raw/oio/write/append_write.rs +111 -0
- data/core/src/raw/oio/write/block_write.rs +405 -0
- data/core/src/raw/oio/write/mod.rs +42 -0
- data/core/src/raw/oio/write/multipart_write.rs +518 -0
- data/core/src/raw/oio/write/one_shot_write.rs +77 -0
- data/core/src/raw/oio/write/position_write.rs +284 -0
- data/core/src/raw/operation.rs +88 -0
- data/core/src/raw/ops.rs +917 -0
- data/core/src/raw/path.rs +451 -0
- data/core/src/raw/path_cache.rs +244 -0
- data/core/src/raw/rps.rs +249 -0
- data/core/src/raw/serde_util.rs +423 -0
- data/core/src/raw/std_io_util.rs +65 -0
- data/core/src/raw/tests/mod.rs +30 -0
- data/core/src/raw/tests/read.rs +116 -0
- data/core/src/raw/tests/utils.rs +80 -0
- data/core/src/raw/tests/write.rs +79 -0
- data/core/src/raw/tokio_util.rs +24 -0
- data/core/src/raw/version.rs +19 -0
- data/core/src/services/aliyun_drive/backend.rs +421 -0
- data/core/src/services/aliyun_drive/config.rs +72 -0
- data/core/src/services/aliyun_drive/core.rs +651 -0
- data/core/src/services/aliyun_drive/delete.rs +51 -0
- data/core/src/services/aliyun_drive/docs.md +61 -0
- data/core/src/services/aliyun_drive/error.rs +56 -0
- data/core/src/services/aliyun_drive/lister.rs +134 -0
- data/core/src/services/aliyun_drive/mod.rs +39 -0
- data/core/src/services/aliyun_drive/writer.rs +114 -0
- data/core/src/services/alluxio/backend.rs +257 -0
- data/core/src/services/alluxio/config.rs +50 -0
- data/core/src/services/alluxio/core.rs +367 -0
- data/core/src/services/alluxio/delete.rs +38 -0
- data/core/src/services/alluxio/docs.md +45 -0
- data/core/src/services/alluxio/error.rs +99 -0
- data/core/src/services/alluxio/lister.rs +73 -0
- data/core/src/services/alluxio/mod.rs +39 -0
- data/core/src/services/alluxio/writer.rs +74 -0
- data/core/src/services/azblob/backend.rs +594 -0
- data/core/src/services/azblob/config.rs +220 -0
- data/core/src/services/azblob/core.rs +937 -0
- data/core/src/services/azblob/delete.rs +108 -0
- data/core/src/services/azblob/docs.md +77 -0
- data/core/src/services/azblob/error.rs +164 -0
- data/core/src/services/azblob/lister.rs +107 -0
- data/core/src/services/azblob/mod.rs +38 -0
- data/core/src/services/azblob/writer.rs +177 -0
- data/core/src/services/azdls/backend.rs +435 -0
- data/core/src/services/azdls/config.rs +89 -0
- data/core/src/services/azdls/core.rs +388 -0
- data/core/src/services/azdls/delete.rs +48 -0
- data/core/src/services/azdls/docs.md +73 -0
- data/core/src/services/azdls/error.rs +107 -0
- data/core/src/services/azdls/lister.rs +165 -0
- data/core/src/services/azdls/mod.rs +38 -0
- data/core/src/services/azdls/writer.rs +129 -0
- data/core/src/services/azfile/backend.rs +373 -0
- data/core/src/services/azfile/config.rs +61 -0
- data/core/src/services/azfile/core.rs +435 -0
- data/core/src/services/azfile/delete.rs +51 -0
- data/core/src/services/azfile/docs.md +65 -0
- data/core/src/services/azfile/error.rs +108 -0
- data/core/src/services/azfile/lister.rs +217 -0
- data/core/src/services/azfile/mod.rs +39 -0
- data/core/src/services/azfile/writer.rs +92 -0
- data/core/src/services/b2/backend.rs +434 -0
- data/core/src/services/b2/config.rs +64 -0
- data/core/src/services/b2/core.rs +742 -0
- data/core/src/services/b2/delete.rs +56 -0
- data/core/src/services/b2/docs.md +54 -0
- data/core/src/services/b2/error.rs +132 -0
- data/core/src/services/b2/lister.rs +110 -0
- data/core/src/services/b2/mod.rs +39 -0
- data/core/src/services/b2/writer.rs +189 -0
- data/core/src/services/cacache/backend.rs +160 -0
- data/core/src/services/cacache/config.rs +28 -0
- data/core/src/services/cacache/core.rs +96 -0
- data/core/src/services/cacache/delete.rs +39 -0
- data/core/src/services/cacache/docs.md +38 -0
- data/core/src/services/cacache/mod.rs +34 -0
- data/core/src/services/cacache/writer.rs +61 -0
- data/core/src/services/cloudflare_kv/backend.rs +513 -0
- data/core/src/services/cloudflare_kv/config.rs +55 -0
- data/core/src/services/cloudflare_kv/core.rs +168 -0
- data/core/src/services/cloudflare_kv/delete.rs +119 -0
- data/core/src/services/cloudflare_kv/docs.md +21 -0
- data/core/src/services/cloudflare_kv/error.rs +79 -0
- data/core/src/services/cloudflare_kv/lister.rs +170 -0
- data/core/src/services/cloudflare_kv/mod.rs +39 -0
- data/core/src/services/cloudflare_kv/model.rs +76 -0
- data/core/src/services/cloudflare_kv/writer.rs +68 -0
- data/core/src/services/compfs/backend.rs +290 -0
- data/core/src/services/compfs/config.rs +30 -0
- data/core/src/services/compfs/core.rs +159 -0
- data/core/src/services/compfs/delete.rs +53 -0
- data/core/src/services/compfs/lister.rs +98 -0
- data/core/src/services/compfs/mod.rs +38 -0
- data/core/src/services/compfs/reader.rs +79 -0
- data/core/src/services/compfs/writer.rs +90 -0
- data/core/src/services/cos/backend.rs +442 -0
- data/core/src/services/cos/config.rs +54 -0
- data/core/src/services/cos/core.rs +761 -0
- data/core/src/services/cos/delete.rs +48 -0
- data/core/src/services/cos/docs.md +55 -0
- data/core/src/services/cos/error.rs +105 -0
- data/core/src/services/cos/lister.rs +237 -0
- data/core/src/services/cos/mod.rs +39 -0
- data/core/src/services/cos/writer.rs +234 -0
- data/core/src/services/d1/backend.rs +330 -0
- data/core/src/services/d1/config.rs +55 -0
- data/core/src/services/d1/docs.md +48 -0
- data/core/src/services/d1/error.rs +79 -0
- data/core/src/services/d1/mod.rs +29 -0
- data/core/src/services/d1/model.rs +125 -0
- data/core/src/services/dashmap/backend.rs +203 -0
- data/core/src/services/dashmap/config.rs +37 -0
- data/core/src/services/dashmap/core.rs +61 -0
- data/core/src/services/dashmap/delete.rs +40 -0
- data/core/src/services/dashmap/docs.md +38 -0
- data/core/src/services/dashmap/lister.rs +63 -0
- data/core/src/services/dashmap/mod.rs +36 -0
- data/core/src/services/dashmap/writer.rs +87 -0
- data/core/src/services/dbfs/backend.rs +258 -0
- data/core/src/services/dbfs/config.rs +48 -0
- data/core/src/services/dbfs/core.rs +191 -0
- data/core/src/services/dbfs/delete.rs +49 -0
- data/core/src/services/dbfs/docs.md +57 -0
- data/core/src/services/dbfs/error.rs +74 -0
- data/core/src/services/dbfs/lister.rs +96 -0
- data/core/src/services/dbfs/mod.rs +38 -0
- data/core/src/services/dbfs/writer.rs +64 -0
- data/core/src/services/dropbox/backend.rs +187 -0
- data/core/src/services/dropbox/builder.rs +222 -0
- data/core/src/services/dropbox/config.rs +47 -0
- data/core/src/services/dropbox/core.rs +496 -0
- data/core/src/services/dropbox/delete.rs +54 -0
- data/core/src/services/dropbox/docs.md +64 -0
- data/core/src/services/dropbox/error.rs +85 -0
- data/core/src/services/dropbox/lister.rs +117 -0
- data/core/src/services/dropbox/mod.rs +40 -0
- data/core/src/services/dropbox/writer.rs +51 -0
- data/core/src/services/etcd/backend.rs +345 -0
- data/core/src/services/etcd/config.rs +86 -0
- data/core/src/services/etcd/core.rs +143 -0
- data/core/src/services/etcd/deleter.rs +41 -0
- data/core/src/services/etcd/docs.md +45 -0
- data/core/src/services/etcd/error.rs +26 -0
- data/core/src/services/etcd/lister.rs +79 -0
- data/core/src/services/etcd/mod.rs +36 -0
- data/core/src/services/etcd/writer.rs +61 -0
- data/core/src/services/foundationdb/backend.rs +171 -0
- data/core/src/services/foundationdb/config.rs +45 -0
- data/core/src/services/foundationdb/docs.md +42 -0
- data/core/src/services/foundationdb/mod.rs +24 -0
- data/core/src/services/fs/backend.rs +299 -0
- data/core/src/services/fs/config.rs +33 -0
- data/core/src/services/fs/core.rs +227 -0
- data/core/src/services/fs/delete.rs +53 -0
- data/core/src/services/fs/docs.md +49 -0
- data/core/src/services/fs/error.rs +31 -0
- data/core/src/services/fs/lister.rs +81 -0
- data/core/src/services/fs/mod.rs +40 -0
- data/core/src/services/fs/reader.rs +83 -0
- data/core/src/services/fs/writer.rs +212 -0
- data/core/src/services/ftp/backend.rs +388 -0
- data/core/src/services/ftp/config.rs +46 -0
- data/core/src/services/ftp/core.rs +136 -0
- data/core/src/services/ftp/delete.rs +62 -0
- data/core/src/services/ftp/docs.md +42 -0
- data/core/src/services/ftp/err.rs +47 -0
- data/core/src/services/ftp/lister.rs +72 -0
- data/core/src/services/ftp/mod.rs +41 -0
- data/core/src/services/ftp/reader.rs +84 -0
- data/core/src/services/ftp/writer.rs +122 -0
- data/core/src/services/gcs/backend.rs +499 -0
- data/core/src/services/gcs/config.rs +168 -0
- data/core/src/services/gcs/core.rs +1079 -0
- data/core/src/services/gcs/delete.rs +98 -0
- data/core/src/services/gcs/docs.md +76 -0
- data/core/src/services/gcs/error.rs +122 -0
- data/core/src/services/gcs/lister.rs +136 -0
- data/core/src/services/gcs/mod.rs +40 -0
- data/core/src/services/gcs/uri.rs +75 -0
- data/core/src/services/gcs/writer.rs +163 -0
- data/core/src/services/gdrive/backend.rs +176 -0
- data/core/src/services/gdrive/builder.rs +228 -0
- data/core/src/services/gdrive/config.rs +47 -0
- data/core/src/services/gdrive/core.rs +499 -0
- data/core/src/services/gdrive/delete.rs +57 -0
- data/core/src/services/gdrive/docs.md +65 -0
- data/core/src/services/gdrive/error.rs +80 -0
- data/core/src/services/gdrive/lister.rs +110 -0
- data/core/src/services/gdrive/mod.rs +40 -0
- data/core/src/services/gdrive/writer.rs +77 -0
- data/core/src/services/ghac/backend.rs +285 -0
- data/core/src/services/ghac/config.rs +36 -0
- data/core/src/services/ghac/core.rs +459 -0
- data/core/src/services/ghac/docs.md +84 -0
- data/core/src/services/ghac/error.rs +52 -0
- data/core/src/services/ghac/mod.rs +35 -0
- data/core/src/services/ghac/writer.rs +201 -0
- data/core/src/services/github/backend.rs +285 -0
- data/core/src/services/github/config.rs +59 -0
- data/core/src/services/github/core.rs +351 -0
- data/core/src/services/github/delete.rs +41 -0
- data/core/src/services/github/docs.md +52 -0
- data/core/src/services/github/error.rs +101 -0
- data/core/src/services/github/lister.rs +112 -0
- data/core/src/services/github/mod.rs +38 -0
- data/core/src/services/github/writer.rs +51 -0
- data/core/src/services/gridfs/backend.rs +166 -0
- data/core/src/services/gridfs/config.rs +50 -0
- data/core/src/services/gridfs/core.rs +154 -0
- data/core/src/services/gridfs/docs.md +46 -0
- data/core/src/services/gridfs/mod.rs +26 -0
- data/core/src/services/hdfs/backend.rs +413 -0
- data/core/src/services/hdfs/config.rs +59 -0
- data/core/src/services/hdfs/delete.rs +62 -0
- data/core/src/services/hdfs/docs.md +140 -0
- data/core/src/services/hdfs/lister.rs +70 -0
- data/core/src/services/hdfs/mod.rs +36 -0
- data/core/src/services/hdfs/reader.rs +79 -0
- data/core/src/services/hdfs/writer.rs +104 -0
- data/core/src/services/hdfs_native/backend.rs +340 -0
- data/core/src/services/hdfs_native/config.rs +45 -0
- data/core/src/services/hdfs_native/delete.rs +47 -0
- data/core/src/services/hdfs_native/docs.md +35 -0
- data/core/src/services/hdfs_native/error.rs +59 -0
- data/core/src/services/hdfs_native/lister.rs +85 -0
- data/core/src/services/hdfs_native/mod.rs +39 -0
- data/core/src/services/hdfs_native/reader.rs +62 -0
- data/core/src/services/hdfs_native/writer.rs +61 -0
- data/core/src/services/http/backend.rs +291 -0
- data/core/src/services/http/config.rs +49 -0
- data/core/src/services/http/core.rs +125 -0
- data/core/src/services/http/docs.md +45 -0
- data/core/src/services/http/error.rs +53 -0
- data/core/src/services/http/mod.rs +32 -0
- data/core/src/services/huggingface/backend.rs +289 -0
- data/core/src/services/huggingface/config.rs +75 -0
- data/core/src/services/huggingface/core.rs +406 -0
- data/core/src/services/huggingface/docs.md +61 -0
- data/core/src/services/huggingface/error.rs +93 -0
- data/core/src/services/huggingface/lister.rs +91 -0
- data/core/src/services/huggingface/mod.rs +34 -0
- data/core/src/services/ipfs/backend.rs +257 -0
- data/core/src/services/ipfs/config.rs +32 -0
- data/core/src/services/ipfs/core.rs +239 -0
- data/core/src/services/ipfs/docs.md +45 -0
- data/core/src/services/ipfs/error.rs +52 -0
- data/core/src/services/ipfs/ipld.rs +162 -0
- data/core/src/services/ipfs/mod.rs +34 -0
- data/core/src/services/ipmfs/backend.rs +147 -0
- data/core/src/services/ipmfs/builder.rs +166 -0
- data/core/src/services/ipmfs/config.rs +32 -0
- data/core/src/services/ipmfs/core.rs +142 -0
- data/core/src/services/ipmfs/delete.rs +48 -0
- data/core/src/services/ipmfs/docs.md +14 -0
- data/core/src/services/ipmfs/error.rs +83 -0
- data/core/src/services/ipmfs/lister.rs +135 -0
- data/core/src/services/ipmfs/mod.rs +40 -0
- data/core/src/services/ipmfs/writer.rs +49 -0
- data/core/src/services/koofr/backend.rs +361 -0
- data/core/src/services/koofr/config.rs +50 -0
- data/core/src/services/koofr/core.rs +458 -0
- data/core/src/services/koofr/delete.rs +50 -0
- data/core/src/services/koofr/docs.md +51 -0
- data/core/src/services/koofr/error.rs +72 -0
- data/core/src/services/koofr/lister.rs +88 -0
- data/core/src/services/koofr/mod.rs +38 -0
- data/core/src/services/koofr/writer.rs +53 -0
- data/core/src/services/lakefs/backend.rs +309 -0
- data/core/src/services/lakefs/config.rs +81 -0
- data/core/src/services/lakefs/core.rs +261 -0
- data/core/src/services/lakefs/delete.rs +54 -0
- data/core/src/services/lakefs/docs.md +62 -0
- data/core/src/services/lakefs/error.rs +93 -0
- data/core/src/services/lakefs/lister.rs +120 -0
- data/core/src/services/lakefs/mod.rs +38 -0
- data/core/src/services/lakefs/writer.rs +50 -0
- data/core/src/services/memcached/backend.rs +284 -0
- data/core/src/services/memcached/binary.rs +289 -0
- data/core/src/services/memcached/config.rs +43 -0
- data/core/src/services/memcached/docs.md +47 -0
- data/core/src/services/memcached/mod.rs +27 -0
- data/core/src/services/memory/backend.rs +205 -0
- data/core/src/services/memory/config.rs +30 -0
- data/core/src/services/memory/core.rs +80 -0
- data/core/src/services/memory/delete.rs +42 -0
- data/core/src/services/memory/docs.md +36 -0
- data/core/src/services/memory/lister.rs +56 -0
- data/core/src/services/memory/mod.rs +36 -0
- data/core/src/services/memory/writer.rs +85 -0
- data/core/src/services/mini_moka/backend.rs +260 -0
- data/core/src/services/mini_moka/config.rs +56 -0
- data/core/src/services/mini_moka/core.rs +52 -0
- data/core/src/services/mini_moka/delete.rs +42 -0
- data/core/src/services/mini_moka/docs.md +19 -0
- data/core/src/services/mini_moka/lister.rs +68 -0
- data/core/src/services/mini_moka/mod.rs +36 -0
- data/core/src/services/mini_moka/writer.rs +84 -0
- data/core/src/services/mod.rs +206 -0
- data/core/src/services/moka/backend.rs +326 -0
- data/core/src/services/moka/config.rs +59 -0
- data/core/src/services/moka/core.rs +62 -0
- data/core/src/services/moka/delete.rs +42 -0
- data/core/src/services/moka/docs.md +42 -0
- data/core/src/services/moka/lister.rs +65 -0
- data/core/src/services/moka/mod.rs +41 -0
- data/core/src/services/moka/writer.rs +83 -0
- data/core/src/services/mongodb/backend.rs +291 -0
- data/core/src/services/mongodb/config.rs +54 -0
- data/core/src/services/mongodb/docs.md +49 -0
- data/core/src/services/mongodb/mod.rs +24 -0
- data/core/src/services/monoiofs/backend.rs +238 -0
- data/core/src/services/monoiofs/config.rs +34 -0
- data/core/src/services/monoiofs/core.rs +313 -0
- data/core/src/services/monoiofs/delete.rs +64 -0
- data/core/src/services/monoiofs/docs.md +46 -0
- data/core/src/services/monoiofs/mod.rs +36 -0
- data/core/src/services/monoiofs/reader.rs +147 -0
- data/core/src/services/monoiofs/writer.rs +189 -0
- data/core/src/services/mysql/backend.rs +256 -0
- data/core/src/services/mysql/config.rs +66 -0
- data/core/src/services/mysql/docs.md +47 -0
- data/core/src/services/mysql/mod.rs +24 -0
- data/core/src/services/obs/backend.rs +442 -0
- data/core/src/services/obs/config.rs +53 -0
- data/core/src/services/obs/core.rs +608 -0
- data/core/src/services/obs/delete.rs +48 -0
- data/core/src/services/obs/docs.md +54 -0
- data/core/src/services/obs/error.rs +106 -0
- data/core/src/services/obs/lister.rs +101 -0
- data/core/src/services/obs/mod.rs +38 -0
- data/core/src/services/obs/writer.rs +235 -0
- data/core/src/services/onedrive/backend.rs +127 -0
- data/core/src/services/onedrive/builder.rs +236 -0
- data/core/src/services/onedrive/config.rs +49 -0
- data/core/src/services/onedrive/core.rs +691 -0
- data/core/src/services/onedrive/delete.rs +47 -0
- data/core/src/services/onedrive/docs.md +115 -0
- data/core/src/services/onedrive/error.rs +61 -0
- data/core/src/services/onedrive/graph_model.rs +425 -0
- data/core/src/services/onedrive/lister.rs +150 -0
- data/core/src/services/onedrive/mod.rs +42 -0
- data/core/src/services/onedrive/writer.rs +168 -0
- data/core/src/services/opfs/backend.rs +50 -0
- data/core/src/services/opfs/config.rs +25 -0
- data/core/src/services/opfs/core.rs +74 -0
- data/core/src/services/opfs/docs.md +18 -0
- data/core/src/services/opfs/error.rs +27 -0
- data/core/src/services/opfs/mod.rs +30 -0
- data/core/src/services/opfs/utils.rs +70 -0
- data/core/src/services/oss/backend.rs +734 -0
- data/core/src/services/oss/config.rs +113 -0
- data/core/src/services/oss/core.rs +1088 -0
- data/core/src/services/oss/delete.rs +109 -0
- data/core/src/services/oss/docs.md +74 -0
- data/core/src/services/oss/error.rs +109 -0
- data/core/src/services/oss/lister.rs +256 -0
- data/core/src/services/oss/mod.rs +38 -0
- data/core/src/services/oss/writer.rs +228 -0
- data/core/src/services/pcloud/backend.rs +358 -0
- data/core/src/services/pcloud/config.rs +51 -0
- data/core/src/services/pcloud/core.rs +461 -0
- data/core/src/services/pcloud/delete.rs +66 -0
- data/core/src/services/pcloud/docs.md +51 -0
- data/core/src/services/pcloud/error.rs +88 -0
- data/core/src/services/pcloud/lister.rs +95 -0
- data/core/src/services/pcloud/mod.rs +38 -0
- data/core/src/services/pcloud/writer.rs +66 -0
- data/core/src/services/persy/backend.rs +226 -0
- data/core/src/services/persy/config.rs +32 -0
- data/core/src/services/persy/docs.md +43 -0
- data/core/src/services/persy/mod.rs +24 -0
- data/core/src/services/postgresql/backend.rs +258 -0
- data/core/src/services/postgresql/config.rs +66 -0
- data/core/src/services/postgresql/docs.md +47 -0
- data/core/src/services/postgresql/mod.rs +24 -0
- data/core/src/services/redb/backend.rs +280 -0
- data/core/src/services/redb/config.rs +34 -0
- data/core/src/services/redb/docs.md +41 -0
- data/core/src/services/redb/mod.rs +24 -0
- data/core/src/services/redis/backend.rs +442 -0
- data/core/src/services/redis/config.rs +79 -0
- data/core/src/services/redis/core.rs +209 -0
- data/core/src/services/redis/delete.rs +40 -0
- data/core/src/services/redis/docs.md +43 -0
- data/core/src/services/redis/mod.rs +34 -0
- data/core/src/services/redis/writer.rs +57 -0
- data/core/src/services/rocksdb/backend.rs +159 -0
- data/core/src/services/rocksdb/config.rs +34 -0
- data/core/src/services/rocksdb/docs.md +54 -0
- data/core/src/services/rocksdb/mod.rs +24 -0
- data/core/src/services/s3/backend.rs +1293 -0
- data/core/src/services/s3/compatible_services.md +126 -0
- data/core/src/services/s3/config.rs +327 -0
- data/core/src/services/s3/core.rs +1741 -0
- data/core/src/services/s3/delete.rs +109 -0
- data/core/src/services/s3/docs.md +244 -0
- data/core/src/services/s3/error.rs +171 -0
- data/core/src/services/s3/lister.rs +405 -0
- data/core/src/services/s3/mod.rs +38 -0
- data/core/src/services/s3/writer.rs +262 -0
- data/core/src/services/seafile/backend.rs +297 -0
- data/core/src/services/seafile/config.rs +56 -0
- data/core/src/services/seafile/core.rs +475 -0
- data/core/src/services/seafile/delete.rs +40 -0
- data/core/src/services/seafile/docs.md +54 -0
- data/core/src/services/seafile/error.rs +86 -0
- data/core/src/services/seafile/lister.rs +83 -0
- data/core/src/services/seafile/mod.rs +38 -0
- data/core/src/services/seafile/writer.rs +55 -0
- data/core/src/services/sftp/backend.rs +397 -0
- data/core/src/services/sftp/config.rs +50 -0
- data/core/src/services/sftp/core.rs +154 -0
- data/core/src/services/sftp/delete.rs +55 -0
- data/core/src/services/sftp/docs.md +49 -0
- data/core/src/services/sftp/error.rs +57 -0
- data/core/src/services/sftp/lister.rs +88 -0
- data/core/src/services/sftp/mod.rs +42 -0
- data/core/src/services/sftp/reader.rs +78 -0
- data/core/src/services/sftp/utils.rs +51 -0
- data/core/src/services/sftp/writer.rs +67 -0
- data/core/src/services/sled/backend.rs +194 -0
- data/core/src/services/sled/config.rs +45 -0
- data/core/src/services/sled/docs.md +39 -0
- data/core/src/services/sled/mod.rs +24 -0
- data/core/src/services/sqlite/backend.rs +326 -0
- data/core/src/services/sqlite/config.rs +70 -0
- data/core/src/services/sqlite/docs.md +46 -0
- data/core/src/services/sqlite/mod.rs +24 -0
- data/core/src/services/surrealdb/backend.rs +365 -0
- data/core/src/services/surrealdb/config.rs +64 -0
- data/core/src/services/surrealdb/docs.md +54 -0
- data/core/src/services/surrealdb/mod.rs +24 -0
- data/core/src/services/swift/backend.rs +275 -0
- data/core/src/services/swift/compatible_services.md +53 -0
- data/core/src/services/swift/config.rs +53 -0
- data/core/src/services/swift/core.rs +310 -0
- data/core/src/services/swift/delete.rs +49 -0
- data/core/src/services/swift/docs.md +52 -0
- data/core/src/services/swift/error.rs +90 -0
- data/core/src/services/swift/lister.rs +119 -0
- data/core/src/services/swift/mod.rs +38 -0
- data/core/src/services/swift/writer.rs +53 -0
- data/core/src/services/tikv/backend.rs +237 -0
- data/core/src/services/tikv/config.rs +52 -0
- data/core/src/services/tikv/docs.md +43 -0
- data/core/src/services/tikv/mod.rs +24 -0
- data/core/src/services/upyun/backend.rs +317 -0
- data/core/src/services/upyun/config.rs +51 -0
- data/core/src/services/upyun/core.rs +521 -0
- data/core/src/services/upyun/delete.rs +50 -0
- data/core/src/services/upyun/docs.md +51 -0
- data/core/src/services/upyun/error.rs +97 -0
- data/core/src/services/upyun/lister.rs +101 -0
- data/core/src/services/upyun/mod.rs +38 -0
- data/core/src/services/upyun/writer.rs +127 -0
- data/core/src/services/vercel_artifacts/backend.rs +99 -0
- data/core/src/services/vercel_artifacts/builder.rs +117 -0
- data/core/src/services/vercel_artifacts/config.rs +39 -0
- data/core/src/services/vercel_artifacts/core.rs +112 -0
- data/core/src/services/vercel_artifacts/docs.md +40 -0
- data/core/src/services/vercel_artifacts/error.rs +50 -0
- data/core/src/services/vercel_artifacts/mod.rs +36 -0
- data/core/src/services/vercel_artifacts/writer.rs +58 -0
- data/core/src/services/vercel_blob/backend.rs +251 -0
- data/core/src/services/vercel_blob/config.rs +45 -0
- data/core/src/services/vercel_blob/core.rs +449 -0
- data/core/src/services/vercel_blob/delete.rs +38 -0
- data/core/src/services/vercel_blob/docs.md +45 -0
- data/core/src/services/vercel_blob/error.rs +110 -0
- data/core/src/services/vercel_blob/lister.rs +69 -0
- data/core/src/services/vercel_blob/mod.rs +38 -0
- data/core/src/services/vercel_blob/writer.rs +143 -0
- data/core/src/services/webdav/backend.rs +318 -0
- data/core/src/services/webdav/config.rs +53 -0
- data/core/src/services/webdav/core.rs +859 -0
- data/core/src/services/webdav/delete.rs +47 -0
- data/core/src/services/webdav/docs.md +49 -0
- data/core/src/services/webdav/error.rs +53 -0
- data/core/src/services/webdav/lister.rs +106 -0
- data/core/src/services/webdav/mod.rs +38 -0
- data/core/src/services/webdav/writer.rs +56 -0
- data/core/src/services/webhdfs/backend.rs +376 -0
- data/core/src/services/webhdfs/config.rs +52 -0
- data/core/src/services/webhdfs/core.rs +398 -0
- data/core/src/services/webhdfs/delete.rs +46 -0
- data/core/src/services/webhdfs/docs.md +90 -0
- data/core/src/services/webhdfs/error.rs +126 -0
- data/core/src/services/webhdfs/lister.rs +130 -0
- data/core/src/services/webhdfs/message.rs +249 -0
- data/core/src/services/webhdfs/mod.rs +41 -0
- data/core/src/services/webhdfs/writer.rs +177 -0
- data/core/src/services/yandex_disk/backend.rs +267 -0
- data/core/src/services/yandex_disk/config.rs +45 -0
- data/core/src/services/yandex_disk/core.rs +340 -0
- data/core/src/services/yandex_disk/delete.rs +54 -0
- data/core/src/services/yandex_disk/docs.md +45 -0
- data/core/src/services/yandex_disk/error.rs +104 -0
- data/core/src/services/yandex_disk/lister.rs +113 -0
- data/core/src/services/yandex_disk/mod.rs +38 -0
- data/core/src/services/yandex_disk/writer.rs +52 -0
- data/core/src/types/buffer.rs +991 -0
- data/core/src/types/builder.rs +152 -0
- data/core/src/types/capability.rs +209 -0
- data/core/src/types/context/mod.rs +22 -0
- data/core/src/types/context/read.rs +231 -0
- data/core/src/types/context/write.rs +441 -0
- data/core/src/types/delete/deleter.rs +220 -0
- data/core/src/types/delete/futures_delete_sink.rs +176 -0
- data/core/src/types/delete/input.rs +97 -0
- data/core/src/types/delete/mod.rs +26 -0
- data/core/src/types/entry.rs +69 -0
- data/core/src/types/error.rs +570 -0
- data/core/src/types/execute/api.rs +110 -0
- data/core/src/types/execute/executor.rs +96 -0
- data/core/src/types/execute/executors/mod.rs +27 -0
- data/core/src/types/execute/executors/tokio_executor.rs +60 -0
- data/core/src/types/execute/mod.rs +25 -0
- data/core/src/types/list.rs +137 -0
- data/core/src/types/metadata.rs +436 -0
- data/core/src/types/mod.rs +72 -0
- data/core/src/types/mode.rs +68 -0
- data/core/src/types/operator/builder.rs +535 -0
- data/core/src/types/operator/info.rs +63 -0
- data/core/src/types/operator/mod.rs +33 -0
- data/core/src/types/operator/operator.rs +2236 -0
- data/core/src/types/operator/operator_futures.rs +1430 -0
- data/core/src/types/operator/registry.rs +129 -0
- data/core/src/types/options.rs +548 -0
- data/core/src/types/read/buffer_stream.rs +273 -0
- data/core/src/types/read/futures_async_reader.rs +289 -0
- data/core/src/types/read/futures_bytes_stream.rs +157 -0
- data/core/src/types/read/mod.rs +29 -0
- data/core/src/types/read/reader.rs +604 -0
- data/core/src/types/scheme.rs +475 -0
- data/core/src/types/write/buffer_sink.rs +188 -0
- data/core/src/types/write/futures_async_writer.rs +136 -0
- data/core/src/types/write/futures_bytes_sink.rs +103 -0
- data/core/src/types/write/mod.rs +26 -0
- data/core/src/types/write/writer.rs +411 -0
- data/core/tests/behavior/README.md +77 -0
- data/core/tests/behavior/async_copy.rs +314 -0
- data/core/tests/behavior/async_create_dir.rs +53 -0
- data/core/tests/behavior/async_delete.rs +354 -0
- data/core/tests/behavior/async_list.rs +739 -0
- data/core/tests/behavior/async_presign.rs +175 -0
- data/core/tests/behavior/async_read.rs +871 -0
- data/core/tests/behavior/async_rename.rs +210 -0
- data/core/tests/behavior/async_stat.rs +628 -0
- data/core/tests/behavior/async_write.rs +819 -0
- data/core/tests/behavior/main.rs +78 -0
- data/core/tests/behavior/utils.rs +187 -0
- data/core/tests/data/normal_dir/.gitkeep +0 -0
- data/core/tests/data/normal_file.txt +1041 -0
- data/core/tests/data/special_dir !@#$%^&()_+-=;',/.gitkeep +0 -0
- data/core/tests/data/special_file !@#$%^&()_+-=;',.txt +1041 -0
- data/core/users.md +13 -0
- data/extconf.rb +24 -0
- data/lib/opendal.rb +25 -0
- data/lib/opendal_ruby/entry.rb +35 -0
- data/lib/opendal_ruby/io.rb +70 -0
- data/lib/opendal_ruby/metadata.rb +44 -0
- data/lib/opendal_ruby/operator.rb +29 -0
- data/lib/opendal_ruby/operator_info.rb +26 -0
- data/src/capability.rs +146 -0
- data/src/io.rs +464 -0
- data/src/lib.rs +63 -0
- data/src/lister.rs +141 -0
- data/src/metadata.rs +111 -0
- data/src/middlewares.rs +174 -0
- data/src/operator.rs +310 -0
- data/src/operator_info.rs +83 -0
- data/test/blocking_op_test.rb +112 -0
- data/test/capability_test.rb +42 -0
- data/test/io_test.rb +172 -0
- data/test/lister_test.rb +77 -0
- data/test/metadata_test.rb +78 -0
- data/test/middlewares_test.rb +46 -0
- data/test/operator_info_test.rb +35 -0
- data/test/test_helper.rb +36 -0
- metadata +857 -0
|
@@ -0,0 +1,936 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::fmt::Debug;
|
|
19
|
+
use std::fmt::Formatter;
|
|
20
|
+
use std::pin::Pin;
|
|
21
|
+
use std::sync::Arc;
|
|
22
|
+
use std::task::ready;
|
|
23
|
+
use std::task::Context;
|
|
24
|
+
use std::task::Poll;
|
|
25
|
+
use std::time::Duration;
|
|
26
|
+
use std::time::Instant;
|
|
27
|
+
|
|
28
|
+
use futures::Stream;
|
|
29
|
+
use futures::StreamExt;
|
|
30
|
+
use http::StatusCode;
|
|
31
|
+
|
|
32
|
+
use crate::raw::*;
|
|
33
|
+
use crate::*;
|
|
34
|
+
|
|
35
|
+
const KIB: f64 = 1024.0;
|
|
36
|
+
const MIB: f64 = 1024.0 * KIB;
|
|
37
|
+
const GIB: f64 = 1024.0 * MIB;
|
|
38
|
+
|
|
39
|
+
/// Buckets for data size metrics like OperationBytes
|
|
40
|
+
/// Covers typical file and object sizes from small files to large objects
|
|
41
|
+
pub const DEFAULT_BYTES_BUCKETS: &[f64] = &[
|
|
42
|
+
4.0 * KIB, // Small files
|
|
43
|
+
64.0 * KIB, // File system block size
|
|
44
|
+
256.0 * KIB, //
|
|
45
|
+
1.0 * MIB, // Common size threshold for many systems
|
|
46
|
+
4.0 * MIB, // Best size for most http based systems
|
|
47
|
+
16.0 * MIB, //
|
|
48
|
+
64.0 * MIB, // Widely used threshold for multipart uploads
|
|
49
|
+
256.0 * MIB, //
|
|
50
|
+
1.0 * GIB, // Considered large for many systems
|
|
51
|
+
5.0 * GIB, // Maximum size in single upload for many cloud storage services
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
/// Buckets for data transfer rate metrics like OperationBytesRate
|
|
55
|
+
///
|
|
56
|
+
/// Covers various network speeds from slow connections to high-speed transfers
|
|
57
|
+
///
|
|
58
|
+
/// Note: this is for single operation rate, not for total bandwidth.
|
|
59
|
+
pub const DEFAULT_BYTES_RATE_BUCKETS: &[f64] = &[
|
|
60
|
+
// Low-speed network range (mobile/weak connections)
|
|
61
|
+
8.0 * KIB, // ~64Kbps - 2G networks
|
|
62
|
+
32.0 * KIB, // ~256Kbps - 3G networks
|
|
63
|
+
128.0 * KIB, // ~1Mbps - Basic broadband
|
|
64
|
+
// Standard broadband range
|
|
65
|
+
1.0 * MIB, // ~8Mbps - Entry-level broadband
|
|
66
|
+
8.0 * MIB, // ~64Mbps - Fast broadband
|
|
67
|
+
32.0 * MIB, // ~256Mbps - Gigabit broadband
|
|
68
|
+
// High-performance network range
|
|
69
|
+
128.0 * MIB, // ~1Gbps - Standard datacenter
|
|
70
|
+
512.0 * MIB, // ~4Gbps - Fast datacenter
|
|
71
|
+
2.0 * GIB, // ~16Gbps - High-end interconnects
|
|
72
|
+
// Ultra-high-speed range
|
|
73
|
+
8.0 * GIB, // ~64Gbps - InfiniBand/RDMA
|
|
74
|
+
32.0 * GIB, // ~256Gbps - Top-tier datacenters
|
|
75
|
+
];
|
|
76
|
+
|
|
77
|
+
/// Buckets for batch operation entry counts (OperationEntriesCount)
|
|
78
|
+
/// Covers scenarios from single entry operations to large batch operations
|
|
79
|
+
pub const DEFAULT_ENTRIES_BUCKETS: &[f64] = &[
|
|
80
|
+
1.0, // Single item operations
|
|
81
|
+
5.0, // Very small batches
|
|
82
|
+
10.0, // Small batches
|
|
83
|
+
50.0, // Medium batches
|
|
84
|
+
100.0, // Standard batch size
|
|
85
|
+
500.0, // Large batches
|
|
86
|
+
1000.0, // Very large batches, API limits for some services
|
|
87
|
+
5000.0, // Huge batches, multi-page operations
|
|
88
|
+
10000.0, // Extremely large operations, multi-request batches
|
|
89
|
+
];
|
|
90
|
+
|
|
91
|
+
/// Buckets for batch operation processing rates (OperationEntriesRate)
|
|
92
|
+
/// Measures how many entries can be processed per second
|
|
93
|
+
pub const DEFAULT_ENTRIES_RATE_BUCKETS: &[f64] = &[
|
|
94
|
+
1.0, // Slowest processing, heavy operations per entry
|
|
95
|
+
10.0, // Slow processing, complex operations
|
|
96
|
+
50.0, // Moderate processing speed
|
|
97
|
+
100.0, // Good processing speed, efficient operations
|
|
98
|
+
500.0, // Fast processing, optimized operations
|
|
99
|
+
1000.0, // Very fast processing, simple operations
|
|
100
|
+
5000.0, // Extremely fast processing, bulk operations
|
|
101
|
+
10000.0, // Maximum speed, listing operations, local systems
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
/// Buckets for operation duration metrics like OperationDurationSeconds
|
|
105
|
+
/// Covers timeframes from fast metadata operations to long-running transfers
|
|
106
|
+
pub const DEFAULT_DURATION_SECONDS_BUCKETS: &[f64] = &[
|
|
107
|
+
0.001, // 1ms - Fastest operations, cached responses
|
|
108
|
+
0.01, // 10ms - Fast metadata operations, local operations
|
|
109
|
+
0.05, // 50ms - Quick operations, nearby cloud resources
|
|
110
|
+
0.1, // 100ms - Standard API response times, typical cloud latency
|
|
111
|
+
0.25, // 250ms - Medium operations, small data transfers
|
|
112
|
+
0.5, // 500ms - Medium-long operations, larger metadata operations
|
|
113
|
+
1.0, // 1s - Long operations, small file transfers
|
|
114
|
+
2.5, // 2.5s - Extended operations, medium file transfers
|
|
115
|
+
5.0, // 5s - Long-running operations, large transfers
|
|
116
|
+
10.0, // 10s - Very long operations, very large transfers
|
|
117
|
+
30.0, // 30s - Extended operations, complex batch processes
|
|
118
|
+
60.0, // 1min - Near timeout operations, extremely large transfers
|
|
119
|
+
];
|
|
120
|
+
|
|
121
|
+
/// Buckets for time to first byte metrics like OperationTtfbSeconds
|
|
122
|
+
/// Focuses on initial response times, which are typically shorter than full operations
|
|
123
|
+
pub const DEFAULT_TTFB_BUCKETS: &[f64] = &[
|
|
124
|
+
0.001, // 1ms - Cached or local resources
|
|
125
|
+
0.01, // 10ms - Very fast responses, same region
|
|
126
|
+
0.025, // 25ms - Fast responses, optimized configurations
|
|
127
|
+
0.05, // 50ms - Good response times, standard configurations
|
|
128
|
+
0.1, // 100ms - Average response times for cloud storage
|
|
129
|
+
0.2, // 200ms - Slower responses, cross-region or throttled
|
|
130
|
+
0.4, // 400ms - Poor response times, network congestion
|
|
131
|
+
0.8, // 800ms - Very slow responses, potential issues
|
|
132
|
+
1.6, // 1.6s - Problematic responses, retry territory
|
|
133
|
+
3.2, // 3.2s - Critical latency issues, close to timeouts
|
|
134
|
+
];
|
|
135
|
+
|
|
136
|
+
/// The metric label for the scheme like s3, fs, cos.
|
|
137
|
+
pub static LABEL_SCHEME: &str = "scheme";
|
|
138
|
+
/// The metric label for the namespace like bucket name in s3.
|
|
139
|
+
pub static LABEL_NAMESPACE: &str = "namespace";
|
|
140
|
+
/// The metric label for the root path.
|
|
141
|
+
pub static LABEL_ROOT: &str = "root";
|
|
142
|
+
/// The metric label for the operation like read, write, list.
|
|
143
|
+
pub static LABEL_OPERATION: &str = "operation";
|
|
144
|
+
/// The metric label for the error.
|
|
145
|
+
pub static LABEL_ERROR: &str = "error";
|
|
146
|
+
/// The metric label for the http code.
|
|
147
|
+
pub static LABEL_STATUS_CODE: &str = "status_code";
|
|
148
|
+
|
|
149
|
+
/// MetricLabels are the labels for the metrics.
|
|
150
|
+
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash)]
|
|
151
|
+
pub struct MetricLabels {
|
|
152
|
+
/// The storage scheme identifier (e.g., "s3", "gcs", "azblob", "fs").
|
|
153
|
+
/// Used to differentiate between different storage backends.
|
|
154
|
+
pub scheme: &'static str,
|
|
155
|
+
/// The storage namespace (e.g., bucket name, container name).
|
|
156
|
+
/// Identifies the specific storage container being accessed.
|
|
157
|
+
pub namespace: Arc<str>,
|
|
158
|
+
/// The root path within the namespace that was configured.
|
|
159
|
+
/// Used to track operations within a specific path prefix.
|
|
160
|
+
pub root: Arc<str>,
|
|
161
|
+
/// The operation being performed (e.g., "read", "write", "list").
|
|
162
|
+
/// Identifies which API operation generated this metric.
|
|
163
|
+
pub operation: &'static str,
|
|
164
|
+
/// The specific error kind that occurred during an operation.
|
|
165
|
+
/// Only populated for `OperationErrorsTotal` metric.
|
|
166
|
+
/// Used to track frequency of specific error types.
|
|
167
|
+
pub error: Option<ErrorKind>,
|
|
168
|
+
/// The HTTP status code received in an error response.
|
|
169
|
+
/// Only populated for `HttpStatusErrorsTotal` metric.
|
|
170
|
+
/// Used to track frequency of specific HTTP error status codes.
|
|
171
|
+
pub status_code: Option<StatusCode>,
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
impl MetricLabels {
|
|
175
|
+
/// Create a new set of MetricLabels.
|
|
176
|
+
fn new(info: Arc<AccessorInfo>, op: &'static str) -> Self {
|
|
177
|
+
MetricLabels {
|
|
178
|
+
scheme: info.scheme(),
|
|
179
|
+
namespace: info.name(),
|
|
180
|
+
root: info.root(),
|
|
181
|
+
operation: op,
|
|
182
|
+
..MetricLabels::default()
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/// Add error to the metric labels.
|
|
187
|
+
fn with_error(mut self, err: ErrorKind) -> Self {
|
|
188
|
+
self.error = Some(err);
|
|
189
|
+
self
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/// Add status code to the metric labels.
|
|
193
|
+
fn with_status_code(mut self, code: StatusCode) -> Self {
|
|
194
|
+
self.status_code = Some(code);
|
|
195
|
+
self
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/// MetricValue is the value the opendal sends to the metrics impls.
|
|
200
|
+
///
|
|
201
|
+
/// Metrics impls can be `prometheus_client`, `metrics` etc.
|
|
202
|
+
///
|
|
203
|
+
/// Every metrics impls SHOULD implement observe over the MetricValue to make
|
|
204
|
+
/// sure they provide the consistent metrics for users.
|
|
205
|
+
#[non_exhaustive]
|
|
206
|
+
#[derive(Debug, Clone, Copy)]
|
|
207
|
+
pub enum MetricValue {
|
|
208
|
+
/// Record the size of data processed in bytes.
|
|
209
|
+
/// Metrics impl: Update a Histogram with the given byte count.
|
|
210
|
+
OperationBytes(u64),
|
|
211
|
+
/// Record the rate of data processing in bytes/second.
|
|
212
|
+
/// Metrics impl: Update a Histogram with the calculated rate value.
|
|
213
|
+
OperationBytesRate(f64),
|
|
214
|
+
/// Record the number of entries (files, objects, keys) processed.
|
|
215
|
+
/// Metrics impl: Update a Histogram with the entry count.
|
|
216
|
+
OperationEntries(u64),
|
|
217
|
+
/// Record the rate of entries processing in entries/second.
|
|
218
|
+
/// Metrics impl: Update a Histogram with the calculated rate value.
|
|
219
|
+
OperationEntriesRate(f64),
|
|
220
|
+
/// Record the total duration of an operation.
|
|
221
|
+
/// Metrics impl: Update a Histogram with the duration converted to seconds (as f64).
|
|
222
|
+
OperationDurationSeconds(Duration),
|
|
223
|
+
/// Increment the counter for operation errors.
|
|
224
|
+
/// Metrics impl: Increment a Counter by 1.
|
|
225
|
+
OperationErrorsTotal,
|
|
226
|
+
/// Update the current number of executing operations.
|
|
227
|
+
/// Metrics impl: Add the value (positive or negative) to a Gauge.
|
|
228
|
+
OperationExecuting(isize),
|
|
229
|
+
/// Record the time to first byte duration.
|
|
230
|
+
/// Metrics impl: Update a Histogram with the duration converted to seconds (as f64).
|
|
231
|
+
OperationTtfbSeconds(Duration),
|
|
232
|
+
/// Update the current number of executing HTTP requests.
|
|
233
|
+
/// Metrics impl: Add the value (positive or negative) to a Gauge.
|
|
234
|
+
HttpExecuting(isize),
|
|
235
|
+
/// Record the size of HTTP request body in bytes.
|
|
236
|
+
/// Metrics impl: Update a Histogram with the given byte count.
|
|
237
|
+
HttpRequestBytes(u64),
|
|
238
|
+
/// Record the rate of HTTP request data in bytes/second.
|
|
239
|
+
/// Metrics impl: Update a Histogram with the calculated rate value.
|
|
240
|
+
HttpRequestBytesRate(f64),
|
|
241
|
+
/// Record the duration of sending an HTTP request (until first byte received).
|
|
242
|
+
/// Metrics impl: Update a Histogram with the duration converted to seconds (as f64).
|
|
243
|
+
HttpRequestDurationSeconds(Duration),
|
|
244
|
+
/// Record the size of HTTP response body in bytes.
|
|
245
|
+
/// Metrics impl: Update a Histogram with the given byte count.
|
|
246
|
+
HttpResponseBytes(u64),
|
|
247
|
+
/// Record the rate of HTTP response data in bytes/second.
|
|
248
|
+
/// Metrics impl: Update a Histogram with the calculated rate value.
|
|
249
|
+
HttpResponseBytesRate(f64),
|
|
250
|
+
/// Record the duration of receiving an HTTP response (from first byte to last).
|
|
251
|
+
/// Metrics impl: Update a Histogram with the duration converted to seconds (as f64).
|
|
252
|
+
HttpResponseDurationSeconds(Duration),
|
|
253
|
+
/// Increment the counter for HTTP connection errors.
|
|
254
|
+
/// Metrics impl: Increment a Counter by 1.
|
|
255
|
+
HttpConnectionErrorsTotal,
|
|
256
|
+
/// Increment the counter for HTTP status errors (non-2xx responses).
|
|
257
|
+
/// Metrics impl: Increment a Counter by 1.
|
|
258
|
+
HttpStatusErrorsTotal,
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
impl MetricValue {
|
|
262
|
+
/// Returns the full metric name for this metric value.
|
|
263
|
+
pub fn name(&self) -> &'static str {
|
|
264
|
+
match self {
|
|
265
|
+
MetricValue::OperationBytes(_) => "opendal_operation_bytes",
|
|
266
|
+
MetricValue::OperationBytesRate(_) => "opendal_operation_bytes_rate",
|
|
267
|
+
MetricValue::OperationEntries(_) => "opendal_operation_entries",
|
|
268
|
+
MetricValue::OperationEntriesRate(_) => "opendal_operation_entries_rate",
|
|
269
|
+
MetricValue::OperationDurationSeconds(_) => "opendal_operation_duration_seconds",
|
|
270
|
+
MetricValue::OperationErrorsTotal => "opendal_operation_errors_total",
|
|
271
|
+
MetricValue::OperationExecuting(_) => "opendal_operation_executing",
|
|
272
|
+
MetricValue::OperationTtfbSeconds(_) => "opendal_operation_ttfb_seconds",
|
|
273
|
+
|
|
274
|
+
MetricValue::HttpConnectionErrorsTotal => "opendal_http_connection_errors_total",
|
|
275
|
+
MetricValue::HttpStatusErrorsTotal => "opendal_http_status_errors_total",
|
|
276
|
+
MetricValue::HttpExecuting(_) => "opendal_http_executing",
|
|
277
|
+
MetricValue::HttpRequestBytes(_) => "opendal_http_request_bytes",
|
|
278
|
+
MetricValue::HttpRequestBytesRate(_) => "opendal_http_request_bytes_rate",
|
|
279
|
+
MetricValue::HttpRequestDurationSeconds(_) => "opendal_http_request_duration_seconds",
|
|
280
|
+
MetricValue::HttpResponseBytes(_) => "opendal_http_response_bytes",
|
|
281
|
+
MetricValue::HttpResponseBytesRate(_) => "opendal_http_response_bytes_rate",
|
|
282
|
+
MetricValue::HttpResponseDurationSeconds(_) => "opendal_http_response_duration_seconds",
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/// Returns the metric name along with unit for this metric value.
|
|
287
|
+
///
|
|
288
|
+
/// # Notes
|
|
289
|
+
///
|
|
290
|
+
/// This API is designed for the metrics impls that unit aware. They will handle the names by themselves like append `_total` for counters.
|
|
291
|
+
pub fn name_with_unit(&self) -> (&'static str, Option<&'static str>) {
|
|
292
|
+
match self {
|
|
293
|
+
MetricValue::OperationBytes(_) => ("opendal_operation", Some("bytes")),
|
|
294
|
+
MetricValue::OperationBytesRate(_) => ("opendal_operation_bytes_rate", None),
|
|
295
|
+
MetricValue::OperationEntries(_) => ("opendal_operation_entries", None),
|
|
296
|
+
MetricValue::OperationEntriesRate(_) => ("opendal_operation_entries_rate", None),
|
|
297
|
+
MetricValue::OperationDurationSeconds(_) => {
|
|
298
|
+
("opendal_operation_duration", Some("seconds"))
|
|
299
|
+
}
|
|
300
|
+
MetricValue::OperationErrorsTotal => ("opendal_operation_errors", None),
|
|
301
|
+
MetricValue::OperationExecuting(_) => ("opendal_operation_executing", None),
|
|
302
|
+
MetricValue::OperationTtfbSeconds(_) => ("opendal_operation_ttfb", Some("seconds")),
|
|
303
|
+
|
|
304
|
+
MetricValue::HttpConnectionErrorsTotal => ("opendal_http_connection_errors", None),
|
|
305
|
+
MetricValue::HttpStatusErrorsTotal => ("opendal_http_status_errors", None),
|
|
306
|
+
MetricValue::HttpExecuting(_) => ("opendal_http_executing", None),
|
|
307
|
+
MetricValue::HttpRequestBytes(_) => ("opendal_http_request", Some("bytes")),
|
|
308
|
+
MetricValue::HttpRequestBytesRate(_) => ("opendal_http_request_bytes_rate", None),
|
|
309
|
+
MetricValue::HttpRequestDurationSeconds(_) => {
|
|
310
|
+
("opendal_http_request_duration", Some("seconds"))
|
|
311
|
+
}
|
|
312
|
+
MetricValue::HttpResponseBytes(_) => ("opendal_http_response", Some("bytes")),
|
|
313
|
+
MetricValue::HttpResponseBytesRate(_) => ("opendal_http_response_bytes_rate", None),
|
|
314
|
+
MetricValue::HttpResponseDurationSeconds(_) => {
|
|
315
|
+
("opendal_http_response_duration", Some("seconds"))
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/// Returns the help text for this metric value.
|
|
321
|
+
pub fn help(&self) -> &'static str {
|
|
322
|
+
match self {
|
|
323
|
+
MetricValue::OperationBytes(_) => "Current operation size in bytes, represents the size of data being processed in the current operation",
|
|
324
|
+
MetricValue::OperationBytesRate(_) => "Histogram of data processing rates in bytes per second within individual operations",
|
|
325
|
+
MetricValue::OperationEntries(_) => "Current operation size in entries, represents the entries being processed in the current operation",
|
|
326
|
+
MetricValue::OperationEntriesRate(_) => "Histogram of entries processing rates in entries per second within individual operations",
|
|
327
|
+
MetricValue::OperationDurationSeconds(_) => "Duration of operations in seconds, measured from start to completion",
|
|
328
|
+
MetricValue::OperationErrorsTotal => "Total number of failed operations",
|
|
329
|
+
MetricValue::OperationExecuting(_) => "Number of operations currently being executed",
|
|
330
|
+
MetricValue::OperationTtfbSeconds(_) => "Time to first byte in seconds for operations",
|
|
331
|
+
|
|
332
|
+
MetricValue::HttpConnectionErrorsTotal => "Total number of HTTP requests that failed before receiving a response (DNS failures, connection refused, timeouts, TLS errors)",
|
|
333
|
+
MetricValue::HttpStatusErrorsTotal => "Total number of HTTP requests that received error status codes (non-2xx responses)",
|
|
334
|
+
MetricValue::HttpExecuting(_) => "Number of HTTP requests currently in flight from this client",
|
|
335
|
+
MetricValue::HttpRequestBytes(_) => "Histogram of HTTP request body sizes in bytes",
|
|
336
|
+
MetricValue::HttpRequestBytesRate(_) => "Histogram of HTTP request bytes per second rates",
|
|
337
|
+
MetricValue::HttpRequestDurationSeconds(_) => "Histogram of time durations in seconds spent sending HTTP requests, from first byte sent to receiving the first byte",
|
|
338
|
+
MetricValue::HttpResponseBytes(_) => "Histogram of HTTP response body sizes in bytes",
|
|
339
|
+
MetricValue::HttpResponseBytesRate(_) => "Histogram of HTTP response bytes per second rates",
|
|
340
|
+
MetricValue::HttpResponseDurationSeconds(_) => "Histogram of time durations in seconds spent receiving HTTP responses, from first byte received to last byte received",
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/// The interceptor for metrics.
|
|
346
|
+
///
|
|
347
|
+
/// All metrics related libs should implement this trait to observe opendal's internal operations.
|
|
348
|
+
pub trait MetricsIntercept: Debug + Clone + Send + Sync + Unpin + 'static {
|
|
349
|
+
/// Observe the metric value.
|
|
350
|
+
fn observe(&self, labels: MetricLabels, value: MetricValue) {
|
|
351
|
+
let _ = (labels, value);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/// The metrics layer for opendal.
|
|
356
|
+
#[derive(Clone, Debug)]
|
|
357
|
+
pub struct MetricsLayer<I: MetricsIntercept> {
|
|
358
|
+
interceptor: I,
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
impl<I: MetricsIntercept> MetricsLayer<I> {
|
|
362
|
+
/// Create a new metrics layer.
|
|
363
|
+
pub fn new(interceptor: I) -> Self {
|
|
364
|
+
Self { interceptor }
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
impl<A: Access, I: MetricsIntercept> Layer<A> for MetricsLayer<I> {
|
|
369
|
+
type LayeredAccess = MetricsAccessor<A, I>;
|
|
370
|
+
|
|
371
|
+
fn layer(&self, inner: A) -> Self::LayeredAccess {
|
|
372
|
+
let info = inner.info();
|
|
373
|
+
|
|
374
|
+
// Update http client with metrics http fetcher.
|
|
375
|
+
info.update_http_client(|client| {
|
|
376
|
+
HttpClient::with(MetricsHttpFetcher {
|
|
377
|
+
inner: client.into_inner(),
|
|
378
|
+
info: info.clone(),
|
|
379
|
+
interceptor: self.interceptor.clone(),
|
|
380
|
+
})
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
MetricsAccessor {
|
|
384
|
+
inner,
|
|
385
|
+
info,
|
|
386
|
+
interceptor: self.interceptor.clone(),
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/// The metrics http fetcher for opendal.
|
|
392
|
+
pub struct MetricsHttpFetcher<I: MetricsIntercept> {
|
|
393
|
+
inner: HttpFetcher,
|
|
394
|
+
info: Arc<AccessorInfo>,
|
|
395
|
+
interceptor: I,
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
impl<I: MetricsIntercept> HttpFetch for MetricsHttpFetcher<I> {
|
|
399
|
+
async fn fetch(&self, req: http::Request<Buffer>) -> Result<http::Response<HttpBody>> {
|
|
400
|
+
let labels = MetricLabels::new(
|
|
401
|
+
self.info.clone(),
|
|
402
|
+
req.extensions()
|
|
403
|
+
.get::<Operation>()
|
|
404
|
+
.copied()
|
|
405
|
+
.map(Operation::into_static)
|
|
406
|
+
.unwrap_or("unknown"),
|
|
407
|
+
);
|
|
408
|
+
|
|
409
|
+
let start = Instant::now();
|
|
410
|
+
let req_size = req.body().len();
|
|
411
|
+
|
|
412
|
+
self.interceptor
|
|
413
|
+
.observe(labels.clone(), MetricValue::HttpExecuting(1));
|
|
414
|
+
|
|
415
|
+
let res = self.inner.fetch(req).await;
|
|
416
|
+
let req_duration = start.elapsed();
|
|
417
|
+
|
|
418
|
+
match res {
|
|
419
|
+
Err(err) => {
|
|
420
|
+
self.interceptor
|
|
421
|
+
.observe(labels.clone(), MetricValue::HttpExecuting(-1));
|
|
422
|
+
self.interceptor
|
|
423
|
+
.observe(labels, MetricValue::HttpConnectionErrorsTotal);
|
|
424
|
+
Err(err)
|
|
425
|
+
}
|
|
426
|
+
Ok(resp) if resp.status().is_client_error() && resp.status().is_server_error() => {
|
|
427
|
+
self.interceptor
|
|
428
|
+
.observe(labels.clone(), MetricValue::HttpExecuting(-1));
|
|
429
|
+
self.interceptor.observe(
|
|
430
|
+
labels.with_status_code(resp.status()),
|
|
431
|
+
MetricValue::HttpStatusErrorsTotal,
|
|
432
|
+
);
|
|
433
|
+
Ok(resp)
|
|
434
|
+
}
|
|
435
|
+
Ok(resp) => {
|
|
436
|
+
self.interceptor.observe(
|
|
437
|
+
labels.clone(),
|
|
438
|
+
MetricValue::HttpRequestBytes(req_size as u64),
|
|
439
|
+
);
|
|
440
|
+
self.interceptor.observe(
|
|
441
|
+
labels.clone(),
|
|
442
|
+
MetricValue::HttpRequestBytesRate(req_size as f64 / req_duration.as_secs_f64()),
|
|
443
|
+
);
|
|
444
|
+
self.interceptor.observe(
|
|
445
|
+
labels.clone(),
|
|
446
|
+
MetricValue::HttpRequestDurationSeconds(req_duration),
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
let (parts, body) = resp.into_parts();
|
|
450
|
+
let body = body.map_inner(|s| {
|
|
451
|
+
Box::new(MetricsStream {
|
|
452
|
+
inner: s,
|
|
453
|
+
interceptor: self.interceptor.clone(),
|
|
454
|
+
labels: labels.clone(),
|
|
455
|
+
size: 0,
|
|
456
|
+
start: Instant::now(),
|
|
457
|
+
})
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
Ok(http::Response::from_parts(parts, body))
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
pub struct MetricsStream<S, I> {
|
|
467
|
+
inner: S,
|
|
468
|
+
interceptor: I,
|
|
469
|
+
|
|
470
|
+
labels: MetricLabels,
|
|
471
|
+
size: u64,
|
|
472
|
+
start: Instant,
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
impl<S, I> Stream for MetricsStream<S, I>
|
|
476
|
+
where
|
|
477
|
+
S: Stream<Item = Result<Buffer>> + Unpin + 'static,
|
|
478
|
+
I: MetricsIntercept,
|
|
479
|
+
{
|
|
480
|
+
type Item = Result<Buffer>;
|
|
481
|
+
|
|
482
|
+
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
|
|
483
|
+
match ready!(self.inner.poll_next_unpin(cx)) {
|
|
484
|
+
Some(Ok(bs)) => {
|
|
485
|
+
self.size += bs.len() as u64;
|
|
486
|
+
Poll::Ready(Some(Ok(bs)))
|
|
487
|
+
}
|
|
488
|
+
Some(Err(err)) => Poll::Ready(Some(Err(err))),
|
|
489
|
+
None => {
|
|
490
|
+
let resp_size = self.size;
|
|
491
|
+
let resp_duration = self.start.elapsed();
|
|
492
|
+
|
|
493
|
+
self.interceptor.observe(
|
|
494
|
+
self.labels.clone(),
|
|
495
|
+
MetricValue::HttpResponseBytes(resp_size),
|
|
496
|
+
);
|
|
497
|
+
self.interceptor.observe(
|
|
498
|
+
self.labels.clone(),
|
|
499
|
+
MetricValue::HttpResponseBytesRate(
|
|
500
|
+
resp_size as f64 / resp_duration.as_secs_f64(),
|
|
501
|
+
),
|
|
502
|
+
);
|
|
503
|
+
self.interceptor.observe(
|
|
504
|
+
self.labels.clone(),
|
|
505
|
+
MetricValue::HttpResponseDurationSeconds(resp_duration),
|
|
506
|
+
);
|
|
507
|
+
self.interceptor
|
|
508
|
+
.observe(self.labels.clone(), MetricValue::HttpExecuting(-1));
|
|
509
|
+
|
|
510
|
+
Poll::Ready(None)
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/// The metrics accessor for opendal.
|
|
517
|
+
pub struct MetricsAccessor<A: Access, I: MetricsIntercept> {
|
|
518
|
+
inner: A,
|
|
519
|
+
info: Arc<AccessorInfo>,
|
|
520
|
+
interceptor: I,
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
impl<A: Access, I: MetricsIntercept> Debug for MetricsAccessor<A, I> {
|
|
524
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
525
|
+
f.debug_struct("MetricsAccessor")
|
|
526
|
+
.field("inner", &self.inner)
|
|
527
|
+
.finish_non_exhaustive()
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
impl<A: Access, I: MetricsIntercept> LayeredAccess for MetricsAccessor<A, I> {
|
|
532
|
+
type Inner = A;
|
|
533
|
+
type Reader = MetricsWrapper<A::Reader, I>;
|
|
534
|
+
type Writer = MetricsWrapper<A::Writer, I>;
|
|
535
|
+
type Lister = MetricsWrapper<A::Lister, I>;
|
|
536
|
+
type Deleter = MetricsWrapper<A::Deleter, I>;
|
|
537
|
+
|
|
538
|
+
fn inner(&self) -> &Self::Inner {
|
|
539
|
+
&self.inner
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
async fn create_dir(&self, path: &str, args: OpCreateDir) -> Result<RpCreateDir> {
|
|
543
|
+
let labels = MetricLabels::new(self.info.clone(), Operation::CreateDir.into_static());
|
|
544
|
+
|
|
545
|
+
let start = Instant::now();
|
|
546
|
+
|
|
547
|
+
self.interceptor
|
|
548
|
+
.observe(labels.clone(), MetricValue::OperationExecuting(1));
|
|
549
|
+
|
|
550
|
+
let res = self
|
|
551
|
+
.inner()
|
|
552
|
+
.create_dir(path, args)
|
|
553
|
+
.await
|
|
554
|
+
.inspect(|_| {
|
|
555
|
+
self.interceptor.observe(
|
|
556
|
+
labels.clone(),
|
|
557
|
+
MetricValue::OperationDurationSeconds(start.elapsed()),
|
|
558
|
+
);
|
|
559
|
+
})
|
|
560
|
+
.inspect_err(|err| {
|
|
561
|
+
self.interceptor.observe(
|
|
562
|
+
labels.clone().with_error(err.kind()),
|
|
563
|
+
MetricValue::OperationErrorsTotal,
|
|
564
|
+
);
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
self.interceptor
|
|
568
|
+
.observe(labels, MetricValue::OperationExecuting(-1));
|
|
569
|
+
res
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
|
|
573
|
+
let labels = MetricLabels::new(self.info.clone(), Operation::Read.into_static());
|
|
574
|
+
|
|
575
|
+
let start = Instant::now();
|
|
576
|
+
|
|
577
|
+
self.interceptor
|
|
578
|
+
.observe(labels.clone(), MetricValue::OperationExecuting(1));
|
|
579
|
+
|
|
580
|
+
let (rp, reader) = self
|
|
581
|
+
.inner
|
|
582
|
+
.read(path, args)
|
|
583
|
+
.await
|
|
584
|
+
.inspect(|_| {
|
|
585
|
+
self.interceptor.observe(
|
|
586
|
+
labels.clone(),
|
|
587
|
+
MetricValue::OperationTtfbSeconds(start.elapsed()),
|
|
588
|
+
);
|
|
589
|
+
})
|
|
590
|
+
.inspect_err(|err| {
|
|
591
|
+
self.interceptor.observe(
|
|
592
|
+
labels.clone().with_error(err.kind()),
|
|
593
|
+
MetricValue::OperationErrorsTotal,
|
|
594
|
+
);
|
|
595
|
+
})?;
|
|
596
|
+
|
|
597
|
+
Ok((
|
|
598
|
+
rp,
|
|
599
|
+
MetricsWrapper::new(reader, self.interceptor.clone(), labels, start),
|
|
600
|
+
))
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::Writer)> {
|
|
604
|
+
let labels = MetricLabels::new(self.info.clone(), Operation::Write.into_static());
|
|
605
|
+
|
|
606
|
+
let start = Instant::now();
|
|
607
|
+
|
|
608
|
+
self.interceptor
|
|
609
|
+
.observe(labels.clone(), MetricValue::OperationExecuting(1));
|
|
610
|
+
|
|
611
|
+
let (rp, writer) = self.inner.write(path, args).await.inspect_err(|err| {
|
|
612
|
+
self.interceptor.observe(
|
|
613
|
+
labels.clone().with_error(err.kind()),
|
|
614
|
+
MetricValue::OperationErrorsTotal,
|
|
615
|
+
);
|
|
616
|
+
})?;
|
|
617
|
+
|
|
618
|
+
Ok((
|
|
619
|
+
rp,
|
|
620
|
+
MetricsWrapper::new(writer, self.interceptor.clone(), labels, start),
|
|
621
|
+
))
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
async fn copy(&self, from: &str, to: &str, args: OpCopy) -> Result<RpCopy> {
|
|
625
|
+
let labels = MetricLabels::new(self.info.clone(), Operation::Copy.into_static());
|
|
626
|
+
|
|
627
|
+
let start = Instant::now();
|
|
628
|
+
|
|
629
|
+
self.interceptor
|
|
630
|
+
.observe(labels.clone(), MetricValue::OperationExecuting(1));
|
|
631
|
+
|
|
632
|
+
let res = self
|
|
633
|
+
.inner()
|
|
634
|
+
.copy(from, to, args)
|
|
635
|
+
.await
|
|
636
|
+
.inspect(|_| {
|
|
637
|
+
self.interceptor.observe(
|
|
638
|
+
labels.clone(),
|
|
639
|
+
MetricValue::OperationDurationSeconds(start.elapsed()),
|
|
640
|
+
);
|
|
641
|
+
})
|
|
642
|
+
.inspect_err(|err| {
|
|
643
|
+
self.interceptor.observe(
|
|
644
|
+
labels.clone().with_error(err.kind()),
|
|
645
|
+
MetricValue::OperationErrorsTotal,
|
|
646
|
+
);
|
|
647
|
+
});
|
|
648
|
+
|
|
649
|
+
self.interceptor
|
|
650
|
+
.observe(labels, MetricValue::OperationExecuting(-1));
|
|
651
|
+
res
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
async fn rename(&self, from: &str, to: &str, args: OpRename) -> Result<RpRename> {
|
|
655
|
+
let labels = MetricLabels::new(self.info.clone(), Operation::Rename.into_static());
|
|
656
|
+
|
|
657
|
+
let start = Instant::now();
|
|
658
|
+
|
|
659
|
+
self.interceptor
|
|
660
|
+
.observe(labels.clone(), MetricValue::OperationExecuting(1));
|
|
661
|
+
|
|
662
|
+
let res = self
|
|
663
|
+
.inner()
|
|
664
|
+
.rename(from, to, args)
|
|
665
|
+
.await
|
|
666
|
+
.inspect(|_| {
|
|
667
|
+
self.interceptor.observe(
|
|
668
|
+
labels.clone(),
|
|
669
|
+
MetricValue::OperationDurationSeconds(start.elapsed()),
|
|
670
|
+
);
|
|
671
|
+
})
|
|
672
|
+
.inspect_err(|err| {
|
|
673
|
+
self.interceptor.observe(
|
|
674
|
+
labels.clone().with_error(err.kind()),
|
|
675
|
+
MetricValue::OperationErrorsTotal,
|
|
676
|
+
);
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
self.interceptor
|
|
680
|
+
.observe(labels, MetricValue::OperationExecuting(-1));
|
|
681
|
+
res
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
|
|
685
|
+
let labels = MetricLabels::new(self.info.clone(), Operation::Stat.into_static());
|
|
686
|
+
|
|
687
|
+
let start = Instant::now();
|
|
688
|
+
|
|
689
|
+
self.interceptor
|
|
690
|
+
.observe(labels.clone(), MetricValue::OperationExecuting(1));
|
|
691
|
+
|
|
692
|
+
let res = self
|
|
693
|
+
.inner()
|
|
694
|
+
.stat(path, args)
|
|
695
|
+
.await
|
|
696
|
+
.inspect(|_| {
|
|
697
|
+
self.interceptor.observe(
|
|
698
|
+
labels.clone(),
|
|
699
|
+
MetricValue::OperationDurationSeconds(start.elapsed()),
|
|
700
|
+
);
|
|
701
|
+
})
|
|
702
|
+
.inspect_err(|err| {
|
|
703
|
+
self.interceptor.observe(
|
|
704
|
+
labels.clone().with_error(err.kind()),
|
|
705
|
+
MetricValue::OperationErrorsTotal,
|
|
706
|
+
);
|
|
707
|
+
});
|
|
708
|
+
|
|
709
|
+
self.interceptor
|
|
710
|
+
.observe(labels, MetricValue::OperationExecuting(-1));
|
|
711
|
+
res
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
|
|
715
|
+
let labels = MetricLabels::new(self.info.clone(), Operation::Delete.into_static());
|
|
716
|
+
|
|
717
|
+
let start = Instant::now();
|
|
718
|
+
|
|
719
|
+
self.interceptor
|
|
720
|
+
.observe(labels.clone(), MetricValue::OperationExecuting(1));
|
|
721
|
+
|
|
722
|
+
let (rp, deleter) = self.inner.delete().await.inspect_err(|err| {
|
|
723
|
+
self.interceptor.observe(
|
|
724
|
+
labels.clone().with_error(err.kind()),
|
|
725
|
+
MetricValue::OperationErrorsTotal,
|
|
726
|
+
);
|
|
727
|
+
})?;
|
|
728
|
+
|
|
729
|
+
Ok((
|
|
730
|
+
rp,
|
|
731
|
+
MetricsWrapper::new(deleter, self.interceptor.clone(), labels, start),
|
|
732
|
+
))
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
|
|
736
|
+
let labels = MetricLabels::new(self.info.clone(), Operation::List.into_static());
|
|
737
|
+
|
|
738
|
+
let start = Instant::now();
|
|
739
|
+
|
|
740
|
+
self.interceptor
|
|
741
|
+
.observe(labels.clone(), MetricValue::OperationExecuting(1));
|
|
742
|
+
|
|
743
|
+
let (rp, lister) = self.inner.list(path, args).await.inspect_err(|err| {
|
|
744
|
+
self.interceptor.observe(
|
|
745
|
+
labels.clone().with_error(err.kind()),
|
|
746
|
+
MetricValue::OperationErrorsTotal,
|
|
747
|
+
);
|
|
748
|
+
})?;
|
|
749
|
+
|
|
750
|
+
Ok((
|
|
751
|
+
rp,
|
|
752
|
+
MetricsWrapper::new(lister, self.interceptor.clone(), labels, start),
|
|
753
|
+
))
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
async fn presign(&self, path: &str, args: OpPresign) -> Result<RpPresign> {
|
|
757
|
+
let labels = MetricLabels::new(self.info.clone(), Operation::Presign.into_static());
|
|
758
|
+
|
|
759
|
+
let start = Instant::now();
|
|
760
|
+
|
|
761
|
+
self.interceptor
|
|
762
|
+
.observe(labels.clone(), MetricValue::OperationExecuting(1));
|
|
763
|
+
|
|
764
|
+
let res = self
|
|
765
|
+
.inner()
|
|
766
|
+
.presign(path, args)
|
|
767
|
+
.await
|
|
768
|
+
.inspect(|_| {
|
|
769
|
+
self.interceptor.observe(
|
|
770
|
+
labels.clone(),
|
|
771
|
+
MetricValue::OperationDurationSeconds(start.elapsed()),
|
|
772
|
+
);
|
|
773
|
+
})
|
|
774
|
+
.inspect_err(|err| {
|
|
775
|
+
self.interceptor.observe(
|
|
776
|
+
labels.clone().with_error(err.kind()),
|
|
777
|
+
MetricValue::OperationErrorsTotal,
|
|
778
|
+
);
|
|
779
|
+
});
|
|
780
|
+
|
|
781
|
+
self.interceptor
|
|
782
|
+
.observe(labels, MetricValue::OperationExecuting(-1));
|
|
783
|
+
res
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
pub struct MetricsWrapper<R, I: MetricsIntercept> {
|
|
788
|
+
inner: R,
|
|
789
|
+
interceptor: I,
|
|
790
|
+
labels: MetricLabels,
|
|
791
|
+
|
|
792
|
+
start: Instant,
|
|
793
|
+
size: u64,
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
impl<R, I: MetricsIntercept> Drop for MetricsWrapper<R, I> {
|
|
797
|
+
fn drop(&mut self) {
|
|
798
|
+
let size = self.size;
|
|
799
|
+
let duration = self.start.elapsed();
|
|
800
|
+
|
|
801
|
+
if self.labels.operation == Operation::Read.into_static()
|
|
802
|
+
|| self.labels.operation == Operation::Write.into_static()
|
|
803
|
+
{
|
|
804
|
+
self.interceptor
|
|
805
|
+
.observe(self.labels.clone(), MetricValue::OperationBytes(self.size));
|
|
806
|
+
self.interceptor.observe(
|
|
807
|
+
self.labels.clone(),
|
|
808
|
+
MetricValue::OperationBytesRate(size as f64 / duration.as_secs_f64()),
|
|
809
|
+
);
|
|
810
|
+
} else {
|
|
811
|
+
self.interceptor.observe(
|
|
812
|
+
self.labels.clone(),
|
|
813
|
+
MetricValue::OperationEntries(self.size),
|
|
814
|
+
);
|
|
815
|
+
self.interceptor.observe(
|
|
816
|
+
self.labels.clone(),
|
|
817
|
+
MetricValue::OperationEntriesRate(size as f64 / duration.as_secs_f64()),
|
|
818
|
+
);
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
self.interceptor.observe(
|
|
822
|
+
self.labels.clone(),
|
|
823
|
+
MetricValue::OperationDurationSeconds(duration),
|
|
824
|
+
);
|
|
825
|
+
self.interceptor
|
|
826
|
+
.observe(self.labels.clone(), MetricValue::OperationExecuting(-1));
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
impl<R, I: MetricsIntercept> MetricsWrapper<R, I> {
|
|
831
|
+
fn new(inner: R, interceptor: I, labels: MetricLabels, start: Instant) -> Self {
|
|
832
|
+
Self {
|
|
833
|
+
inner,
|
|
834
|
+
interceptor,
|
|
835
|
+
labels,
|
|
836
|
+
start,
|
|
837
|
+
size: 0,
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
impl<R: oio::Read, I: MetricsIntercept> oio::Read for MetricsWrapper<R, I> {
|
|
843
|
+
async fn read(&mut self) -> Result<Buffer> {
|
|
844
|
+
self.inner
|
|
845
|
+
.read()
|
|
846
|
+
.await
|
|
847
|
+
.inspect(|bs| {
|
|
848
|
+
self.size += bs.len() as u64;
|
|
849
|
+
})
|
|
850
|
+
.inspect_err(|err| {
|
|
851
|
+
self.interceptor.observe(
|
|
852
|
+
self.labels.clone().with_error(err.kind()),
|
|
853
|
+
MetricValue::OperationErrorsTotal,
|
|
854
|
+
);
|
|
855
|
+
})
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
impl<R: oio::Write, I: MetricsIntercept> oio::Write for MetricsWrapper<R, I> {
|
|
860
|
+
async fn write(&mut self, bs: Buffer) -> Result<()> {
|
|
861
|
+
let size = bs.len();
|
|
862
|
+
|
|
863
|
+
self.inner
|
|
864
|
+
.write(bs)
|
|
865
|
+
.await
|
|
866
|
+
.inspect(|_| {
|
|
867
|
+
self.size += size as u64;
|
|
868
|
+
})
|
|
869
|
+
.inspect_err(|err| {
|
|
870
|
+
self.interceptor.observe(
|
|
871
|
+
self.labels.clone().with_error(err.kind()),
|
|
872
|
+
MetricValue::OperationErrorsTotal,
|
|
873
|
+
);
|
|
874
|
+
})
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
async fn close(&mut self) -> Result<Metadata> {
|
|
878
|
+
self.inner.close().await.inspect_err(|err| {
|
|
879
|
+
self.interceptor.observe(
|
|
880
|
+
self.labels.clone().with_error(err.kind()),
|
|
881
|
+
MetricValue::OperationErrorsTotal,
|
|
882
|
+
);
|
|
883
|
+
})
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
async fn abort(&mut self) -> Result<()> {
|
|
887
|
+
self.inner.abort().await.inspect_err(|err| {
|
|
888
|
+
self.interceptor.observe(
|
|
889
|
+
self.labels.clone().with_error(err.kind()),
|
|
890
|
+
MetricValue::OperationErrorsTotal,
|
|
891
|
+
);
|
|
892
|
+
})
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
impl<R: oio::List, I: MetricsIntercept> oio::List for MetricsWrapper<R, I> {
|
|
897
|
+
async fn next(&mut self) -> Result<Option<oio::Entry>> {
|
|
898
|
+
self.inner
|
|
899
|
+
.next()
|
|
900
|
+
.await
|
|
901
|
+
.inspect(|_| {
|
|
902
|
+
self.size += 1;
|
|
903
|
+
})
|
|
904
|
+
.inspect_err(|err| {
|
|
905
|
+
self.interceptor.observe(
|
|
906
|
+
self.labels.clone().with_error(err.kind()),
|
|
907
|
+
MetricValue::OperationErrorsTotal,
|
|
908
|
+
);
|
|
909
|
+
})
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
impl<R: oio::Delete, I: MetricsIntercept> oio::Delete for MetricsWrapper<R, I> {
|
|
914
|
+
fn delete(&mut self, path: &str, args: OpDelete) -> Result<()> {
|
|
915
|
+
self.inner
|
|
916
|
+
.delete(path, args)
|
|
917
|
+
.inspect(|_| {
|
|
918
|
+
self.size += 1;
|
|
919
|
+
})
|
|
920
|
+
.inspect_err(|err| {
|
|
921
|
+
self.interceptor.observe(
|
|
922
|
+
self.labels.clone().with_error(err.kind()),
|
|
923
|
+
MetricValue::OperationErrorsTotal,
|
|
924
|
+
);
|
|
925
|
+
})
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
async fn flush(&mut self) -> Result<usize> {
|
|
929
|
+
self.inner.flush().await.inspect_err(|err| {
|
|
930
|
+
self.interceptor.observe(
|
|
931
|
+
self.labels.clone().with_error(err.kind()),
|
|
932
|
+
MetricValue::OperationErrorsTotal,
|
|
933
|
+
);
|
|
934
|
+
})
|
|
935
|
+
}
|
|
936
|
+
}
|