SlideShare a Scribd company logo
CAVE - an overview 
Val Dumitrescu 
Paweł Raszewski
Another monitoring solution? 
At GILT: 
● OpenTSDB + Nagios 
● DataDog 
● NewRelic 
● Notifications with PagerDuty
What is CAVE? 
Continuous 
Audit 
Vault 
Enterprise
What is CAVE? 
A monitoring system that is: 
● secure 
● independent 
● proprietary 
● open source
Requirements 
● horizontally scalable to millions of metrics, alerts 
● multi-tenant, multi-user 
● extensible HTTP-based API 
● flexible metric definition 
● data aggregation / multiple dimensions 
● flexible and extensible alert grammar 
● pluggable notification delivery system 
● clean user interface for graphing and dashboarding
Architecture
Architecture
Architecture
Architecture
Architecture
Architecture
Architecture
Alert Grammar 
Metric has name and tags (key-value pairs) 
e.g. 
orders [shipTo: US] 
response-time [svc: svc-important, env: prod]
Alert Grammar 
Aggregated Metric has metric, aggregator and 
period of aggregation, e.g. 
orders [shipTo: US].sum.5m 
response-time [svc: svc-important, env: prod].p99.5m 
Supported aggregators: 
count, min, max, mean, mode, median, sum 
stddev, p99, p999, p95, p90
Alert Grammar 
Alert Condition contains one expression with 
two terms and an operator. Each term is a 
metric, an aggregated metric or a value. 
e.g. 
orders [shipTo: US].sum.5m < 10 
orders [shipTo: US].sum.5m < ordersPredictedLow [shipTo: US]
Alert Grammar 
An optional number of times the threshold is 
broken, e.g. 
response-time [svc: svc-team, env: prod].p99.5m > 3000 at least 
3 times
Alert Grammar 
Special format for missing data 
e.g. 
orders [shipTo: US] missing for 5m 
heartbeat [svc: svc-important, env: prod] missing for 10m
Alert Grammar 
trait AlertParser extends JavaTokenParsers { 
sealed trait Source 
case class ValueSource(value: Double) extends Source 
case class MetricSource( 
metric: String, tags: Map[String, String]) extends Source 
case class AggregatedSource( 
metricSource: MetricSource, 
aggregator: Aggregator, duration: FiniteDuration) extends Source 
sealed trait AlertEntity 
case class SimpleAlert( 
sourceLeft: Source, operator: Operator, 
sourceRight: Source, times: Int) extends AlertEntity 
case class MissingDataAlert( 
metricSource: MetricSource, duration: FiniteDuration) extends AlertEntity 
… 
}
Alert Grammar 
trait AlertParser extends JavaTokenParsers { 
… 
def valueSource: Parser[ValueSource] = decimalNumber ^^ { 
case num => ValueSource(num.toDouble) 
} 
def word: Parser[String] = """[a-zA-Z][a-zA-Z0-9.-]*""".r 
def metricTag: Parser[(String, String)] = (word <~ ":") ~ word ^^ { 
case key ~ value => key -> value 
} 
def metricTags: Parser[Map[String, String]] = repsep(metricTag, ",") ^^ { 
case list => list.toMap 
} 
… 
}
Alert Grammar 
trait AlertParser extends JavaTokenParsers { 
… 
def metricSourceWithTags: Parser[MetricSource] = 
(word <~ "[") ~ (metricTags <~ "]") ^^ { 
case metric ~ tagMap => MetricSource(metric, tagMap) 
} 
def metricSourceWithoutTags: Parser[MetricSource] = word ^^ { 
case metric => MetricSource(metric, Map.empty[String, String]) 
} 
def metricSource = metricSourceWithTags | metricSourceWithoutTags 
… 
}
Alert Grammar 
trait AlertParser extends JavaTokenParsers { 
… 
def duration: Parser[FiniteDuration] = wholeNumber ~ ("s"|"m"|"h"|"d") ^^ { 
case time ~ "s" => time.toInt.seconds 
case time ~ "m" => time.toInt.minutes 
case time ~ "h" => time.toInt.hours 
case time ~ "d" => time.toInt.days 
} 
def aggregatedSource: Parser[AggregatedSource] = 
(metricSource <~ ".") ~ (aggregator <~ ".") ~ duration ^^ { 
case met ~ agg ~ dur => AggregatedSource(met, agg, dur) 
} 
def anySource: Parser[Source] = valueSource | aggregatedSource | metricSource 
… 
}
Alert Grammar 
trait AlertParser extends JavaTokenParsers { 
… 
def missingDataAlert: Parser[MissingDataAlert] = 
metricSource ~ "missing for" ~ duration ^^ { 
case source ~ _ ~ d => MissingDataAlert(source, d) 
} 
def simpleAlert: Parser[SimpleAlert] = anySource ~ operator ~ anySource ^^ { 
case left ~ op ~ right => SimpleAlert(left, op, right, 1) 
} 
def repeater: Parser[Int] = "at least" ~ wholeNumber ~ "times" ^^ { 
case _ ~ num ~ _ => num.toInt 
} 
def simpleAlertWithRepeater: Parser[SimpleAlert] = 
anySource ~ operator ~ anySource ~ repeater ^^ { 
case left ~ op ~ right ~ num => SimpleAlert(left, op, right, num) 
}
Alert Grammar 
trait AlertParser extends JavaTokenParsers { 
… 
def anyAlert: Parser[AlertEntity] = 
missingDataAlert | simpleAlertWithRepeater | simpleAlert 
} 
Usage: 
class Something(conditionString: String) extends AlertParser { 
… 
parseAll(anyAlert, conditionString) match { 
case Success(SimpleAlert(left, op, right, times), _) => … 
case Success(MissingDataAlert(metric, duration), _) => … 
case Failure(message, _) => … 
} 
}
Slick 
Functional Relational Mapping (FRM) 
library for Scala 
Slick <> Hibernate
Slick 
compile-time safety 
no need to write SQL 
full control over what is going on
Scala Collections API 
case class Person(id: Int, name: String) 
val list = List(Person(1, "Pawel"), 
Person(2, "Val"), 
Person(3, "Unknown Name"))
Scala Collections API 
case class Person(id: Int, name: String) 
val list = List(Person(1, "Pawel"), 
Person(2, "Val"), 
Person(3, "Unknown Name")) 
list.filter(_.id > 1)
Scala Collections API 
case class Person(id: Int, name: String) 
val list = List(Person(1, "Pawel"), 
Person(2, "Val"), 
Person(3, "Unknown Name")) 
list.filter(_.id > 1).map(_.name)
Scala Collections API 
case class Person(id: Int, name: String) 
val list = List(Person(1, "Pawel"), 
Person(2, "Val"), 
Person(3, "Unknown Name")) 
list.filter(_.id > 1).map(_.name) 
SELECT name FROM list WHERE id > 1
Schema 
ORGANIZATIONS TEAMS
Entity mapping 
/** Table description of table orgs.*/ 
class OrganizationsTable(tag: Tag) extends Table[OrganizationsRow](tag,"organizations") { 
... 
/** Database column id AutoInc, PrimaryKey */ 
val id: Column[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey) 
/** Database column name */ 
val name: Column[String] = column[String]("name") 
/** Database column created_at */ 
val createdAt: Column[java.sql.Timestamp] = column[java.sql.Timestamp]("created_at") 
… 
/** Foreign key referencing Organizations (database name token_organization_fk) */ 
lazy val organizationsFk = foreignKey("token_organization_fk", organizationId, 
Organizations)(r => r.id, onUpdate = ForeignKeyAction.NoAction, onDelete = 
ForeignKeyAction.NoAction) 
}
CRUD 
val organizationsTable = TableQuery[OrganizationsTable] 
// SELECT * FROM ORGANIZATIONS 
organizationsTable.list 
// SELECT * FROM ORGANIZATIONS WHERE ID > 10 OFFSET 3 LIMIT 5 
organizationsTable.filter(_.id > 10).drop(3).take(5).list 
// INSERT 
organizationsTable += OrganizationsRow(1, "name", "email", "notificationUrl", ... , None, 
None) 
// UPDATE ORGANIZATIONS SET name = “new org name” WHERE ID=10 
organizationsTable.filter(_.id === 10).map(_.name).update("new org name") 
// DELETE FROM ORGANIZATIONS WHERE ID=10 
organizationsTable.filter(_.id === 10).delete
Queries - JOINS 
val organizationsTable = TableQuery[OrganizationsTable] 
val teamsTable = TableQuery[TeamsTable] 
val name = “teamName” 
val result = for { 
t <- teamsTable.sortBy(_.createdAt).filter(t => t.deletedAt.isEmpty) 
o <- t.organization.filter(o => o.deletedAt.isEmpty && o.name === name) 
} yield (t.name, o.name) 
SELECT t.name, o.name FROM TEAMS t 
LEFT JOIN ORGANIZATIONS o ON t.organization_id = o.id 
WHERE t.deleted_at IS NULL AND o.deleted_at IS NULL AND o.name = `teamName` 
ORDER BY t.created_at
SELECT t.name, o.name FROM TEAMS t 
LEFT JOIN ORGANIZATIONS o ON t.organization_id = o.id 
WHERE t.deleted_at IS NULL AND o.deleted_at IS NULL AND o.name = `teamName` 
ORDER BY t.created_at 
val result: List[(String, String)]
Connection pool and transactions 
val ds = new BoneCPDataSource 
val db = { 
ds.setDriverClass(rdsDriver) 
ds.setJdbcUrl(rdsJdbcConnectionString) 
ds.setPassword(rdsPassword) 
ds.setUser(rdsUser) 
Database.forDataSource(ds) 
} 
db.withTransaction { implicit session => 
// SLICK CODE GOES HERE 
}

More Related Content

What's hot

A evolução da persistência de dados (com sqlite) no android
A evolução da persistência de dados (com sqlite) no androidA evolução da persistência de dados (com sqlite) no android
A evolução da persistência de dados (com sqlite) no android
Rodrigo de Souza Castro
 
What is new in Java 8
What is new in Java 8What is new in Java 8
What is new in Java 8
Sandeep Kr. Singh
 
mobl presentation @ IHomer
mobl presentation @ IHomermobl presentation @ IHomer
mobl presentation @ IHomerzefhemel
 
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기
Wanbok Choi
 
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
SPTechCon
 
Event sourcing in the functional world (22 07-2021)
Event sourcing in the functional world (22 07-2021)Event sourcing in the functional world (22 07-2021)
Event sourcing in the functional world (22 07-2021)
Vitaly Brusentsev
 
Scalding - Hadoop Word Count in LESS than 70 lines of code
Scalding - Hadoop Word Count in LESS than 70 lines of codeScalding - Hadoop Word Count in LESS than 70 lines of code
Scalding - Hadoop Word Count in LESS than 70 lines of code
Konrad Malawski
 
Bioinformatics p5-bioperlv2014
Bioinformatics p5-bioperlv2014Bioinformatics p5-bioperlv2014
Bioinformatics p5-bioperlv2014
Prof. Wim Van Criekinge
 
JDD 2016 - Pawel Byszewski - Kotlin, why?
JDD 2016 - Pawel Byszewski - Kotlin, why?JDD 2016 - Pawel Byszewski - Kotlin, why?
JDD 2016 - Pawel Byszewski - Kotlin, why?
PROIDEA
 
Apache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLab
Apache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLabApache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLab
Apache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLab
CloudxLab
 
New SPL Features in PHP 5.3
New SPL Features in PHP 5.3New SPL Features in PHP 5.3
New SPL Features in PHP 5.3
Matthew Turland
 
Javascript built in String Functions
Javascript built in String FunctionsJavascript built in String Functions
Javascript built in String Functions
Avanitrambadiya
 
Apache Spark - Key Value RDD - Transformations | Big Data Hadoop Spark Tutori...
Apache Spark - Key Value RDD - Transformations | Big Data Hadoop Spark Tutori...Apache Spark - Key Value RDD - Transformations | Big Data Hadoop Spark Tutori...
Apache Spark - Key Value RDD - Transformations | Big Data Hadoop Spark Tutori...
CloudxLab
 
Windows 8 metro applications
Windows 8 metro applicationsWindows 8 metro applications
Windows 8 metro applications
Alex Golesh
 
Java script arrays
Java script arraysJava script arrays
Java script arrays
Frayosh Wadia
 
JAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entrepriseJAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entreprise
SOAT
 
Big Data Everywhere Chicago: Unleash the Power of HBase Shell (Conversant)
Big Data Everywhere Chicago: Unleash the Power of HBase Shell (Conversant) Big Data Everywhere Chicago: Unleash the Power of HBase Shell (Conversant)
Big Data Everywhere Chicago: Unleash the Power of HBase Shell (Conversant)
BigDataEverywhere
 
JavaScript Functions
JavaScript Functions JavaScript Functions
JavaScript Functions
Reem Alattas
 
Backbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The BrowserBackbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The Browser
Howard Lewis Ship
 
20070329 Java Programing Tips
20070329 Java Programing Tips20070329 Java Programing Tips
20070329 Java Programing TipsShingo Furuyama
 

What's hot (20)

A evolução da persistência de dados (com sqlite) no android
A evolução da persistência de dados (com sqlite) no androidA evolução da persistência de dados (com sqlite) no android
A evolução da persistência de dados (com sqlite) no android
 
What is new in Java 8
What is new in Java 8What is new in Java 8
What is new in Java 8
 
mobl presentation @ IHomer
mobl presentation @ IHomermobl presentation @ IHomer
mobl presentation @ IHomer
 
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기
 
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 3: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
 
Event sourcing in the functional world (22 07-2021)
Event sourcing in the functional world (22 07-2021)Event sourcing in the functional world (22 07-2021)
Event sourcing in the functional world (22 07-2021)
 
Scalding - Hadoop Word Count in LESS than 70 lines of code
Scalding - Hadoop Word Count in LESS than 70 lines of codeScalding - Hadoop Word Count in LESS than 70 lines of code
Scalding - Hadoop Word Count in LESS than 70 lines of code
 
Bioinformatics p5-bioperlv2014
Bioinformatics p5-bioperlv2014Bioinformatics p5-bioperlv2014
Bioinformatics p5-bioperlv2014
 
JDD 2016 - Pawel Byszewski - Kotlin, why?
JDD 2016 - Pawel Byszewski - Kotlin, why?JDD 2016 - Pawel Byszewski - Kotlin, why?
JDD 2016 - Pawel Byszewski - Kotlin, why?
 
Apache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLab
Apache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLabApache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLab
Apache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLab
 
New SPL Features in PHP 5.3
New SPL Features in PHP 5.3New SPL Features in PHP 5.3
New SPL Features in PHP 5.3
 
Javascript built in String Functions
Javascript built in String FunctionsJavascript built in String Functions
Javascript built in String Functions
 
Apache Spark - Key Value RDD - Transformations | Big Data Hadoop Spark Tutori...
Apache Spark - Key Value RDD - Transformations | Big Data Hadoop Spark Tutori...Apache Spark - Key Value RDD - Transformations | Big Data Hadoop Spark Tutori...
Apache Spark - Key Value RDD - Transformations | Big Data Hadoop Spark Tutori...
 
Windows 8 metro applications
Windows 8 metro applicationsWindows 8 metro applications
Windows 8 metro applications
 
Java script arrays
Java script arraysJava script arrays
Java script arrays
 
JAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entrepriseJAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entreprise
 
Big Data Everywhere Chicago: Unleash the Power of HBase Shell (Conversant)
Big Data Everywhere Chicago: Unleash the Power of HBase Shell (Conversant) Big Data Everywhere Chicago: Unleash the Power of HBase Shell (Conversant)
Big Data Everywhere Chicago: Unleash the Power of HBase Shell (Conversant)
 
JavaScript Functions
JavaScript Functions JavaScript Functions
JavaScript Functions
 
Backbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The BrowserBackbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The Browser
 
20070329 Java Programing Tips
20070329 Java Programing Tips20070329 Java Programing Tips
20070329 Java Programing Tips
 

Viewers also liked

Building a JavaScript Module Framework at Gilt
Building a JavaScript Module Framework at GiltBuilding a JavaScript Module Framework at Gilt
Building a JavaScript Module Framework at Gilt
Eric Shepherd
 
Dsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in ScalaDsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in Scala
Ugo Matrangolo
 
“Get Stuff Done Faster: Why Engineers Should Work with the ‘Dark Side’ of Tech”
“Get Stuff Done Faster: Why Engineers Should Work with the ‘Dark Side’ of Tech”“Get Stuff Done Faster: Why Engineers Should Work with the ‘Dark Side’ of Tech”
“Get Stuff Done Faster: Why Engineers Should Work with the ‘Dark Side’ of Tech”
Gilt Tech Talks
 
Mobile Design at Gilt
Mobile Design at GiltMobile Design at Gilt
Mobile Design at Gilt
David Park
 
tvOS, The Focus Engine, and Swift
tvOS, The Focus Engine, and SwifttvOS, The Focus Engine, and Swift
tvOS, The Focus Engine, and Swift
Evan Maloney
 
Scaling Gilt: from Monolithic Ruby Application to Distributed Scala Micro-Ser...
Scaling Gilt: from Monolithic Ruby Application to Distributed Scala Micro-Ser...Scaling Gilt: from Monolithic Ruby Application to Distributed Scala Micro-Ser...
Scaling Gilt: from Monolithic Ruby Application to Distributed Scala Micro-Ser...
C4Media
 
Scaling micro services at gilt
Scaling micro services at giltScaling micro services at gilt
Scaling micro services at gilt
Adrian Trenaman
 

Viewers also liked (7)

Building a JavaScript Module Framework at Gilt
Building a JavaScript Module Framework at GiltBuilding a JavaScript Module Framework at Gilt
Building a JavaScript Module Framework at Gilt
 
Dsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in ScalaDsug 05 02-15 - ScalDI - lightweight DI in Scala
Dsug 05 02-15 - ScalDI - lightweight DI in Scala
 
“Get Stuff Done Faster: Why Engineers Should Work with the ‘Dark Side’ of Tech”
“Get Stuff Done Faster: Why Engineers Should Work with the ‘Dark Side’ of Tech”“Get Stuff Done Faster: Why Engineers Should Work with the ‘Dark Side’ of Tech”
“Get Stuff Done Faster: Why Engineers Should Work with the ‘Dark Side’ of Tech”
 
Mobile Design at Gilt
Mobile Design at GiltMobile Design at Gilt
Mobile Design at Gilt
 
tvOS, The Focus Engine, and Swift
tvOS, The Focus Engine, and SwifttvOS, The Focus Engine, and Swift
tvOS, The Focus Engine, and Swift
 
Scaling Gilt: from Monolithic Ruby Application to Distributed Scala Micro-Ser...
Scaling Gilt: from Monolithic Ruby Application to Distributed Scala Micro-Ser...Scaling Gilt: from Monolithic Ruby Application to Distributed Scala Micro-Ser...
Scaling Gilt: from Monolithic Ruby Application to Distributed Scala Micro-Ser...
 
Scaling micro services at gilt
Scaling micro services at giltScaling micro services at gilt
Scaling micro services at gilt
 

Similar to CAVE Overview

Swift Sequences & Collections
Swift Sequences & CollectionsSwift Sequences & Collections
Swift Sequences & Collections
CocoaHeads France
 
Improving Correctness with Types
Improving Correctness with TypesImproving Correctness with Types
Improving Correctness with Types
Iain Hull
 
Strata Presentation: One Billion Objects in 2GB: Big Data Analytics on Small ...
Strata Presentation: One Billion Objects in 2GB: Big Data Analytics on Small ...Strata Presentation: One Billion Objects in 2GB: Big Data Analytics on Small ...
Strata Presentation: One Billion Objects in 2GB: Big Data Analytics on Small ...
randyguck
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
Practical cats
Practical catsPractical cats
Practical cats
Raymond Tay
 
Altitude NY 2018: Leveraging Log Streaming to Build the Best Dashboards, Ever
Altitude NY 2018: Leveraging Log Streaming to Build the Best Dashboards, EverAltitude NY 2018: Leveraging Log Streaming to Build the Best Dashboards, Ever
Altitude NY 2018: Leveraging Log Streaming to Build the Best Dashboards, Ever
Fastly
 
Beginning Scala Svcc 2009
Beginning Scala Svcc 2009Beginning Scala Svcc 2009
Beginning Scala Svcc 2009
David Pollak
 
Spark workshop
Spark workshopSpark workshop
Spark workshop
Wojciech Pituła
 
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data EcosystemWprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Sages
 
Logstash-Elasticsearch-Kibana
Logstash-Elasticsearch-KibanaLogstash-Elasticsearch-Kibana
Logstash-Elasticsearch-Kibana
dknx01
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecLoïc Descotte
 
How te bring common UI patterns to ADF
How te bring common UI patterns to ADFHow te bring common UI patterns to ADF
How te bring common UI patterns to ADF
Getting value from IoT, Integration and Data Analytics
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
Ti1220 Lecture 7: Polymorphism
Ti1220 Lecture 7: PolymorphismTi1220 Lecture 7: Polymorphism
Ti1220 Lecture 7: PolymorphismEelco Visser
 
Big Data LDN 2017: Processing Fast Data With Apache Spark: the Tale of Two APIs
Big Data LDN 2017: Processing Fast Data With Apache Spark: the Tale of Two APIsBig Data LDN 2017: Processing Fast Data With Apache Spark: the Tale of Two APIs
Big Data LDN 2017: Processing Fast Data With Apache Spark: the Tale of Two APIs
Matt Stubbs
 
Tools for Making Machine Learning more Reactive
Tools for Making Machine Learning more ReactiveTools for Making Machine Learning more Reactive
Tools for Making Machine Learning more Reactive
Jeff Smith
 

Similar to CAVE Overview (20)

Swift Sequences & Collections
Swift Sequences & CollectionsSwift Sequences & Collections
Swift Sequences & Collections
 
Improving Correctness with Types
Improving Correctness with TypesImproving Correctness with Types
Improving Correctness with Types
 
Strata Presentation: One Billion Objects in 2GB: Big Data Analytics on Small ...
Strata Presentation: One Billion Objects in 2GB: Big Data Analytics on Small ...Strata Presentation: One Billion Objects in 2GB: Big Data Analytics on Small ...
Strata Presentation: One Billion Objects in 2GB: Big Data Analytics on Small ...
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
Practical cats
Practical catsPractical cats
Practical cats
 
Altitude NY 2018: Leveraging Log Streaming to Build the Best Dashboards, Ever
Altitude NY 2018: Leveraging Log Streaming to Build the Best Dashboards, EverAltitude NY 2018: Leveraging Log Streaming to Build the Best Dashboards, Ever
Altitude NY 2018: Leveraging Log Streaming to Build the Best Dashboards, Ever
 
Beginning Scala Svcc 2009
Beginning Scala Svcc 2009Beginning Scala Svcc 2009
Beginning Scala Svcc 2009
 
Spark workshop
Spark workshopSpark workshop
Spark workshop
 
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data EcosystemWprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
 
Logstash-Elasticsearch-Kibana
Logstash-Elasticsearch-KibanaLogstash-Elasticsearch-Kibana
Logstash-Elasticsearch-Kibana
 
Solr @ Etsy - Apache Lucene Eurocon
Solr @ Etsy - Apache Lucene EuroconSolr @ Etsy - Apache Lucene Eurocon
Solr @ Etsy - Apache Lucene Eurocon
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
 
How te bring common UI patterns to ADF
How te bring common UI patterns to ADFHow te bring common UI patterns to ADF
How te bring common UI patterns to ADF
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Ti1220 Lecture 7: Polymorphism
Ti1220 Lecture 7: PolymorphismTi1220 Lecture 7: Polymorphism
Ti1220 Lecture 7: Polymorphism
 
Big Data LDN 2017: Processing Fast Data With Apache Spark: the Tale of Two APIs
Big Data LDN 2017: Processing Fast Data With Apache Spark: the Tale of Two APIsBig Data LDN 2017: Processing Fast Data With Apache Spark: the Tale of Two APIs
Big Data LDN 2017: Processing Fast Data With Apache Spark: the Tale of Two APIs
 
Tools for Making Machine Learning more Reactive
Tools for Making Machine Learning more ReactiveTools for Making Machine Learning more Reactive
Tools for Making Machine Learning more Reactive
 

Recently uploaded

Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
Octavian Nadolu
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
Google
 
Empowering Growth with Best Software Development Company in Noida - Deuglo
Empowering Growth with Best Software  Development Company in Noida - DeugloEmpowering Growth with Best Software  Development Company in Noida - Deuglo
Empowering Growth with Best Software Development Company in Noida - Deuglo
Deuglo Infosystem Pvt Ltd
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
Adele Miller
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
Google
 
Launch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in MinutesLaunch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in Minutes
Roshan Dwivedi
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Łukasz Chruściel
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
Aftab Hussain
 
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdfAutomated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
timtebeek1
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Crescat
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate
 
Using Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional SafetyUsing Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional Safety
Ayan Halder
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
Aftab Hussain
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
Drona Infotech
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
Rakesh Kumar R
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
TheSMSPoint
 
AI Genie Review: World’s First Open AI WordPress Website Creator
AI Genie Review: World’s First Open AI WordPress Website CreatorAI Genie Review: World’s First Open AI WordPress Website Creator
AI Genie Review: World’s First Open AI WordPress Website Creator
Google
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
Hornet Dynamics
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
rickgrimesss22
 

Recently uploaded (20)

Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
 
Empowering Growth with Best Software Development Company in Noida - Deuglo
Empowering Growth with Best Software  Development Company in Noida - DeugloEmpowering Growth with Best Software  Development Company in Noida - Deuglo
Empowering Growth with Best Software Development Company in Noida - Deuglo
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
 
Launch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in MinutesLaunch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in Minutes
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
 
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdfAutomated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
 
Using Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional SafetyUsing Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional Safety
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
 
AI Genie Review: World’s First Open AI WordPress Website Creator
AI Genie Review: World’s First Open AI WordPress Website CreatorAI Genie Review: World’s First Open AI WordPress Website Creator
AI Genie Review: World’s First Open AI WordPress Website Creator
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
 

CAVE Overview

