You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by fg...@apache.org on 2021/10/28 12:03:24 UTC

[nifi-minifi-cpp] 01/04: MINIFICPP-1667 Add Azure SDK logging to Minifi

This is an automated email from the ASF dual-hosted git repository.

fgerlits pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit 1b1dc7b593d60969d56feec1b7e7597cb6955b9a
Author: Gabor Gyimesi <ga...@gmail.com>
AuthorDate: Wed Oct 20 11:17:48 2021 +0200

    MINIFICPP-1667 Add Azure SDK logging to Minifi
    
    Signed-off-by: Ferenc Gerlits <fg...@gmail.com>
    
    This closes #1202
---
 extensions/azure/CMakeLists.txt                    |  2 +-
 extensions/azure/storage/AzureBlobStorage.cpp      |  2 +
 .../azure/storage/AzureBlobStorageClient.cpp       |  6 ++
 extensions/azure/storage/AzureBlobStorageClient.h  |  1 +
 extensions/azure/storage/AzureDataLakeStorage.cpp  |  1 +
 .../azure/storage/AzureDataLakeStorageClient.cpp   |  6 ++
 .../azure/storage/AzureDataLakeStorageClient.h     |  2 +
 extensions/azure/utils/AzureSdkLogger.cpp          | 68 ++++++++++++++++++++++
 .../AzureSdkLogger.h}                              | 27 +++------
 9 files changed, 96 insertions(+), 19 deletions(-)

diff --git a/extensions/azure/CMakeLists.txt b/extensions/azure/CMakeLists.txt
index 1833007..348b79a 100644
--- a/extensions/azure/CMakeLists.txt
+++ b/extensions/azure/CMakeLists.txt
@@ -19,7 +19,7 @@
 
 include(${CMAKE_SOURCE_DIR}/extensions/ExtensionHeader.txt)
 
-file(GLOB SOURCES "*.cpp" "storage/*.cpp" "controllerservices/*.cpp" "processors/*.cpp")
+file(GLOB SOURCES "*.cpp" "storage/*.cpp" "controllerservices/*.cpp" "processors/*.cpp" "utils/*.cpp")
 
 add_library(minifi-azure SHARED ${SOURCES})
 
diff --git a/extensions/azure/storage/AzureBlobStorage.cpp b/extensions/azure/storage/AzureBlobStorage.cpp
index b82b801..9708bed 100644
--- a/extensions/azure/storage/AzureBlobStorage.cpp
+++ b/extensions/azure/storage/AzureBlobStorage.cpp
@@ -34,6 +34,7 @@ AzureBlobStorage::AzureBlobStorage(std::unique_ptr<BlobStorageClient> blob_stora
 
 std::optional<bool> AzureBlobStorage::createContainerIfNotExists(const PutAzureBlobStorageParameters& params) {
   try {
+    logger_->log_debug("Trying to create Azure blob container %s", params.container_name);
     return blob_storage_client_->createContainerIfNotExists(params);
   } catch (const std::exception& ex) {
     logger_->log_error("An exception occurred while creating container: %s", ex.what());
@@ -43,6 +44,7 @@ std::optional<bool> AzureBlobStorage::createContainerIfNotExists(const PutAzureB
 
 std::optional<UploadBlobResult> AzureBlobStorage::uploadBlob(const PutAzureBlobStorageParameters& params, gsl::span<const uint8_t> buffer) {
   try {
+    logger_->log_debug("Uploading Azure blob %s to container %s", params.blob_name, params.container_name);
     auto response = blob_storage_client_->uploadBlob(params, buffer);
 
     UploadBlobResult result;
diff --git a/extensions/azure/storage/AzureBlobStorageClient.cpp b/extensions/azure/storage/AzureBlobStorageClient.cpp
index f70b07f..c70511c 100644
--- a/extensions/azure/storage/AzureBlobStorageClient.cpp
+++ b/extensions/azure/storage/AzureBlobStorageClient.cpp
@@ -22,8 +22,14 @@
 
 #include "azure/identity.hpp"
 
+#include "utils/AzureSdkLogger.h"
+
 namespace org::apache::nifi::minifi::azure::storage {
 
+AzureBlobStorageClient::AzureBlobStorageClient() {
+  utils::AzureSdkLogger::initialize();
+}
+
 void AzureBlobStorageClient::resetClientIfNeeded(const AzureStorageCredentials &credentials, const std::string &container_name) {
   if (container_client_ && credentials == credentials_ && container_name == container_name_) {
     logger_->log_debug("Azure Blob Storage client credentials have not changed, no need to reset client");
diff --git a/extensions/azure/storage/AzureBlobStorageClient.h b/extensions/azure/storage/AzureBlobStorageClient.h
index 7e6c261..386ac01 100644
--- a/extensions/azure/storage/AzureBlobStorageClient.h
+++ b/extensions/azure/storage/AzureBlobStorageClient.h
@@ -33,6 +33,7 @@ namespace org::apache::nifi::minifi::azure::storage {
 
 class AzureBlobStorageClient : public BlobStorageClient {
  public:
+  AzureBlobStorageClient();
   bool createContainerIfNotExists(const PutAzureBlobStorageParameters& params) override;
   Azure::Storage::Blobs::Models::UploadBlockBlobResult uploadBlob(const PutAzureBlobStorageParameters& params, gsl::span<const uint8_t> buffer) override;
   std::string getUrl(const PutAzureBlobStorageParameters& params) override;
diff --git a/extensions/azure/storage/AzureDataLakeStorage.cpp b/extensions/azure/storage/AzureDataLakeStorage.cpp
index 82e3d5a..5562933 100644
--- a/extensions/azure/storage/AzureDataLakeStorage.cpp
+++ b/extensions/azure/storage/AzureDataLakeStorage.cpp
@@ -30,6 +30,7 @@ AzureDataLakeStorage::AzureDataLakeStorage(std::unique_ptr<DataLakeStorageClient
 
 UploadDataLakeStorageResult AzureDataLakeStorage::uploadFile(const PutAzureDataLakeStorageParameters& params, gsl::span<const uint8_t> buffer) {
   UploadDataLakeStorageResult result;
+  logger_->log_debug("Uploading file '%s/%s' to Azure Data Lake Storage filesystem '%s'", params.directory_name, params.filename, params.file_system_name);
   try {
     auto file_created = data_lake_storage_client_->createFile(params);
     if (!file_created && !params.replace_file) {
diff --git a/extensions/azure/storage/AzureDataLakeStorageClient.cpp b/extensions/azure/storage/AzureDataLakeStorageClient.cpp
index a974e5b..e56b967 100644
--- a/extensions/azure/storage/AzureDataLakeStorageClient.cpp
+++ b/extensions/azure/storage/AzureDataLakeStorageClient.cpp
@@ -22,8 +22,14 @@
 
 #include "azure/identity.hpp"
 
+#include "utils/AzureSdkLogger.h"
+
 namespace org::apache::nifi::minifi::azure::storage {
 
+AzureDataLakeStorageClient::AzureDataLakeStorageClient() {
+  utils::AzureSdkLogger::initialize();
+}
+
 void AzureDataLakeStorageClient::resetClientIfNeeded(const AzureStorageCredentials& credentials, const std::string& file_system_name) {
   if (client_ && credentials_ == credentials && file_system_name_ == file_system_name) {
     logger_->log_debug("Azure Data Lake Storge client credentials have not changed, no need to reset client");
diff --git a/extensions/azure/storage/AzureDataLakeStorageClient.h b/extensions/azure/storage/AzureDataLakeStorageClient.h
index 4f398a7..8cb87b9 100644
--- a/extensions/azure/storage/AzureDataLakeStorageClient.h
+++ b/extensions/azure/storage/AzureDataLakeStorageClient.h
@@ -32,6 +32,8 @@ namespace org::apache::nifi::minifi::azure::storage {
 
 class AzureDataLakeStorageClient : public DataLakeStorageClient {
  public:
+  AzureDataLakeStorageClient();
+
   /**
    * Creates a file on Azure Data Lake Storage
    * @param params Parameters required for connecting and file creation on Azure
diff --git a/extensions/azure/utils/AzureSdkLogger.cpp b/extensions/azure/utils/AzureSdkLogger.cpp
new file mode 100644
index 0000000..fbbdbc2
--- /dev/null
+++ b/extensions/azure/utils/AzureSdkLogger.cpp
@@ -0,0 +1,68 @@
+/**
+ * @file AzureSdkLogger.cpp
+ * AzureSdkLogger class implementation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "AzureSdkLogger.h"
+
+#include <string>
+
+#include "azure/core/diagnostics/logger.hpp"
+
+namespace org::apache::nifi::minifi::azure::utils {
+
+void AzureSdkLogger::initialize() {
+  static AzureSdkLogger instance;
+}
+
+void AzureSdkLogger::setLogLevel() {
+  if (logger_->should_log(minifi::core::logging::LOG_LEVEL::trace) || logger_->should_log(minifi::core::logging::LOG_LEVEL::debug)) {
+    Azure::Core::Diagnostics::Logger::SetLevel(Azure::Core::Diagnostics::Logger::Level::Verbose);
+  } else if (logger_->should_log(minifi::core::logging::LOG_LEVEL::info)) {
+    Azure::Core::Diagnostics::Logger::SetLevel(Azure::Core::Diagnostics::Logger::Level::Informational);
+  } else if (logger_->should_log(minifi::core::logging::LOG_LEVEL::warn)) {
+    Azure::Core::Diagnostics::Logger::SetLevel(Azure::Core::Diagnostics::Logger::Level::Warning);
+  } else if (logger_->should_log(minifi::core::logging::LOG_LEVEL::err) || logger_->should_log(minifi::core::logging::LOG_LEVEL::critical)) {
+    Azure::Core::Diagnostics::Logger::SetLevel(Azure::Core::Diagnostics::Logger::Level::Error);
+  }
+}
+
+AzureSdkLogger::AzureSdkLogger() {
+  setLogLevel();
+
+  Azure::Core::Diagnostics::Logger::SetListener([&](Azure::Core::Diagnostics::Logger::Level level, const std::string& message) {
+    switch (level) {
+      case Azure::Core::Diagnostics::Logger::Level::Verbose:
+        logger_->log_debug(message.c_str());
+        break;
+      case Azure::Core::Diagnostics::Logger::Level::Informational:
+        logger_->log_info(message.c_str());
+        break;
+      case Azure::Core::Diagnostics::Logger::Level::Warning:
+        logger_->log_warn(message.c_str());
+        break;
+      case Azure::Core::Diagnostics::Logger::Level::Error:
+        logger_->log_error(message.c_str());
+        break;
+      default:
+        break;
+    }
+  });
+}
+
+}  // namespace org::apache::nifi::minifi::azure::utils
diff --git a/extensions/azure/storage/AzureBlobStorageClient.h b/extensions/azure/utils/AzureSdkLogger.h
similarity index 50%
copy from extensions/azure/storage/AzureBlobStorageClient.h
copy to extensions/azure/utils/AzureSdkLogger.h
index 7e6c261..dcb1e7b 100644
--- a/extensions/azure/storage/AzureBlobStorageClient.h
+++ b/extensions/azure/utils/AzureSdkLogger.h
@@ -1,6 +1,6 @@
 /**
- * @file AzureBlobStorageClient.h
- * AzureBlobStorageClient class declaration
+ * @file AzureSdkLogger.h
+ * AzureSdkLogger class declaration
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -20,30 +20,21 @@
 #pragma once
 
 #include <memory>
-#include <optional>
-#include <string>
-#include <vector>
 
-#include "BlobStorageClient.h"
-#include "azure/storage/blobs.hpp"
 #include "core/logging/Logger.h"
 #include "core/logging/LoggerConfiguration.h"
 
-namespace org::apache::nifi::minifi::azure::storage {
+namespace org::apache::nifi::minifi::azure::utils {
 
-class AzureBlobStorageClient : public BlobStorageClient {
+class AzureSdkLogger {
  public:
-  bool createContainerIfNotExists(const PutAzureBlobStorageParameters& params) override;
-  Azure::Storage::Blobs::Models::UploadBlockBlobResult uploadBlob(const PutAzureBlobStorageParameters& params, gsl::span<const uint8_t> buffer) override;
-  std::string getUrl(const PutAzureBlobStorageParameters& params) override;
+  static void initialize();
 
  private:
-  void resetClientIfNeeded(const AzureStorageCredentials& credentials, const std::string &container_name);
+  AzureSdkLogger();
+  void setLogLevel();
 
-  AzureStorageCredentials credentials_;
-  std::string container_name_;
-  std::unique_ptr<Azure::Storage::Blobs::BlobContainerClient> container_client_;
-  std::shared_ptr<logging::Logger> logger_{logging::LoggerFactory<AzureBlobStorageClient>::getLogger()};
+  std::shared_ptr<logging::Logger> logger_{logging::LoggerFactory<AzureSdkLogger>::getLogger()};
 };
 
-}  // namespace org::apache::nifi::minifi::azure::storage
+}  // namespace org::apache::nifi::minifi::azure::utils