SlideShare una empresa de Scribd logo
1 de 56
Descargar para leer sin conexión
Monitor all the Things!

KEVIN MCGUIRE - DIRECTOR OF ENGINEERING, PLATFORM
OCTOBER 25/2013

Wednesday, November 6, 13
The evolution of monitoring

Wednesday, November 6, 13
The evolution of monitoring

Wednesday, November 6, 13
The evolution of monitoring

Wednesday, November 6, 13
The evolution of monitoring

Wednesday, November 6, 13
Your end user experience depends on more

Wednesday, November 6, 13
A lot more

Wednesday, November 6, 13
You can’t manage what you can’t monitor

Wednesday, November 6, 13
You can’t manage what you can’t monitor

Wednesday, November 6, 13
You can’t manage what you can’t monitor

Wednesday, November 6, 13
Solution?

Wednesday, November 6, 13
Solution?
MONITOR ALL THE THINGS!

http://hyperboleandahalf.blogspot.com/

Wednesday, November 6, 13
Platform gives complete visibility

Wednesday, November 6, 13
Platform gives complete visibility

Wednesday, November 6, 13
Platform gives complete visibility

Wednesday, November 6, 13
Plugins for, well, everything!
To
ob
ig
t

68 69 published plugins
29 different publishers

of

Wednesday, November 6, 13

it i
n

pre
s

en
tat

ion
!
We got databases

Wednesday, November 6, 13
We got yer NoSQL stores

Wednesday, November 6, 13
Yup, caching too

Wednesday, November 6, 13
Queuing, web server, load blance, ...

Wednesday, November 6, 13
And my personal favorite:

Wednesday, November 6, 13
And my personal favorite:

You go Yuri Yasiyarov, wherever you are!

Wednesday, November 6, 13
Integrated, 1st class experience

Wednesday, November 6, 13
Integrated, 1st class experience

Wednesday, November 6, 13
Integrated, 1st class experience

Wednesday, November 6, 13
Integrated, 1st class experience

Wednesday, November 6, 13
Integrated, 1st class experience

Wednesday, November 6, 13
Customized charts
MySQL plugin has MySQL’y stuff

Wednesday, November 6, 13
Install is a snap
Easy as...
1

Wednesday, November 6, 13
Install is a snap
Easy as...
1

2
[
{
"name" : "Localhost",
"host" : "localhost",
"user" : "USER_NAME_HERE",
"passwd" : "USER_PASSWD_HERE"
},
]
licenseKey=blahblahblah12345

Wednesday, November 6, 13
Install is a snap
Easy as...
1

2

3

[

java -jar newrelic_mysql_plugin.jar
{
"name" : "Localhost",
"host" : "localhost",
"user" : "USER_NAME_HERE",
"passwd" : "USER_PASSWD_HERE"
},

]
licenseKey=blahblahblah12345

Wednesday, November 6, 13
Independent runtime
Infrastructure
Varnish
Server

Memcached
Server

MySQL
Server 1
MySQL
Server 2

Externally monitored

Platform Agents
Varnish
Agent

Memcached
Agent

...

RPM
MySQL
Agent

+ GUID +

New Relic
Metric
Store

Wednesday, November 6, 13

MySQL
UI

...

Memcached UI

Varnish
UI
SaaS
SaaS Service
Customer A

Customer B B
Customer
Customer B
Data
Customer B
Data
Data

Customer X

Customer X
license key

SaaS ‘agent code’

RPM

+ GUID +

HTTP API

New Relic
Metric
Store

Wednesday, November 6, 13

SaaS
UI

...

Memcached UI

Varnish
UI
Don’t see one you like?

Built 9 prior to launch,
now at 14!

Wednesday, November 6, 13

Built 6!

Built 4!

Built 3!

Built the Redis Plugin in a
couple hours, and used it to
solve performance issues the
same day
Simple APIs + SDKs = Easy to write

Wednesday, November 6, 13
Simple APIs + SDKs = Easy to write
•SDKs do all the “heavy lifting”
•Java (primary), Ruby
•Runs polling cycle
•Connecting to New Relic
•Aggregation

Wednesday, November 6, 13
Simple APIs + SDKs = Easy to write
•SDKs do all the “heavy lifting”
•Java (primary), Ruby
•Runs polling cycle
•Connecting to New Relic
•Aggregation
•HTTP API
•SaaS
•Non Java/Ruby

Wednesday, November 6, 13
Anatomy of a plugin agent
(yes, it’s really that simple)
public	
  class	
  MySQLAgent	
  extends	
  Agent	
  {
	
  	
  public	
  MySQLAgent()	
  {
	
  	
  	
  	
  super("com.mycompany.mysql",	
  "1.0.0");
	
  	
  }
	
  	
  private	
  Map<String,	
  Number>	
  gatherMetrics()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  MySQL.runSQL(getConnection(),	
  "SHOW	
  GLOBAL	
  STATUS");	
  
	
  	
  	
  	
  return	
  metrics;
	
  	
  }
	
  	
  public	
  void	
  pollCycle()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  gatherMetrics();	
  

	
  	
  	
  	
  reportMetric("network/bytes_reads",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_reads"));
	
  	
  	
  	
  reportMetric("network/bytes_writes",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_writes"));
	
  	
  	
  	
  reportMetric("queries/com_select",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "selects/second",	
  	
  metrics.get("com_select"));
	
  	
  	
  	
  reportMetric("queries/com_insert",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "inserts/second",	
  	
  metrics.get("com_insert"));
	
  	
  	
  	
  reportMetric("queries/slow_queries",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "queries/second",	
  	
  metrics.get("slow_queries"));
	
  	
  	
  	
  reportMetric("connections/connected",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "connections",	
  	
  	
  	
  	
  metrics.get("connections_connected"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_flushed",	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_flushed"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_dirty",	
  	
  	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_dirty"));
	
  	
  	
  	
  //	
  ...
	
  	
  }
}

Wednesday, November 6, 13
Anatomy of a plugin agent
(yes, it’s really that simple)
public	
  class	
  MySQLAgent	
  extends	
  Agent	
  {
	
  	
  public	
  MySQLAgent()	
  {
	
  	
  	
  	
  super("com.mycompany.mysql",	
  "1.0.0");
	
  	
  }

Unique identifier (GUID), agent version

	
  	
  private	
  Map<String,	
  Number>	
  gatherMetrics()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  MySQL.runSQL(getConnection(),	
  "SHOW	
  GLOBAL	
  STATUS");	
  
	
  	
  	
  	
  return	
  metrics;
	
  	
  }
	
  	
  public	
  void	
  pollCycle()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  gatherMetrics();	
  

	
  	
  	
  	
  reportMetric("network/bytes_reads",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_reads"));
	
  	
  	
  	
  reportMetric("network/bytes_writes",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_writes"));
	
  	
  	
  	
  reportMetric("queries/com_select",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "selects/second",	
  	
  metrics.get("com_select"));
	
  	
  	
  	
  reportMetric("queries/com_insert",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "inserts/second",	
  	
  metrics.get("com_insert"));
	
  	
  	
  	
  reportMetric("queries/slow_queries",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "queries/second",	
  	
  metrics.get("slow_queries"));
	
  	
  	
  	
  reportMetric("connections/connected",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "connections",	
  	
  	
  	
  	
  metrics.get("connections_connected"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_flushed",	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_flushed"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_dirty",	
  	
  	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_dirty"));
	
  	
  	
  	
  //	
  ...
	
  	
  }
}

Wednesday, November 6, 13
Anatomy of a plugin agent
(yes, it’s really that simple)
public	
  class	
  MySQLAgent	
  extends	
  Agent	
  {
	
  	
  public	
  MySQLAgent()	
  {
	
  	
  	
  	
  super("com.mycompany.mysql",	
  "1.0.0");
	
  	
  }

Unique identifier (GUID), agent version

	
  	
  private	
  Map<String,	
  Number>	
  gatherMetrics()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  MySQL.runSQL(getConnection(),	
  "SHOW	
  GLOBAL	
  STATUS");	
  
	
  	
  	
  	
  return	
  metrics;
	
  	
  }

Query metrics from system

	
  	
  public	
  void	
  pollCycle()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  gatherMetrics();	
  

	
  	
  	
  	
  reportMetric("network/bytes_reads",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_reads"));
	
  	
  	
  	
  reportMetric("network/bytes_writes",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_writes"));
	
  	
  	
  	
  reportMetric("queries/com_select",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "selects/second",	
  	
  metrics.get("com_select"));
	
  	
  	
  	
  reportMetric("queries/com_insert",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "inserts/second",	
  	
  metrics.get("com_insert"));
	
  	
  	
  	
  reportMetric("queries/slow_queries",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "queries/second",	
  	
  metrics.get("slow_queries"));
	
  	
  	
  	
  reportMetric("connections/connected",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "connections",	
  	
  	
  	
  	
  metrics.get("connections_connected"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_flushed",	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_flushed"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_dirty",	
  	
  	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_dirty"));
	
  	
  	
  	
  //	
  ...
	
  	
  }
}

Wednesday, November 6, 13
Anatomy of a plugin agent
(yes, it’s really that simple)
public	
  class	
  MySQLAgent	
  extends	
  Agent	
  {
	
  	
  public	
  MySQLAgent()	
  {
	
  	
  	
  	
  super("com.mycompany.mysql",	
  "1.0.0");
	
  	
  }

Unique identifier (GUID), agent version

	
  	
  private	
  Map<String,	
  Number>	
  gatherMetrics()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  MySQL.runSQL(getConnection(),	
  "SHOW	
  GLOBAL	
  STATUS");	
  
	
  	
  	
  	
  return	
  metrics;
	
  	
  }

Query metrics from system

	
  	
  public	
  void	
  pollCycle()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  gatherMetrics();	
  

Value
	
  	
  	
  	
  reportMetric("network/bytes_reads",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_reads"));
	
  	
  	
  	
  reportMetric("network/bytes_writes",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_writes"));
	
  	
  	
  	
  reportMetric("queries/com_select",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "selects/second",	
  	
  metrics.get("com_select"));
	
  	
  	
  	
  reportMetric("queries/com_insert",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "inserts/second",	
  	
  metrics.get("com_insert"));
	
  	
  	
  	
  reportMetric("queries/slow_queries",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "queries/second",	
  	
  metrics.get("slow_queries"));
	
  	
  	
  	
  reportMetric("connections/connected",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "connections",	
  	
  	
  	
  	
  metrics.get("connections_connected"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_flushed",	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_flushed"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_dirty",	
  	
  	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_dirty"));
	
  	
  	
  	
  //	
  ...
	
  	
  }
}

Wednesday, November 6, 13
Anatomy of a plugin agent
(yes, it’s really that simple)
public	
  class	
  MySQLAgent	
  extends	
  Agent	
  {
	
  	
  public	
  MySQLAgent()	
  {
	
  	
  	
  	
  super("com.mycompany.mysql",	
  "1.0.0");
	
  	
  }

Unique identifier (GUID), agent version

	
  	
  private	
  Map<String,	
  Number>	
  gatherMetrics()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  MySQL.runSQL(getConnection(),	
  "SHOW	
  GLOBAL	
  STATUS");	
  
	
  	
  	
  	
  return	
  metrics;
	
  	
  }

Query metrics from system

	
  	
  public	
  void	
  pollCycle()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  gatherMetrics();	
  

Identifier

Value

	
  	
  	
  	
  reportMetric("network/bytes_reads",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_reads"));
	
  	
  	
  	
  reportMetric("network/bytes_writes",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_writes"));
	
  	
  	
  	
  reportMetric("queries/com_select",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "selects/second",	
  	
  metrics.get("com_select"));
	
  	
  	
  	
  reportMetric("queries/com_insert",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "inserts/second",	
  	
  metrics.get("com_insert"));
	
  	
  	
  	
  reportMetric("queries/slow_queries",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "queries/second",	
  	
  metrics.get("slow_queries"));
	
  	
  	
  	
  reportMetric("connections/connected",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "connections",	
  	
  	
  	
  	
  metrics.get("connections_connected"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_flushed",	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_flushed"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_dirty",	
  	
  	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_dirty"));
	
  	
  	
  	
  //	
  ...
	
  	
  }
}

Wednesday, November 6, 13
Anatomy of a plugin agent
(yes, it’s really that simple)
public	
  class	
  MySQLAgent	
  extends	
  Agent	
  {
	
  	
  public	
  MySQLAgent()	
  {
	
  	
  	
  	
  super("com.mycompany.mysql",	
  "1.0.0");
	
  	
  }

Unique identifier (GUID), agent version

	
  	
  private	
  Map<String,	
  Number>	
  gatherMetrics()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  MySQL.runSQL(getConnection(),	
  "SHOW	
  GLOBAL	
  STATUS");	
  
	
  	
  	
  	
  return	
  metrics;
	
  	
  }

Query metrics from system

	
  	
  public	
  void	
  pollCycle()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  gatherMetrics();	
  

Identifier

Units

Value

	
  	
  	
  	
  reportMetric("network/bytes_reads",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_reads"));
	
  	
  	
  	
  reportMetric("network/bytes_writes",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_writes"));
	
  	
  	
  	
  reportMetric("queries/com_select",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "selects/second",	
  	
  metrics.get("com_select"));
	
  	
  	
  	
  reportMetric("queries/com_insert",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "inserts/second",	
  	
  metrics.get("com_insert"));
	
  	
  	
  	
  reportMetric("queries/slow_queries",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "queries/second",	
  	
  metrics.get("slow_queries"));
	
  	
  	
  	
  reportMetric("connections/connected",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "connections",	
  	
  	
  	
  	
  metrics.get("connections_connected"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_flushed",	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_flushed"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_dirty",	
  	
  	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_dirty"));
	
  	
  	
  	
  //	
  ...
	
  	
  }
}

Wednesday, November 6, 13
Anatomy of a plugin agent
(yes, it’s really that simple)
public	
  class	
  MySQLAgent	
  extends	
  Agent	
  {
	
  	
  public	
  MySQLAgent()	
  {
	
  	
  	
  	
  super("com.mycompany.mysql",	
  "1.0.0");
	
  	
  }

Unique identifier (GUID), agent version

	
  	
  private	
  Map<String,	
  Number>	
  gatherMetrics()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  MySQL.runSQL(getConnection(),	
  "SHOW	
  GLOBAL	
  STATUS");	
  
	
  	
  	
  	
  return	
  metrics;
	
  	
  }

Query metrics from system

	
  	
  public	
  void	
  pollCycle()	
  {
	
  	
  	
  	
  Map<String,	
  Number>	
  metrics	
  =	
  gatherMetrics();	
  

Send to NR

Identifier

Units

Value

	
  	
  	
  	
  reportMetric("network/bytes_reads",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_reads"));
	
  	
  	
  	
  reportMetric("network/bytes_writes",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "bytes/second",	
  	
  	
  	
  metrics.get("bytes_writes"));
	
  	
  	
  	
  reportMetric("queries/com_select",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "selects/second",	
  	
  metrics.get("com_select"));
	
  	
  	
  	
  reportMetric("queries/com_insert",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "inserts/second",	
  	
  metrics.get("com_insert"));
	
  	
  	
  	
  reportMetric("queries/slow_queries",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "queries/second",	
  	
  metrics.get("slow_queries"));
	
  	
  	
  	
  reportMetric("connections/connected",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "connections",	
  	
  	
  	
  	
  metrics.get("connections_connected"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_flushed",	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_flushed"));
	
  	
  	
  	
  reportMetric("innodb/buffer_pool_pages_dirty",	
  	
  	
  "pages",	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  metrics.get("innodb_buffer_pool_pages_dirty"));
	
  	
  	
  	
  //	
  ...
	
  	
  }
}

Wednesday, November 6, 13
Easy to build UIs

Wednesday, November 6, 13
Custom Dashboards
Fast and easy UI creation

Wednesday, November 6, 13
Optionally publish
Lists in Plugin Central, makes available the UIs

Wednesday, November 6, 13
Install UI = run the agent
Infrastructure
Varnish
Server

Memcached
Server

MySQL
Server 1
MySQL
Server 2

Externally monitored

Platform Agents
Varnish
Agent

Memcached
Agent

...

RPM
MySQL
Agent

+ GUID +

New Relic
Metric
Store

Wednesday, November 6, 13

MySQL
UI

...

Memcached UI

Varnish
UI
Install UI = run the agent
Infrastructure
Varnish
Server

Memcached
Server

MySQL
Server 1
MySQL
Server 2

Externally monitored

Platform Agents
Varnish
Agent

Memcached
Agent

...

RPM
MySQL
Agent

+ GUID +

New Relic
Metric
Store

Wednesday, November 6, 13

MySQL
UI

...

Memcached UI

Varnish
UI
“But Kevin, how much will all this cost?”

Wednesday, November 6, 13
“But Kevin, how much will all this cost?”

Free!!
Wednesday, November 6, 13
New! Plugin community reviews
Help improve plugins, give feedback

Wednesday, November 6, 13
New! Private publishing
Distribute within multiple accounts, closed Betas

Wednesday, November 6, 13
In progress: Deployment recipes
Simplified configuration and deployment across your data center

Wednesday, November 6, 13
Get involved!
✓

Review plugins

✓ Contribute to the plugins
• Many are open source
• Write one!
✓

Contribute to the SDKs

✓ Help us with Chef
• Try out our recipes
• Try authoring recipes

Wednesday, November 6, 13
Thank you!

Wednesday, November 6, 13

Más contenido relacionado

Más de New Relic

FutureStack Tokyo 19 -[特別講演]システム開発によろこびと驚きの連鎖を
FutureStack Tokyo 19 -[特別講演]システム開発によろこびと驚きの連鎖をFutureStack Tokyo 19 -[特別講演]システム開発によろこびと驚きの連鎖を
FutureStack Tokyo 19 -[特別講演]システム開発によろこびと驚きの連鎖をNew Relic
 
FutureStack Tokyo 19 -[パートナー講演]アマゾン ウェブ サービス ジャパン株式会社: New Relicを活用したAWSへのアプリ...
FutureStack Tokyo 19 -[パートナー講演]アマゾン ウェブ サービス ジャパン株式会社: New Relicを活用したAWSへのアプリ...FutureStack Tokyo 19 -[パートナー講演]アマゾン ウェブ サービス ジャパン株式会社: New Relicを活用したAWSへのアプリ...
FutureStack Tokyo 19 -[パートナー講演]アマゾン ウェブ サービス ジャパン株式会社: New Relicを活用したAWSへのアプリ...New Relic
 
FutureStack Tokyo 19_インサイトとデータを組織の力にする_株式会社ドワンゴ 池田 明啓 氏
FutureStack Tokyo 19_インサイトとデータを組織の力にする_株式会社ドワンゴ 池田 明啓 氏FutureStack Tokyo 19_インサイトとデータを組織の力にする_株式会社ドワンゴ 池田 明啓 氏
FutureStack Tokyo 19_インサイトとデータを組織の力にする_株式会社ドワンゴ 池田 明啓 氏New Relic
 
Three Monitoring Mistakes and How to Avoid Them
Three Monitoring Mistakes and How to Avoid ThemThree Monitoring Mistakes and How to Avoid Them
Three Monitoring Mistakes and How to Avoid ThemNew Relic
 
Intro to Multidimensional Kubernetes Monitoring
Intro to Multidimensional Kubernetes MonitoringIntro to Multidimensional Kubernetes Monitoring
Intro to Multidimensional Kubernetes MonitoringNew Relic
 
FS18 Chicago Keynote
FS18 Chicago Keynote FS18 Chicago Keynote
FS18 Chicago Keynote New Relic
 
10 Things You Can Do With New Relic - Number 9 Will Shock You
10 Things You Can Do With New Relic - Number 9 Will Shock You10 Things You Can Do With New Relic - Number 9 Will Shock You
10 Things You Can Do With New Relic - Number 9 Will Shock YouNew Relic
 
Ground Rules for Code Reviews
Ground Rules for Code ReviewsGround Rules for Code Reviews
Ground Rules for Code ReviewsNew Relic
 
Understanding Microservice Latency for DevOps Teams: An Introduction to New R...
Understanding Microservice Latency for DevOps Teams: An Introduction to New R...Understanding Microservice Latency for DevOps Teams: An Introduction to New R...
Understanding Microservice Latency for DevOps Teams: An Introduction to New R...New Relic
 
Monitor all your Kubernetes and EKS stack with New Relic
Monitor all your Kubernetes and EKS stack with New Relic	Monitor all your Kubernetes and EKS stack with New Relic
Monitor all your Kubernetes and EKS stack with New Relic New Relic
 
Host for the Most: Cloud Cost Optimization
Host for the Most: Cloud Cost OptimizationHost for the Most: Cloud Cost Optimization
Host for the Most: Cloud Cost OptimizationNew Relic
 
New Relic Infrastructure in the Real World: AWS
New Relic Infrastructure in the Real World: AWSNew Relic Infrastructure in the Real World: AWS
New Relic Infrastructure in the Real World: AWSNew Relic
 
Best Practices for Measuring your Code Pipeline
Best Practices for Measuring your Code PipelineBest Practices for Measuring your Code Pipeline
Best Practices for Measuring your Code PipelineNew Relic
 
Top Three Mistakes People Make with Monitoring
Top Three Mistakes People Make with MonitoringTop Three Mistakes People Make with Monitoring
Top Three Mistakes People Make with MonitoringNew Relic
 
Kubernetes in the Wild: Best Practices for Monitoring
Kubernetes in the Wild: Best Practices for MonitoringKubernetes in the Wild: Best Practices for Monitoring
Kubernetes in the Wild: Best Practices for MonitoringNew Relic
 
re:Thinking the Cloud
re:Thinking the Cloudre:Thinking the Cloud
re:Thinking the CloudNew Relic
 
Our Evolution to GraphQL: Unifying our API Strategy
Our Evolution to GraphQL: Unifying our API StrategyOur Evolution to GraphQL: Unifying our API Strategy
Our Evolution to GraphQL: Unifying our API StrategyNew Relic
 
Kick Ass Data Exploration through Dashboards
Kick Ass Data Exploration through DashboardsKick Ass Data Exploration through Dashboards
Kick Ass Data Exploration through DashboardsNew Relic
 
DevOps without Measurement is a Fail
DevOps without Measurement is a FailDevOps without Measurement is a Fail
DevOps without Measurement is a FailNew Relic
 

Más de New Relic (20)

FutureStack Tokyo 19 -[特別講演]システム開発によろこびと驚きの連鎖を
FutureStack Tokyo 19 -[特別講演]システム開発によろこびと驚きの連鎖をFutureStack Tokyo 19 -[特別講演]システム開発によろこびと驚きの連鎖を
FutureStack Tokyo 19 -[特別講演]システム開発によろこびと驚きの連鎖を
 
FutureStack Tokyo 19 -[パートナー講演]アマゾン ウェブ サービス ジャパン株式会社: New Relicを活用したAWSへのアプリ...
FutureStack Tokyo 19 -[パートナー講演]アマゾン ウェブ サービス ジャパン株式会社: New Relicを活用したAWSへのアプリ...FutureStack Tokyo 19 -[パートナー講演]アマゾン ウェブ サービス ジャパン株式会社: New Relicを活用したAWSへのアプリ...
FutureStack Tokyo 19 -[パートナー講演]アマゾン ウェブ サービス ジャパン株式会社: New Relicを活用したAWSへのアプリ...
 
FutureStack Tokyo 19_インサイトとデータを組織の力にする_株式会社ドワンゴ 池田 明啓 氏
FutureStack Tokyo 19_インサイトとデータを組織の力にする_株式会社ドワンゴ 池田 明啓 氏FutureStack Tokyo 19_インサイトとデータを組織の力にする_株式会社ドワンゴ 池田 明啓 氏
FutureStack Tokyo 19_インサイトとデータを組織の力にする_株式会社ドワンゴ 池田 明啓 氏
 
Three Monitoring Mistakes and How to Avoid Them
Three Monitoring Mistakes and How to Avoid ThemThree Monitoring Mistakes and How to Avoid Them
Three Monitoring Mistakes and How to Avoid Them
 
Intro to Multidimensional Kubernetes Monitoring
Intro to Multidimensional Kubernetes MonitoringIntro to Multidimensional Kubernetes Monitoring
Intro to Multidimensional Kubernetes Monitoring
 
FS18 Chicago Keynote
FS18 Chicago Keynote FS18 Chicago Keynote
FS18 Chicago Keynote
 
SRE-iously
SRE-iouslySRE-iously
SRE-iously
 
10 Things You Can Do With New Relic - Number 9 Will Shock You
10 Things You Can Do With New Relic - Number 9 Will Shock You10 Things You Can Do With New Relic - Number 9 Will Shock You
10 Things You Can Do With New Relic - Number 9 Will Shock You
 
Ground Rules for Code Reviews
Ground Rules for Code ReviewsGround Rules for Code Reviews
Ground Rules for Code Reviews
 
Understanding Microservice Latency for DevOps Teams: An Introduction to New R...
Understanding Microservice Latency for DevOps Teams: An Introduction to New R...Understanding Microservice Latency for DevOps Teams: An Introduction to New R...
Understanding Microservice Latency for DevOps Teams: An Introduction to New R...
 
Monitor all your Kubernetes and EKS stack with New Relic
Monitor all your Kubernetes and EKS stack with New Relic	Monitor all your Kubernetes and EKS stack with New Relic
Monitor all your Kubernetes and EKS stack with New Relic
 
Host for the Most: Cloud Cost Optimization
Host for the Most: Cloud Cost OptimizationHost for the Most: Cloud Cost Optimization
Host for the Most: Cloud Cost Optimization
 
New Relic Infrastructure in the Real World: AWS
New Relic Infrastructure in the Real World: AWSNew Relic Infrastructure in the Real World: AWS
New Relic Infrastructure in the Real World: AWS
 
Best Practices for Measuring your Code Pipeline
Best Practices for Measuring your Code PipelineBest Practices for Measuring your Code Pipeline
Best Practices for Measuring your Code Pipeline
 
Top Three Mistakes People Make with Monitoring
Top Three Mistakes People Make with MonitoringTop Three Mistakes People Make with Monitoring
Top Three Mistakes People Make with Monitoring
 
Kubernetes in the Wild: Best Practices for Monitoring
Kubernetes in the Wild: Best Practices for MonitoringKubernetes in the Wild: Best Practices for Monitoring
Kubernetes in the Wild: Best Practices for Monitoring
 
re:Thinking the Cloud
re:Thinking the Cloudre:Thinking the Cloud
re:Thinking the Cloud
 
Our Evolution to GraphQL: Unifying our API Strategy
Our Evolution to GraphQL: Unifying our API StrategyOur Evolution to GraphQL: Unifying our API Strategy
Our Evolution to GraphQL: Unifying our API Strategy
 
Kick Ass Data Exploration through Dashboards
Kick Ass Data Exploration through DashboardsKick Ass Data Exploration through Dashboards
Kick Ass Data Exploration through Dashboards
 
DevOps without Measurement is a Fail
DevOps without Measurement is a FailDevOps without Measurement is a Fail
DevOps without Measurement is a Fail
 

Último

Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 

Último (20)

Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 

FUTURESTACK13: Monitor All the Things from Kevin McGuire, Director of Engineering at New Relic

  • 1. Monitor all the Things! KEVIN MCGUIRE - DIRECTOR OF ENGINEERING, PLATFORM OCTOBER 25/2013 Wednesday, November 6, 13
  • 2. The evolution of monitoring Wednesday, November 6, 13
  • 3. The evolution of monitoring Wednesday, November 6, 13
  • 4. The evolution of monitoring Wednesday, November 6, 13
  • 5. The evolution of monitoring Wednesday, November 6, 13
  • 6. Your end user experience depends on more Wednesday, November 6, 13
  • 7. A lot more Wednesday, November 6, 13
  • 8. You can’t manage what you can’t monitor Wednesday, November 6, 13
  • 9. You can’t manage what you can’t monitor Wednesday, November 6, 13
  • 10. You can’t manage what you can’t monitor Wednesday, November 6, 13
  • 12. Solution? MONITOR ALL THE THINGS! http://hyperboleandahalf.blogspot.com/ Wednesday, November 6, 13
  • 13. Platform gives complete visibility Wednesday, November 6, 13
  • 14. Platform gives complete visibility Wednesday, November 6, 13
  • 15. Platform gives complete visibility Wednesday, November 6, 13
  • 16. Plugins for, well, everything! To ob ig t 68 69 published plugins 29 different publishers of Wednesday, November 6, 13 it i n pre s en tat ion !
  • 17. We got databases Wednesday, November 6, 13
  • 18. We got yer NoSQL stores Wednesday, November 6, 13
  • 19. Yup, caching too Wednesday, November 6, 13
  • 20. Queuing, web server, load blance, ... Wednesday, November 6, 13
  • 21. And my personal favorite: Wednesday, November 6, 13
  • 22. And my personal favorite: You go Yuri Yasiyarov, wherever you are! Wednesday, November 6, 13
  • 23. Integrated, 1st class experience Wednesday, November 6, 13
  • 24. Integrated, 1st class experience Wednesday, November 6, 13
  • 25. Integrated, 1st class experience Wednesday, November 6, 13
  • 26. Integrated, 1st class experience Wednesday, November 6, 13
  • 27. Integrated, 1st class experience Wednesday, November 6, 13
  • 28. Customized charts MySQL plugin has MySQL’y stuff Wednesday, November 6, 13
  • 29. Install is a snap Easy as... 1 Wednesday, November 6, 13
  • 30. Install is a snap Easy as... 1 2 [ { "name" : "Localhost", "host" : "localhost", "user" : "USER_NAME_HERE", "passwd" : "USER_PASSWD_HERE" }, ] licenseKey=blahblahblah12345 Wednesday, November 6, 13
  • 31. Install is a snap Easy as... 1 2 3 [ java -jar newrelic_mysql_plugin.jar { "name" : "Localhost", "host" : "localhost", "user" : "USER_NAME_HERE", "passwd" : "USER_PASSWD_HERE" }, ] licenseKey=blahblahblah12345 Wednesday, November 6, 13
  • 32. Independent runtime Infrastructure Varnish Server Memcached Server MySQL Server 1 MySQL Server 2 Externally monitored Platform Agents Varnish Agent Memcached Agent ... RPM MySQL Agent + GUID + New Relic Metric Store Wednesday, November 6, 13 MySQL UI ... Memcached UI Varnish UI
  • 33. SaaS SaaS Service Customer A Customer B B Customer Customer B Data Customer B Data Data Customer X Customer X license key SaaS ‘agent code’ RPM + GUID + HTTP API New Relic Metric Store Wednesday, November 6, 13 SaaS UI ... Memcached UI Varnish UI
  • 34. Don’t see one you like? Built 9 prior to launch, now at 14! Wednesday, November 6, 13 Built 6! Built 4! Built 3! Built the Redis Plugin in a couple hours, and used it to solve performance issues the same day
  • 35. Simple APIs + SDKs = Easy to write Wednesday, November 6, 13
  • 36. Simple APIs + SDKs = Easy to write •SDKs do all the “heavy lifting” •Java (primary), Ruby •Runs polling cycle •Connecting to New Relic •Aggregation Wednesday, November 6, 13
  • 37. Simple APIs + SDKs = Easy to write •SDKs do all the “heavy lifting” •Java (primary), Ruby •Runs polling cycle •Connecting to New Relic •Aggregation •HTTP API •SaaS •Non Java/Ruby Wednesday, November 6, 13
  • 38. Anatomy of a plugin agent (yes, it’s really that simple) public  class  MySQLAgent  extends  Agent  {    public  MySQLAgent()  {        super("com.mycompany.mysql",  "1.0.0");    }    private  Map<String,  Number>  gatherMetrics()  {        Map<String,  Number>  metrics  =  MySQL.runSQL(getConnection(),  "SHOW  GLOBAL  STATUS");          return  metrics;    }    public  void  pollCycle()  {        Map<String,  Number>  metrics  =  gatherMetrics();          reportMetric("network/bytes_reads",                            "bytes/second",        metrics.get("bytes_reads"));        reportMetric("network/bytes_writes",                          "bytes/second",        metrics.get("bytes_writes"));        reportMetric("queries/com_select",                              "selects/second",    metrics.get("com_select"));        reportMetric("queries/com_insert",                              "inserts/second",    metrics.get("com_insert"));        reportMetric("queries/slow_queries",                          "queries/second",    metrics.get("slow_queries"));        reportMetric("connections/connected",                        "connections",          metrics.get("connections_connected"));        reportMetric("innodb/buffer_pool_pages_flushed",  "pages",                      metrics.get("innodb_buffer_pool_pages_flushed"));        reportMetric("innodb/buffer_pool_pages_dirty",      "pages",                      metrics.get("innodb_buffer_pool_pages_dirty"));        //  ...    } } Wednesday, November 6, 13
  • 39. Anatomy of a plugin agent (yes, it’s really that simple) public  class  MySQLAgent  extends  Agent  {    public  MySQLAgent()  {        super("com.mycompany.mysql",  "1.0.0");    } Unique identifier (GUID), agent version    private  Map<String,  Number>  gatherMetrics()  {        Map<String,  Number>  metrics  =  MySQL.runSQL(getConnection(),  "SHOW  GLOBAL  STATUS");          return  metrics;    }    public  void  pollCycle()  {        Map<String,  Number>  metrics  =  gatherMetrics();          reportMetric("network/bytes_reads",                            "bytes/second",        metrics.get("bytes_reads"));        reportMetric("network/bytes_writes",                          "bytes/second",        metrics.get("bytes_writes"));        reportMetric("queries/com_select",                              "selects/second",    metrics.get("com_select"));        reportMetric("queries/com_insert",                              "inserts/second",    metrics.get("com_insert"));        reportMetric("queries/slow_queries",                          "queries/second",    metrics.get("slow_queries"));        reportMetric("connections/connected",                        "connections",          metrics.get("connections_connected"));        reportMetric("innodb/buffer_pool_pages_flushed",  "pages",                      metrics.get("innodb_buffer_pool_pages_flushed"));        reportMetric("innodb/buffer_pool_pages_dirty",      "pages",                      metrics.get("innodb_buffer_pool_pages_dirty"));        //  ...    } } Wednesday, November 6, 13
  • 40. Anatomy of a plugin agent (yes, it’s really that simple) public  class  MySQLAgent  extends  Agent  {    public  MySQLAgent()  {        super("com.mycompany.mysql",  "1.0.0");    } Unique identifier (GUID), agent version    private  Map<String,  Number>  gatherMetrics()  {        Map<String,  Number>  metrics  =  MySQL.runSQL(getConnection(),  "SHOW  GLOBAL  STATUS");          return  metrics;    } Query metrics from system    public  void  pollCycle()  {        Map<String,  Number>  metrics  =  gatherMetrics();          reportMetric("network/bytes_reads",                            "bytes/second",        metrics.get("bytes_reads"));        reportMetric("network/bytes_writes",                          "bytes/second",        metrics.get("bytes_writes"));        reportMetric("queries/com_select",                              "selects/second",    metrics.get("com_select"));        reportMetric("queries/com_insert",                              "inserts/second",    metrics.get("com_insert"));        reportMetric("queries/slow_queries",                          "queries/second",    metrics.get("slow_queries"));        reportMetric("connections/connected",                        "connections",          metrics.get("connections_connected"));        reportMetric("innodb/buffer_pool_pages_flushed",  "pages",                      metrics.get("innodb_buffer_pool_pages_flushed"));        reportMetric("innodb/buffer_pool_pages_dirty",      "pages",                      metrics.get("innodb_buffer_pool_pages_dirty"));        //  ...    } } Wednesday, November 6, 13
  • 41. Anatomy of a plugin agent (yes, it’s really that simple) public  class  MySQLAgent  extends  Agent  {    public  MySQLAgent()  {        super("com.mycompany.mysql",  "1.0.0");    } Unique identifier (GUID), agent version    private  Map<String,  Number>  gatherMetrics()  {        Map<String,  Number>  metrics  =  MySQL.runSQL(getConnection(),  "SHOW  GLOBAL  STATUS");          return  metrics;    } Query metrics from system    public  void  pollCycle()  {        Map<String,  Number>  metrics  =  gatherMetrics();   Value        reportMetric("network/bytes_reads",                            "bytes/second",        metrics.get("bytes_reads"));        reportMetric("network/bytes_writes",                          "bytes/second",        metrics.get("bytes_writes"));        reportMetric("queries/com_select",                              "selects/second",    metrics.get("com_select"));        reportMetric("queries/com_insert",                              "inserts/second",    metrics.get("com_insert"));        reportMetric("queries/slow_queries",                          "queries/second",    metrics.get("slow_queries"));        reportMetric("connections/connected",                        "connections",          metrics.get("connections_connected"));        reportMetric("innodb/buffer_pool_pages_flushed",  "pages",                      metrics.get("innodb_buffer_pool_pages_flushed"));        reportMetric("innodb/buffer_pool_pages_dirty",      "pages",                      metrics.get("innodb_buffer_pool_pages_dirty"));        //  ...    } } Wednesday, November 6, 13
  • 42. Anatomy of a plugin agent (yes, it’s really that simple) public  class  MySQLAgent  extends  Agent  {    public  MySQLAgent()  {        super("com.mycompany.mysql",  "1.0.0");    } Unique identifier (GUID), agent version    private  Map<String,  Number>  gatherMetrics()  {        Map<String,  Number>  metrics  =  MySQL.runSQL(getConnection(),  "SHOW  GLOBAL  STATUS");          return  metrics;    } Query metrics from system    public  void  pollCycle()  {        Map<String,  Number>  metrics  =  gatherMetrics();   Identifier Value        reportMetric("network/bytes_reads",                            "bytes/second",        metrics.get("bytes_reads"));        reportMetric("network/bytes_writes",                          "bytes/second",        metrics.get("bytes_writes"));        reportMetric("queries/com_select",                              "selects/second",    metrics.get("com_select"));        reportMetric("queries/com_insert",                              "inserts/second",    metrics.get("com_insert"));        reportMetric("queries/slow_queries",                          "queries/second",    metrics.get("slow_queries"));        reportMetric("connections/connected",                        "connections",          metrics.get("connections_connected"));        reportMetric("innodb/buffer_pool_pages_flushed",  "pages",                      metrics.get("innodb_buffer_pool_pages_flushed"));        reportMetric("innodb/buffer_pool_pages_dirty",      "pages",                      metrics.get("innodb_buffer_pool_pages_dirty"));        //  ...    } } Wednesday, November 6, 13
  • 43. Anatomy of a plugin agent (yes, it’s really that simple) public  class  MySQLAgent  extends  Agent  {    public  MySQLAgent()  {        super("com.mycompany.mysql",  "1.0.0");    } Unique identifier (GUID), agent version    private  Map<String,  Number>  gatherMetrics()  {        Map<String,  Number>  metrics  =  MySQL.runSQL(getConnection(),  "SHOW  GLOBAL  STATUS");          return  metrics;    } Query metrics from system    public  void  pollCycle()  {        Map<String,  Number>  metrics  =  gatherMetrics();   Identifier Units Value        reportMetric("network/bytes_reads",                            "bytes/second",        metrics.get("bytes_reads"));        reportMetric("network/bytes_writes",                          "bytes/second",        metrics.get("bytes_writes"));        reportMetric("queries/com_select",                              "selects/second",    metrics.get("com_select"));        reportMetric("queries/com_insert",                              "inserts/second",    metrics.get("com_insert"));        reportMetric("queries/slow_queries",                          "queries/second",    metrics.get("slow_queries"));        reportMetric("connections/connected",                        "connections",          metrics.get("connections_connected"));        reportMetric("innodb/buffer_pool_pages_flushed",  "pages",                      metrics.get("innodb_buffer_pool_pages_flushed"));        reportMetric("innodb/buffer_pool_pages_dirty",      "pages",                      metrics.get("innodb_buffer_pool_pages_dirty"));        //  ...    } } Wednesday, November 6, 13
  • 44. Anatomy of a plugin agent (yes, it’s really that simple) public  class  MySQLAgent  extends  Agent  {    public  MySQLAgent()  {        super("com.mycompany.mysql",  "1.0.0");    } Unique identifier (GUID), agent version    private  Map<String,  Number>  gatherMetrics()  {        Map<String,  Number>  metrics  =  MySQL.runSQL(getConnection(),  "SHOW  GLOBAL  STATUS");          return  metrics;    } Query metrics from system    public  void  pollCycle()  {        Map<String,  Number>  metrics  =  gatherMetrics();   Send to NR Identifier Units Value        reportMetric("network/bytes_reads",                            "bytes/second",        metrics.get("bytes_reads"));        reportMetric("network/bytes_writes",                          "bytes/second",        metrics.get("bytes_writes"));        reportMetric("queries/com_select",                              "selects/second",    metrics.get("com_select"));        reportMetric("queries/com_insert",                              "inserts/second",    metrics.get("com_insert"));        reportMetric("queries/slow_queries",                          "queries/second",    metrics.get("slow_queries"));        reportMetric("connections/connected",                        "connections",          metrics.get("connections_connected"));        reportMetric("innodb/buffer_pool_pages_flushed",  "pages",                      metrics.get("innodb_buffer_pool_pages_flushed"));        reportMetric("innodb/buffer_pool_pages_dirty",      "pages",                      metrics.get("innodb_buffer_pool_pages_dirty"));        //  ...    } } Wednesday, November 6, 13
  • 45. Easy to build UIs Wednesday, November 6, 13
  • 46. Custom Dashboards Fast and easy UI creation Wednesday, November 6, 13
  • 47. Optionally publish Lists in Plugin Central, makes available the UIs Wednesday, November 6, 13
  • 48. Install UI = run the agent Infrastructure Varnish Server Memcached Server MySQL Server 1 MySQL Server 2 Externally monitored Platform Agents Varnish Agent Memcached Agent ... RPM MySQL Agent + GUID + New Relic Metric Store Wednesday, November 6, 13 MySQL UI ... Memcached UI Varnish UI
  • 49. Install UI = run the agent Infrastructure Varnish Server Memcached Server MySQL Server 1 MySQL Server 2 Externally monitored Platform Agents Varnish Agent Memcached Agent ... RPM MySQL Agent + GUID + New Relic Metric Store Wednesday, November 6, 13 MySQL UI ... Memcached UI Varnish UI
  • 50. “But Kevin, how much will all this cost?” Wednesday, November 6, 13
  • 51. “But Kevin, how much will all this cost?” Free!! Wednesday, November 6, 13
  • 52. New! Plugin community reviews Help improve plugins, give feedback Wednesday, November 6, 13
  • 53. New! Private publishing Distribute within multiple accounts, closed Betas Wednesday, November 6, 13
  • 54. In progress: Deployment recipes Simplified configuration and deployment across your data center Wednesday, November 6, 13
  • 55. Get involved! ✓ Review plugins ✓ Contribute to the plugins • Many are open source • Write one! ✓ Contribute to the SDKs ✓ Help us with Chef • Try out our recipes • Try authoring recipes Wednesday, November 6, 13