  • 1. CAVE - an overview Val Dumitrescu Paweł Raszewski
  • 2. Another monitoring solution? At GILT: ● OpenTSDB + Nagios ● DataDog ● NewRelic ● Notifications with PagerDuty
  • 3. What is CAVE? Continuous Audit Vault Enterprise
  • 4. What is CAVE? A monitoring system that is: ● secure ● independent ● proprietary ● open source
  • 5. Requirements ● horizontally scalable to millions of metrics, alerts ● multi-tenant, multi-user ● extensible HTTP-based API ● flexible metric definition ● data aggregation / multiple dimensions ● flexible and extensible alert grammar ● pluggable notification delivery system ● clean user interface for graphing and dashboarding
  • 13. Alert Grammar Metric has name and tags (key-value pairs) e.g. orders [shipTo: US] response-time [svc: svc-important, env: prod]
  • 14. Alert Grammar Aggregated Metric has metric, aggregator and period of aggregation, e.g. orders [shipTo: US].sum.5m response-time [svc: svc-important, env: prod].p99.5m Supported aggregators: count, min, max, mean, mode, median, sum stddev, p99, p999, p95, p90
  • 15. Alert Grammar Alert Condition contains one expression with two terms and an operator. Each term is a metric, an aggregated metric or a value. e.g. orders [shipTo: US].sum.5m < 10 orders [shipTo: US].sum.5m < ordersPredictedLow [shipTo: US]
  • 16. Alert Grammar An optional number of times the threshold is broken, e.g. response-time [svc: svc-team, env: prod].p99.5m > 3000 at least 3 times
  • 17. Alert Grammar Special format for missing data e.g. orders [shipTo: US] missing for 5m heartbeat [svc: svc-important, env: prod] missing for 10m
  • 18. Alert Grammar trait AlertParser extends JavaTokenParsers { sealed trait Source case class ValueSource(value: Double) extends Source case class MetricSource( metric: String, tags: Map[String, String]) extends Source case class AggregatedSource( metricSource: MetricSource, aggregator: Aggregator, duration: FiniteDuration) extends Source sealed trait AlertEntity case class SimpleAlert( sourceLeft: Source, operator: Operator, sourceRight: Source, times: Int) extends AlertEntity case class MissingDataAlert( metricSource: MetricSource, duration: FiniteDuration) extends AlertEntity … }
  • 19. Alert Grammar trait AlertParser extends JavaTokenParsers { … def valueSource: Parser[ValueSource] = decimalNumber ^^ { case num => ValueSource(num.toDouble) } def word: Parser[String] = """[a-zA-Z][a-zA-Z0-9.-]*""".r def metricTag: Parser[(String, String)] = (word <~ ":") ~ word ^^ { case key ~ value => key -> value } def metricTags: Parser[Map[String, String]] = repsep(metricTag, ",") ^^ { case list => list.toMap } … }
  • 20. Alert Grammar trait AlertParser extends JavaTokenParsers { … def metricSourceWithTags: Parser[MetricSource] = (word <~ "[") ~ (metricTags <~ "]") ^^ { case metric ~ tagMap => MetricSource(metric, tagMap) } def metricSourceWithoutTags: Parser[MetricSource] = word ^^ { case metric => MetricSource(metric, Map.empty[String, String]) } def metricSource = metricSourceWithTags | metricSourceWithoutTags … }
  • 21. Alert Grammar trait AlertParser extends JavaTokenParsers { … def duration: Parser[FiniteDuration] = wholeNumber ~ ("s"|"m"|"h"|"d") ^^ { case time ~ "s" => time.toInt.seconds case time ~ "m" => time.toInt.minutes case time ~ "h" => time.toInt.hours case time ~ "d" => time.toInt.days } def aggregatedSource: Parser[AggregatedSource] = (metricSource <~ ".") ~ (aggregator <~ ".") ~ duration ^^ { case met ~ agg ~ dur => AggregatedSource(met, agg, dur) } def anySource: Parser[Source] = valueSource | aggregatedSource | metricSource … }
  • 22. Alert Grammar trait AlertParser extends JavaTokenParsers { … def missingDataAlert: Parser[MissingDataAlert] = metricSource ~ "missing for" ~ duration ^^ { case source ~ _ ~ d => MissingDataAlert(source, d) } def simpleAlert: Parser[SimpleAlert] = anySource ~ operator ~ anySource ^^ { case left ~ op ~ right => SimpleAlert(left, op, right, 1) } def repeater: Parser[Int] = "at least" ~ wholeNumber ~ "times" ^^ { case _ ~ num ~ _ => num.toInt } def simpleAlertWithRepeater: Parser[SimpleAlert] = anySource ~ operator ~ anySource ~ repeater ^^ { case left ~ op ~ right ~ num => SimpleAlert(left, op, right, num) }
  • 23. Alert Grammar trait AlertParser extends JavaTokenParsers { … def anyAlert: Parser[AlertEntity] = missingDataAlert | simpleAlertWithRepeater | simpleAlert } Usage: class Something(conditionString: String) extends AlertParser { … parseAll(anyAlert, conditionString) match { case Success(SimpleAlert(left, op, right, times), _) => … case Success(MissingDataAlert(metric, duration), _) => … case Failure(message, _) => … } }
  • 24. Slick Functional Relational Mapping (FRM) library for Scala Slick <> Hibernate
  • 25. Slick compile-time safety no need to write SQL full control over what is going on
  • 26. Scala Collections API case class Person(id: Int, name: String) val list = List(Person(1, "Pawel"), Person(2, "Val"), Person(3, "Unknown Name"))
  • 27. Scala Collections API case class Person(id: Int, name: String) val list = List(Person(1, "Pawel"), Person(2, "Val"), Person(3, "Unknown Name")) list.filter(_.id > 1)
  • 28. Scala Collections API case class Person(id: Int, name: String) val list = List(Person(1, "Pawel"), Person(2, "Val"), Person(3, "Unknown Name")) list.filter(_.id > 1).map(_.name)
  • 29. Scala Collections API case class Person(id: Int, name: String) val list = List(Person(1, "Pawel"), Person(2, "Val"), Person(3, "Unknown Name")) list.filter(_.id > 1).map(_.name) SELECT name FROM list WHERE id > 1
  • 31. Entity mapping /** Table description of table orgs.*/ class OrganizationsTable(tag: Tag) extends Table[OrganizationsRow](tag,"organizations") { ... /** Database column id AutoInc, PrimaryKey */ val id: Column[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey) /** Database column name */ val name: Column[String] = column[String]("name") /** Database column created_at */ val createdAt: Column[java.sql.Timestamp] = column[java.sql.Timestamp]("created_at") … /** Foreign key referencing Organizations (database name token_organization_fk) */ lazy val organizationsFk = foreignKey("token_organization_fk", organizationId, Organizations)(r => r.id, onUpdate = ForeignKeyAction.NoAction, onDelete = ForeignKeyAction.NoAction) }
  • 32. CRUD val organizationsTable = TableQuery[OrganizationsTable] // SELECT * FROM ORGANIZATIONS organizationsTable.list // SELECT * FROM ORGANIZATIONS WHERE ID > 10 OFFSET 3 LIMIT 5 organizationsTable.filter(_.id > 10).drop(3).take(5).list // INSERT organizationsTable += OrganizationsRow(1, "name", "email", "notificationUrl", ... , None, None) // UPDATE ORGANIZATIONS SET name = “new org name” WHERE ID=10 organizationsTable.filter(_.id === 10).map(_.name).update("new org name") // DELETE FROM ORGANIZATIONS WHERE ID=10 organizationsTable.filter(_.id === 10).delete
  • 33. Queries - JOINS val organizationsTable = TableQuery[OrganizationsTable] val teamsTable = TableQuery[TeamsTable] val name = “teamName” val result = for { t <- teamsTable.sortBy(_.createdAt).filter(t => t.deletedAt.isEmpty) o <- t.organization.filter(o => o.deletedAt.isEmpty && o.name === name) } yield (t.name, o.name) SELECT t.name, o.name FROM TEAMS t LEFT JOIN ORGANIZATIONS o ON t.organization_id = o.id WHERE t.deleted_at IS NULL AND o.deleted_at IS NULL AND o.name = `teamName` ORDER BY t.created_at
  • 34. SELECT t.name, o.name FROM TEAMS t LEFT JOIN ORGANIZATIONS o ON t.organization_id = o.id WHERE t.deleted_at IS NULL AND o.deleted_at IS NULL AND o.name = `teamName` ORDER BY t.created_at val result: List[(String, String)]
  • 35. Connection pool and transactions val ds = new BoneCPDataSource val db = { ds.setDriverClass(rdsDriver) ds.setJdbcUrl(rdsJdbcConnectionString) ds.setPassword(rdsPassword) ds.setUser(rdsUser) Database.forDataSource(ds) } db.withTransaction { implicit session => // SLICK CODE GOES HERE }