Ingestion Cost Spike detection Playbook

Published Aug 27 2021 10:55 AM 3,346 Views
Microsoft

IngestionSpike.png

 

Azure Sentinel is a modern SIEM solution offering cloud scale analytics to power your thereat detection and response requirements. Like most cloud solutions, the billing for Azure Sentinel is largely based on a pay-per-use model. Specifically for Azure Sentinel, billing is based on the amount of data ingested into Log Analytics and Azure Sentinel. To ensure that you have continuous visibility should the amount of billable data ingested into the platform experience an unexpected spike, we have developed this Logic App to address exactly this sort of scenario.

This ingestion cost spike alert logic app is based on the principle of anomaly detection and as such utilizes the built-in KQL function series_decompose_anomalies(). It compares the baseline/expected level of ingestion over a period of time and then uses that historical pattern to determine whether to alert on a sudden increase of billable data into the workspace. Below is an image depicting the various actions the Logic App steps through, followed by a detailed explanation of the key parts of the query that checks for anomalies based on the historical ingestion pattern. The Logic App is triggered on a recurring schedule. Since you probably want to be immediately notified when this type of anomaly occurs then you may want to run it on a daily basis.

 

Image of Logic App overviewImage of Logic App overview

 

let UpperThreshold = UpperAnomalyThreshold; //+3 is the suggested number and it indicates a strong anomaly though you can modify it : Outlier - Wikipedia

Usage
| where IsBillable == "true" //we are only interested in tables getting notified when a spike is detected in a billable table 
| where Quantity > ReportingQty //Allows you to report only on variations that are above a certain threshold that you deem significant enough to warrant an alert
| make-series Qty=sum(Quantity) on TimeGenerated from ago((LookBack)d) to now() step 1d by DataType //creates a time series to look at the ingestion pattern over the period defined in the LookBack variable
| extend (anomalies, score, baseline) = series_decompose_anomalies(Qty, 1.5, 7, 'linefit', 1, 'ctukey', 0.01) //takes the time series of ingested data across the days specified in the ‘LookBack’ variable and extract anomalous points with scores based on predicted values using the linear regression concept. See https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/series-decompose-anomaliesfunction for a detailed explanation of each argument. For an explanation of 'ctukey' read: Outlier - Wikipedia.

| where anomalies[-1] == 1 or anomalies[-1] == -1 //the output of series_decompose_anomalies function is three things: A ternary (as opposed to binary) series containing (+1, -1, 0) marking up/down/no anomaly respectively, the Anomaly score and the predicted value or baseline. 

| extend Score = score[-1]  //this part picks up the anomaly state from the most recent run. -1 indicates a position in the array. 

| where Score >= UpperAnomalyThreshold  //compare with strong anomaly indicator values extracted from the time series data

| extend PercentageQtyIncrease = ((round(todouble(Qty[-1]),0)-round(todouble(baseline[-1]),1))/round(todouble(Qty[-1]),0) * 100) //calculates percentage increase to present data in percent terms for easier appreciation of the anomaly
| project DataType,ExpectedQty=round(todouble(baseline[-1]),0), ActualQty=round(todouble(Qty[-1]),0),round(PercentageQtyIncrease,0)  
| order by  round(todouble(PercentageQtyIncrease),0) desc 
| where PercentageQtyIncrease > PercentIncrease //only alert if the percentage increase exceeds the threshold beyond which you specified that you wish to be notified

 

 

 

 

Note: This logic app is complementary to the previously released Ingestion Cost Alert App but different in function. The Ingestion Cost Alert App is designed to send you alerts if the budget you define is exceeded. In contrast, the Ingestion Cost Anomaly App is designed to alert you, should there be an unusual spike in the billable data being ingested into the Log Analytics workspace where you have deployed Azure Sentinel. The App provides you with the flexibility to determine two thresholds around which the alerting should occur:

  1. The minimum increase in the amount of data in Gigabytes around which alerting should occur. This allows you to suppress alerts triggered by increases you consider immaterial
  2. The percentage increase in data. This parameter gives you additional flexibility to manage alerting thresholds by specifying what percentage increase you consider worth triggering the anomaly alert on.

