From 75f10e2f075b25b81493b248be1e56bea48c099b Mon Sep 17 00:00:00 2001 From: Fateh Singh Date: Mon, 29 Jul 2024 16:42:33 -0700 Subject: [PATCH 1/2] RANGER-4876: Plugin Analytics - Accumulate count of isAccessAllowed and log periodically --- .../plugin/service/RangerBasePlugin.java | 8 ++ .../plugin/service/RangerPluginAnalytics.java | 75 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 agents-common/src/main/java/org/apache/ranger/plugin/service/RangerPluginAnalytics.java diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java index 6a3d59dae8..8e570ad2fd 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java @@ -75,6 +75,7 @@ public class RangerBasePlugin { private final List chainedPlugins; private final boolean dedupStrings; private boolean isUserStoreEnricherAddedImplcitly = false; + private final RangerPluginAnalytics pluginAnalytics; public RangerBasePlugin(String serviceType, String appId) { @@ -86,6 +87,7 @@ public RangerBasePlugin(String serviceType, String serviceName, String appId) { } public RangerBasePlugin(RangerPluginConfig pluginConfig) { + this.pluginAnalytics = new RangerPluginAnalytics(); this.pluginConfig = pluginConfig; this.pluginContext = new RangerPluginContext(pluginConfig); @@ -268,6 +270,7 @@ public void init() { for (RangerChainedPlugin chainedPlugin : chainedPlugins) { chainedPlugin.init(); } + pluginAnalytics.startPluginAnalytics(); } public long getPoliciesVersion() { @@ -494,6 +497,9 @@ public void cleanup() { if (policyEngine != null) { ((RangerPolicyEngineImpl) policyEngine).releaseResources(true); } + if (pluginAnalytics!=null) { + pluginAnalytics.stopPluginAnalytics(); + } } public void setResultProcessor(RangerAccessResultProcessor resultProcessor) { @@ -513,6 +519,7 @@ public Collection isAccessAllowed(Collection isAccessAllowed(Collection requests, RangerAccessResultProcessor resultProcessor) { + pluginAnalytics.addIsAccessAllowedCount(); Collection ret = null; RangerPolicyEngine policyEngine = this.policyEngine; diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerPluginAnalytics.java b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerPluginAnalytics.java new file mode 100644 index 0000000000..5ad9d9af10 --- /dev/null +++ b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerPluginAnalytics.java @@ -0,0 +1,75 @@ +/* + * 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. + */ +package org.apache.ranger.plugin.service; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.concurrent.atomic.DoubleAccumulator; + +import static java.util.concurrent.TimeUnit.SECONDS; + +public class RangerPluginAnalytics { + private static final Logger LOG = LoggerFactory.getLogger(RangerPluginAnalytics.class); + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private static final int SLEEP_DURATION = 300; + private ScheduledFuture statusHandler; + + private final DoubleAccumulator countIsAccessAllowed = new DoubleAccumulator(Double::sum, 0L); + final Runnable asyncLoggerPluginAnalytics = () -> { + LOG.info("===========Ranger Plugin Analytics============="); + LOG.info("Accumulation period in seconds:"+SLEEP_DURATION); + LOG.info("Number of times isAccessAllowed was called:"+countIsAccessAllowed.getThenReset()); + }; + + public void startPluginAnalytics() { + stopPluginAnalytics(); + LOG.info("Starting Scheduled Plugin Analytics"); + statusHandler = scheduler.scheduleWithFixedDelay(asyncLoggerPluginAnalytics, 0, SLEEP_DURATION, SECONDS); + } + + public void stopPluginAnalytics() { + if (statusHandler == null){ + LOG.info("statusHandler is null, stop not required for asyncLoggerPluginAnalytics"); + return; + } + LOG.info("Attempting to cancel asyncLoggerPluginAnalytics"); + try { + scheduler.shutdown(); + statusHandler.cancel(true); + } + catch (Exception e){ + LOG.info("Exception while trying to shutdown/cancel asyncLoggerPluginAnalytics"); + } + if (statusHandler.isCancelled()){ + LOG.info("Canceled asyncLoggerPluginAnalytics"); + } + else{ + + LOG.info("Could not cancel asyncLoggerPluginAnalytics"); + } + } + + public void addIsAccessAllowedCount(){ + countIsAccessAllowed.accumulate(1); + } +} \ No newline at end of file From 53174a5441916f7620e26896b3747d4e42e46d6b Mon Sep 17 00:00:00 2001 From: Fateh Singh Date: Tue, 30 Jul 2024 10:21:29 -0700 Subject: [PATCH 2/2] RANGER-4876: Review mod: Scheduler shutdown or ScheduledFuture.cancel() does not throw any exception according to documentation --- .../ranger/plugin/service/RangerBasePlugin.java | 4 +--- .../ranger/plugin/service/RangerPluginAnalytics.java | 12 +++--------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java index 8e570ad2fd..aecd0af103 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java @@ -497,9 +497,7 @@ public void cleanup() { if (policyEngine != null) { ((RangerPolicyEngineImpl) policyEngine).releaseResources(true); } - if (pluginAnalytics!=null) { - pluginAnalytics.stopPluginAnalytics(); - } + pluginAnalytics.stopPluginAnalytics(); } public void setResultProcessor(RangerAccessResultProcessor resultProcessor) { diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerPluginAnalytics.java b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerPluginAnalytics.java index 5ad9d9af10..a67741580a 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerPluginAnalytics.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerPluginAnalytics.java @@ -53,18 +53,12 @@ public void stopPluginAnalytics() { return; } LOG.info("Attempting to cancel asyncLoggerPluginAnalytics"); - try { - scheduler.shutdown(); - statusHandler.cancel(true); - } - catch (Exception e){ - LOG.info("Exception while trying to shutdown/cancel asyncLoggerPluginAnalytics"); - } - if (statusHandler.isCancelled()){ + scheduler.shutdown(); + statusHandler.cancel(true); + if (statusHandler.isDone()){ LOG.info("Canceled asyncLoggerPluginAnalytics"); } else{ - LOG.info("Could not cancel asyncLoggerPluginAnalytics"); } }