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

A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 

Último (20)

A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 

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