Skip to content
Snippets Groups Projects
Unverified Commit 28a9de1f authored by metabase-bot[bot]'s avatar metabase-bot[bot] Committed by GitHub
Browse files

Number of active users as a setting (#28770) (#28833)


* expose number of active users as a setting

Co-authored-by: default avatarNgoc Khuat <qn.khuat@gmail.com>
parent 6380374e
Branches
Tags
No related merge requests found
......@@ -39,18 +39,34 @@
"Store URL, used as a fallback for token checks and for fetching the list of cloud gateway IPs."
"https://store.metabase.com")
;;; +----------------------------------------------------------------------------------------------------------------+
;;; | TOKEN VALIDATION |
;;; +----------------------------------------------------------------------------------------------------------------+
(declare premium-embedding-token)
(defn- active-user-count []
(defn- active-users-count* []
{:post [(integer? %)]}
"Returns the number of active users."
(assert ((requiring-resolve 'metabase.db/db-is-set-up?)) "Metabase DB is not yet set up")
(t2/count :core_user :is_active true))
(def ^:private cached-active-user-count
"Primarily used for the settings because we don't wish it to be 100%."
(memoize/ttl
active-users-count*
:ttl/threshold (u/minutes->ms 5)))
(defsetting active-users-count
(deferred-tru "Cached number of active users. Refresh every 5 minutes.")
:visibility :admin
:type :integer
:default 0
:getter (fn []
(if-not ((requiring-resolve 'metabase.db/db-is-set-up?))
0
(cached-active-user-count))))
(defn- token-status-url [token base-url]
(when (seq token)
(format "%s/api/%s/v2/status" base-url token)))
......@@ -70,7 +86,7 @@
(defn- fetch-token-and-parse-body
[token base-url]
(some-> (token-status-url token base-url)
(http/get {:query-params {:users (active-user-count)
(http/get {:query-params {:users (active-users-count*)
:site-uuid (setting/get :site-uuid-for-premium-features-token-checks)}})
:body
(json/parse-string keyword)))
......@@ -122,12 +138,12 @@
(fn [token]
;; this is a sanity check to make sure we can actually get the active user count BEFORE we try to call
;; [[fetch-token-status*]], because `fetch-token-status*` catches Exceptions and therefore caches failed
;; results. We were running into issues in the e2e tests where `active-user-count` was timing out
;; results. We were running into issues in the e2e tests where `active-users-count` was timing out
;; because of to weird timeouts after restoring the app DB from a snapshot, which would cause other
;; tests to fail because a timed-out token check would get cached as a result.
(assert ((requiring-resolve 'metabase.db/db-is-set-up?)) "Metabase DB is not yet set up")
(u/with-timeout (u/seconds->ms 5)
(active-user-count))
(active-users-count*))
(fetch-token-status* token))
:ttl/threshold (u/minutes->ms 5))]
(fn [token]
......
......@@ -5,6 +5,7 @@
[clj-http.fake :as http-fake]
[clojure.test :refer :all]
[metabase.config :as config]
[metabase.db.connection :as mdb.connection]
[metabase.models.user :refer [User]]
[metabase.public-settings :as public-settings]
[metabase.public-settings.premium-features
......@@ -12,7 +13,9 @@
:refer [defenterprise defenterprise-schema]]
[metabase.test :as mt]
[schema.core :as s]
[toucan.util.test :as tt]))
[toucan.util.test :as tt]
[toucan2.core :as t2]
[toucan2.tools.with-temp :as t2.with-temp]))
(defn do-with-premium-features [features f]
(let [features (set (map name features))]
......@@ -37,7 +40,7 @@
[token premium-features-response]
(http-fake/with-fake-routes-in-isolation
{{:address (#'premium-features/token-status-url token @#'premium-features/token-check-url)
:query-params {:users (str (#'premium-features/active-user-count))
:query-params {:users (str (#'premium-features/active-users-count*))
:site-uuid (public-settings/site-uuid-for-premium-features-token-checks)}}
(constantly premium-features-response)}
(#'premium-features/fetch-token-status* token)))
......@@ -254,3 +257,17 @@
(testing "If premium-embedding-token is nil, the token-status setting should also be nil."
(mt/with-temporary-setting-values [premium-embedding-token nil]
(is (nil? (premium-features/token-status))))))
(deftest active-users-count-setting-test
(t2.with-temp/with-temp
[User _ {:is_active false}]
;; premium-features/active-users-count is cached so it could be make the test flaky
;; rebinding to avoid caching
(testing "returns the number of active users"
(with-redefs [premium-features/cached-active-user-count #'premium-features/active-users-count*]
(is (= (t2/count :core_user :is_active true)
(premium-features/active-users-count)))))
(testing "Default to 0 if db is not setup yet"
(binding [mdb.connection/*application-db* {:status (atom nil)}]
(is (zero? (premium-features/active-users-count)))))))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment