Your application stack is made up of a myriad assortment of technologies, from cloud services, to the database, caching, networking, queuing and more. In order to gain a comprehensive view of your application performance, you need performance visibility into all these technologies. And, you'd like that visibility within a single tool that you already know and love.
The New Relic Platform gives you exactly that, an in-depth, real time insight into the performance of each component of your application stack. And best of all, it's free!
Find out all about the New Relic Platform and learn what it has to offer you in its wide selection of Plugins, providing insight into AWS, MySQL, Redis, MongoDB, RabbitMQ, Varnish, and many many more. Its extensible architecture means that if there isn't a plugin for the technology you want, writing one is not only possible, but easy!
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
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
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