Add New Relic in Heroku using Play 2 (Java) Application

Installing New Relic in Heroku using a Play 2.4.x (Java) Application

Hi guys, just wanted to write a small post about installing New Relic on a Play Framework App (version 2.4.x) in Heroku. I struggled a bit with some of the instructions I found through the internet (including Heroku’s and New Relic’s).

What I did to make it work:

Install the New Relic Addon through Heroku’s interface

New Relic Installation Screen

New Relic Installation Screen

This will install the add-on and configure somethings for you (like environment variables). If you do `heroku config` you’l see the following variables:

  • NEW_RELIC_APP_NAME:          APP_NAME
  • NEW_RELIC_LICENSE_KEY:       YOUR_LICENSE_KEY
  • NEW_RELIC_LOG:               stdout

In order for the addon to work you need to enable it’s Java agent, by adding the dependencies to your build.sbt file:

libraryDependencies ++= Seq(

  //Your other dependencies

  “com.newrelic.agent.java” % “newrelic-agent” % “3.25.0”,

   “com.newrelic.agent.java” % “newrelicapi” % “3.25.0”

)

Notice that at the time of writing ( 20/02/2016 – February 20th ) the latest version of the agent is 3.25. You should always check the latest version at maven central and use that.

Now you need the “newrelic.yml” configuration file. You can download when you configure your account in new relic. Once you go to your New Relic account page you’ll see the following screen : Choose “Java”.

new_relic-1After you choose Java, the next screen will show this:

new-relic-3

Click the “Download the Java agent” button. This will download a zip file with the java agent and the newrelic.yml file. My suggestion is copy the newrelic.yml file to the Play Framework’s conf directory ( conf/newrelic.yml ).

Add all the changes to git, and push to heroku.

git add build.sbt

git add conf/newrelic.yml

git commit -m ‘Add new relic addon’

git push heroku master

Now you only to configure the environment variables to run the agent.

heroku config:set JAVA_OPTS=”Xmx334m -Xss512k -XX:+UseCompressedOops -javaagent:target/universal/stage/lib/com.newrelic.agent.java.newrelic-agent-3.25.0.jar -Dnewrelic.config.file=conf/newrelic.yml

Now, I’m not sure if target/universal/stage/lib/com.newrelic.agent.java.newrelic-agent-3.25.0.jar will be the same throughout time, but if you get errors like “cannot open zip file” or “cannot read manifest” I suggest you do the following in your terminal:

heroku run bash

Once inside the web dyno, look around and find where the new-relic jar file is and point the environment variable to it.

Hopefully, that’s all you need. I did encounter other issues, but mostly related by not having the newrelic.yml file in the right place (or not having the configuration pointing to the right place).

JPA Generate Schema – Scripting was requested, but no target was specified

Hi all,

I’ve been making some experiments with the Play Framework (version 2.4.2) and JPA integration (with Hibernate – version 4.3.10). I was trying to make Hibernate generate the SQL Schema based on the JPA annotations I had in my entity classes and stumbled upon the error you see on the title, with the following stack trace:

[ProvisionException: Unable to provision, see the following errors: 1) Error injecting constructor, javax.persistence.PersistenceException: Scripting was requested, but no target was specified at play.db.jpa.DefaultJPAApi$JPAApiProvider.<init>(DefaultJPAApi.java:35) at play.db.jpa.DefaultJPAApi$JPAApiProvider.class(DefaultJPAApi.java:30) while locating play.db.jpa.DefaultJPAApi$JPAApiProvider while locating play.db.jpa.JPAApi

I found that there are some JPA properties to make the provider (in my case, Hibernate) generate the scripts for you (standard properties, no need to use hibernate.hbm2ddl.auto in the persistence.xml file). I’ve found that link through this great answer on stackoverflow.

One of the properties is this:

<property name=“javax.persistence.schema-generation.scripts.action” value=“none / drop / drop-and-create / create “/>

Which when I added to my persistence.xml with any of the values – drop/drop-and-create/create  gave me the said error because I didn’t specify where to create the scripts. That’s what the following properties are for:

  • javax.persistence.schema-generation.scripts.create-target
  • javax.persistence.schema-generation.scripts.drop-target

You have to tell the JPA provider where to create the scripts, hence the error “scripting requested, but no target specified“.

The solution

Add the following properties:

  • <property name=“javax.persistence.schema-generation.scripts.action” value=“drop-and-create”/>
  • <property name=“javax.persistence.schema-generation.scripts.drop-target” value=“conf/db/drop-schema.sql”/>
  • <property name=“javax.persistence.schema-generation.scripts.create-target” value=“conf/db/create-schema.sql”/>

You then get the scripts generated to conf/db/. Hope that helps someone 🙂

Happy coding!