To deploy the Ingestion Cost Anomaly App, follow this link to our GitHub repo. As part of the deployment process, you will need to specify some parameters in the “project details” page that determine the sensitivity of the App in terms of how it responds to ingestion anomalies, as well as define additional settings specific to your environment. See below highlighting the various parameters needed in this form:

 

LogicAppParameters.png

 

Upon a successful run of the logic app and should there be a billable data ingestion spike in your workspace than an e-mail with contents similar to the below will be sent out to the designated recipients :

 

SampleOutput.png

 

Related resources:

Series_decompose_anomalies() - Azure Data Explorer | Microsoft Docs

Cost Management in Azure Sentinel - Webinar

Azure Sentinel pricing

Ingestion Cost Alert Playbook - Microsoft Tech Community

 

Special thanks to @Jeremy Tan , @BenjiSec and @Javier Soriano for their collaboration

 

%3CLINGO-SUB%20id%3D%22lingo-sub-2591301%22%20slang%3D%22en-US%22%3EIngestion%20Cost%20Spike%20detection%20Playbook%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2591301%22%20slang%3D%22en-US%22%3E%3CP%3E%3CFONT%20size%3D%225%22%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-center%22%20image-alt%3D%22IngestionSpike.png%22%20style%3D%22width%3A%20999px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F306893iC006CDF4F0F90C02%2Fimage-size%2Flarge%3Fv%3Dv2%26amp%3Bpx%3D999%22%20role%3D%22button%22%20title%3D%22IngestionSpike.png%22%20alt%3D%22IngestionSpike.png%22%20%2F%3E%3C%2FSPAN%3E%3C%2FFONT%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CFONT%20size%3D%223%22%3EAzure%20Sentinel%20is%20a%20modern%20SIEM%20solution%20offering%20cloud%20scale%20analytics%20to%20power%20your%20thereat%20detection%20and%20response%20requirements.%20Like%20most%20cloud%20solutions%2C%20the%20billing%20for%20Azure%20Sentinel%20is%20largely%20based%20on%20a%20pay-per-use%20model.%20Specifically%20for%20Azure%20Sentinel%2C%20billing%20is%20based%20on%20the%20amount%20of%20data%20ingested%20into%20Log%20Analytics%20and%20Azure%20Sentinel.%20To%20ensure%20that%20you%20have%20continuous%20visibility%20should%20the%20amount%20of%20billable%20data%20ingested%20into%20the%20platform%20experience%20an%20unexpected%20spike%2C%20we%20have%20developed%20this%20Logic%20App%20to%20address%20exactly%20this%20sort%20of%20scenario.%3C%2FFONT%3E%3C%2FP%3E%0A%3CP%3E%3CFONT%20size%3D%223%22%3EThis%20ingestion%20cost%20spike%20alert%20logic%20app%20is%20based%20on%20the%20principle%20of%20anomaly%20detection%20and%20as%20such%20utilizes%20the%20built-in%20KQL%20function%20%3CA%20href%3D%22https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fdata-explorer%2Fkusto%2Fquery%2Fseries-decompose-anomaliesfunction%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3E%3CSTRONG%3Eseries_decompose_anomalies().%3C%2FSTRONG%3E%3C%2FA%3E%20It%20compares%20the%20baseline%2Fexpected%20level%20of%20ingestion%20over%20a%20period%20of%20time%20and%20then%20uses%20that%20historical%20pattern%20to%20determine%20whether%20to%20alert%20on%20a%20sudden%20increase%20of%20billable%20data%20into%20the%20workspace.%20Below%20is%20an%20image%20depicting%20the%20various%20actions%20the%20Logic%20App%20steps%20through%2C%20followed%20by%20a%20detailed%20explanation%20of%20the%20key%20parts%20of%20the%20query%20that%20checks%20for%20anomalies%20based%20on%20the%20historical%20ingestion%20pattern.%20The%20Logic%20App%20is%20triggered%20on%20a%20recurring%20schedule.%20Since%20you%20probably%20want%20to%20be%20immediately%20notified%20when%20this%20type%20of%20anomaly%20occurs%20then%20you%20may%20want%20to%20run%20it%20on%20a%20daily%20basis.%3C%2FFONT%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-center%22%20image-alt%3D%22LogicAppOverview.png%22%20style%3D%22width%3A%20569px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F298693iC440BCB0645988A2%2Fimage-size%2Flarge%3Fv%3Dv2%26amp%3Bpx%3D999%22%20role%3D%22button%22%20title%3D%22LogicAppOverview.png%22%20alt%3D%22Image%20of%20Logic%20App%20overview%22%20%2F%3E%3CSPAN%20class%3D%22lia-inline-image-caption%22%20onclick%3D%22event.preventDefault()%3B%22%3EImage%20of%20Logic%20App%20overview%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-applescript%22%3E%3CCODE%3Elet%20UpperThreshold%20%3D%20UpperAnomalyThreshold%3B%20%2F%2F%2B3%20is%20the%20suggested%20number%20and%20it%20indicates%20a%20strong%20anomaly%20though%20you%20can%20modify%20it%20%3A%20Outlier%20-%20Wikipedia%0A%0AUsage%0A%7C%20where%20IsBillable%20%3D%3D%20%22true%22%20%2F%2Fwe%20are%20only%20interested%20in%20tables%20getting%20notified%20when%20a%20spike%20is%20detected%20in%20a%20billable%20table%20%0A%7C%20where%20Quantity%20%26gt%3B%20ReportingQty%20%2F%2FAllows%20you%20to%20report%20only%20on%20variations%20that%20are%20above%20a%20certain%20threshold%20that%20you%20deem%20significant%20enough%20to%20warrant%20an%20alert%0A%7C%20make-series%20Qty%3Dsum(Quantity)%20on%20TimeGenerated%20from%20ago((LookBack)d)%20to%20now()%20step%201d%20by%20DataType%20%2F%2Fcreates%20a%20time%20series%20to%20look%20at%20the%20ingestion%20pattern%20over%20the%20period%20defined%20in%20the%20LookBack%20variable%0A%7C%20extend%20(anomalies%2C%20score%2C%20baseline)%20%3D%20series_decompose_anomalies(Qty%2C%201.5%2C%207%2C%20'linefit'%2C%201%2C%20'ctukey'%2C%200.01)%20%2F%2Ftakes%20the%20time%20series%20of%20ingested%20data%20across%20the%20days%20specified%20in%20the%20%E2%80%98LookBack%E2%80%99%20variable%20and%20extract%20anomalous%20points%20with%20scores%20based%20on%20predicted%20values%20using%20the%20linear%20regression%20concept.%20See%20https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fdata-explorer%2Fkusto%2Fquery%2Fseries-decompose-anomaliesfunction%20for%20a%20detailed%20explanation%20of%20each%20argument.%20For%20an%20explanation%20of%20'ctukey'%20read%3A%20Outlier%20-%20Wikipedia.%0A%0A%7C%20where%20anomalies%5B-1%5D%20%3D%3D%201%20or%20anomalies%5B-1%5D%20%3D%3D%20-1%20%2F%2Fthe%20output%20of%20series_decompose_anomalies%20function%20is%20three%20things%3A%20A%20ternary%20(as%20opposed%20to%20binary)%20series%20containing%20(%2B1%2C%20-1%2C%200)%20marking%20up%2Fdown%2Fno%20anomaly%20respectively%2C%20the%20Anomaly%20score%20and%20the%20predicted%20value%20or%20baseline.%20%0A%0A%7C%20extend%20Score%20%3D%20score%5B-1%5D%20%20%2F%2Fthis%20part%20picks%20up%20the%20anomaly%20state%20from%20the%20most%20recent%20run.%20-1%20indicates%20a%20position%20in%20the%20array.%20%0A%0A%7C%20where%20Score%20%26gt%3B%3D%20UpperAnomalyThreshold%20%20%2F%2Fcompare%20with%20strong%20anomaly%20indicator%20values%20extracted%20from%20the%20time%20series%20data%0A%0A%7C%20extend%20PercentageQtyIncrease%20%3D%20((round(todouble(Qty%5B-1%5D)%2C0)-round(todouble(baseline%5B-1%5D)%2C1))%2Fround(todouble(Qty%5B-1%5D)%2C0)%20*%20100)%20%2F%2Fcalculates%20percentage%20increase%20to%20present%20data%20in%20percent%20terms%20for%20easier%20appreciation%20of%20the%20anomaly%0A%7C%20project%20DataType%2CExpectedQty%3Dround(todouble(baseline%5B-1%5D)%2C0)%2C%20ActualQty%3Dround(todouble(Qty%5B-1%5D)%2C0)%2Cround(PercentageQtyIncrease%2C0)%20%20%0A%7C%20order%20by%20%20round(todouble(PercentageQtyIncrease)%2C0)%20desc%20%0A%7C%20where%20PercentageQtyIncrease%20%26gt%3B%20PercentIncrease%20%2F%2Fonly%20alert%20if%20the%20percentage%20increase%20exceeds%20the%20threshold%20beyond%20which%20you%20specified%20that%20you%20wish%20to%20be%20notified%0A%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CFONT%20size%3D%223%22%3E%3CSTRONG%3ENote%3A%3C%2FSTRONG%3E%20This%20logic%20app%20is%20complementary%20to%20the%20previously%20released%20%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fazure-sentinel%2Fingestion-cost-alert-playbook%2Fba-p%2F2006003%22%20target%3D%22_blank%22%3EIngestion%20Cost%20Alert%20App%3C%2FA%3E%20but%20different%20in%20function.%20The%20Ingestion%20Cost%20Alert%20App%20is%20designed%20to%20send%20you%20alerts%20if%20the%20budget%20you%20define%20is%20exceeded.%20In%20contrast%2C%20the%20Ingestion%20Cost%20Anomaly%20App%20is%20designed%20to%20alert%20you%2C%20should%20there%20be%20an%20unusual%20spike%20in%20the%20billable%20data%20being%20ingested%20into%20the%20Log%20Analytics%20workspace%20where%20you%20have%20deployed%20Azure%20Sentinel.%20The%20App%20provides%20you%20with%20the%20flexibility%20to%20determine%20two%20thresholds%20around%20which%20the%20alerting%20should%20occur%3A%3C%2FFONT%3E%3C%2FP%3E%0A%3COL%3E%0A%3CLI%3E%3CFONT%20size%3D%223%22%3EThe%20minimum%20increase%20in%20the%20amount%20of%20data%20in%20Gigabytes%20around%20which%20alerting%20should%20occur.%20This%20allows%20you%20to%20suppress%20alerts%20triggered%20by%20increases%20you%20consider%20immaterial%3C%2FFONT%3E%3C%2FLI%3E%0A%3CLI%3E%3CFONT%20size%3D%223%22%3EThe%20percentage%20increase%20in%20data.%20This%20parameter%20gives%20you%20additional%20flexibility%20to%20manage%20alerting%20thresholds%20by%20specifying%20what%20percentage%20increase%20you%20consider%20worth%20triggering%20the%20anomaly%20alert%20on.%3C%2FFONT%3E%3C%2FLI%3E%0A%3C%2FOL%3E%0A%3CP%3E%3CFONT%20size%3D%223%22%3ETo%20deploy%20the%20Ingestion%20Cost%20Anomaly%20App%2C%20follow%20this%20%3CA%20href%3D%22https%3A%2F%2Fgithub.com%2Fiwafula025%2FAzure-Sentinel%2Ftree%2Fmaster%2FPlaybooks%2FSend-IngestionCostAnomalyAlert%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3Elink%3C%2FA%3E%20to%20our%20GitHub%20repo.%20As%20part%20of%20the%20deployment%20process%2C%20you%20will%20need%20to%20specify%20some%20parameters%20in%20the%20%E2%80%9Cproject%20details%E2%80%9D%20page%20that%20determine%20the%20sensitivity%20of%20the%20App%20in%20terms%20of%20how%20it%20responds%20to%20ingestion%20anomalies%2C%20as%20well%20as%20define%20additional%20settings%20specific%20to%20your%20environment.%20See%20below%20highlighting%20the%20various%20parameters%20needed%20in%20this%20form%3A%3C%2FFONT%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-center%22%20image-alt%3D%22LogicAppParameters.png%22%20style%3D%22width%3A%20999px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F298694iEFDA648997319F5C%2Fimage-size%2Flarge%3Fv%3Dv2%26amp%3Bpx%3D999%22%20role%3D%22button%22%20title%3D%22LogicAppParameters.png%22%20alt%3D%22LogicAppParameters.png%22%20%2F%3E%3C%2FSPAN%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CFONT%20size%3D%223%22%3EUpon%20a%20successful%20run%20of%20the%20logic%20app%20and%20should%20there%20be%20a%20billable%20data%20ingestion%20spike%20in%20your%20workspace%20than%20an%20e-mail%20with%20contents%20similar%20to%20the%20below%20will%20be%20sent%20out%20to%20the%20designated%20recipients%26nbsp%3B%3A%3C%2FFONT%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-center%22%20image-alt%3D%22SampleOutput.png%22%20style%3D%22width%3A%20999px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F298695iDFC84B7CB11F7002%2Fimage-size%2Flarge%3Fv%3Dv2%26amp%3Bpx%3D999%22%20role%3D%22button%22%20title%3D%22SampleOutput.png%22%20alt%3D%22SampleOutput.png%22%20%2F%3E%3C%2FSPAN%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CFONT%20size%3D%223%22%3ERelated%20resources%3A%3C%2FFONT%3E%3C%2FP%3E%0A%3CP%3E%3CFONT%20size%3D%223%22%3E%3CA%20href%3D%22https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fdata-explorer%2Fkusto%2Fquery%2Fseries-decompose-anomaliesfunction%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3ESeries_decompose_anomalies()%20-%20Azure%20Data%20Explorer%20%7C%20Microsoft%20Docs%3C%2FA%3E%3C%2FFONT%3E%3C%2FP%3E%0A%3CP%3E%3CFONT%20size%3D%223%22%3E%3CA%20href%3D%22https%3A%2F%2Fyoutu.be%2FjZjBK2oRCsM%22%20target%3D%22_blank%22%20rel%3D%22noopener%20nofollow%20noreferrer%22%3ECost%20Management%20in%20Azure%20Sentinel%20-%20Webinar%3C%2FA%3E%3C%2FFONT%3E%3C%2FP%3E%0A%3CP%3E%3CFONT%20size%3D%223%22%3E%3CA%20href%3D%22https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fsentinel%2Fazure-sentinel-billing%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3EAzure%20Sentinel%20pricing%3C%2FA%3E%3C%2FFONT%3E%3C%2FP%3E%0A%3CP%3E%3CFONT%20size%3D%223%22%3E%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fazure-sentinel%2Fingestion-cost-alert-playbook%2Fba-p%2F2006003%22%20target%3D%22_blank%22%3EIngestion%20Cost%20Alert%20Playbook%20-%20Microsoft%20Tech%20Community%3C%2FA%3E%3C%2FFONT%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CFONT%20size%3D%223%22%3E%3CEM%3ESpecial%20thanks%20to%20%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F215052%22%20target%3D%22_blank%22%3E%40Jeremy%20Tan%3C%2FA%3E%26nbsp%3B%2C%20%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F329567%22%20target%3D%22_blank%22%3E%40BenjiSec%3C%2FA%3E%26nbsp%3Band%20%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F66621%22%20target%3D%22_blank%22%3E%40Javier%20Soriano%3C%2FA%3E%26nbsp%3Bfor%20their%20collaboration%3C%2FEM%3E%3C%2FFONT%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-TEASER%20id%3D%22lingo-teaser-2591301%22%20slang%3D%22en-US%22%3E%3CP%3E%3CSTRONG%3EThis%20blog%20details%20how%20you%20can%20use%20the%20described%20logic%20app%20to%20detect%20sudden%20ingestion%20of%20data%20into%20billable%20tables%20in%20your%20Azure%20Sentinel%20workspace.%3C%2FSTRONG%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-center%22%20image-alt%3D%22Teaserimage.png%22%20style%3D%22width%3A%20999px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F298701i0E799392524A55EA%2Fimage-size%2Flarge%3Fv%3Dv2%26amp%3Bpx%3D999%22%20role%3D%22button%22%20title%3D%22Teaserimage.png%22%20alt%3D%22Teaserimage.png%22%20%2F%3E%3C%2FSPAN%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-TEASER%3E
Co-Authors
Version history
Last update:
‎Aug 31 2021 07:31 PM
Updated by: