Please try again with the recently released v0.20.0-rc.1 and let me know if the error still exists.
On Wed, Jan 8, 2014 at 5:09 PM, Joseph Kondel <[email protected]> wrote: > Hi Lennart, > > Any chance you spotted anything more from the provided info? > > Thanks, > -joe > > > On Tuesday, January 7, 2014 2:58:05 PM UTC-5, Joseph Kondel wrote: >> >> curl -XGET http://127.0.0.1:12900/system/cluster/nodes -v >> * About to connect() to 127.0.0.1 port 12900 (#0) >> * Trying 127.0.0.1... connected >> * Connected to 127.0.0.1 (127.0.0.1) port 12900 (#0) >> > GET /system/cluster/nodes HTTP/1.1 >> > User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 >> > NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 >> > Host: 127.0.0.1:12900 >> > Accept: */* >> > >> < HTTP/1.1 200 OK >> < Content-Type: application/json >> < X-Runtime-Microseconds: 701 >> < Transfer-Encoding: chunked >> < >> * Connection #0 to host 127.0.0.1 left intact >> * Closing connection #0 >> >> {"total":1,"nodes":[{"id":"a19d2c6f-0050-4480-b420-b53ed77e650d","is_master":true,"last_seen":"2014-01-07T19:56:06.000Z","transport_address":"http://127.0.0.1:12900/","type":"server","short_node_id":"a19d2c6f"}]} >> >> and >> >> curl -XGET http://10.0.2.15:12900/system/cluster/nodes -v >> * About to connect() to 10.0.2.15 port 12900 (#0) >> * Trying 10.0.2.15... connected >> * Connected to 10.0.2.15 (10.0.2.15) port 12900 (#0) >> > GET /system/cluster/nodes HTTP/1.1 >> > User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 >> > NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 >> > Host: 10.0.2.15:12900 >> > Accept: */* >> > >> < HTTP/1.1 200 OK >> < Content-Type: application/json >> < X-Runtime-Microseconds: 8907 >> < Transfer-Encoding: chunked >> < >> * Connection #0 to host 10.0.2.15 left intact >> * Closing connection #0 >> >> {"total":1,"nodes":[{"id":"a19d2c6f-0050-4480-b420-b53ed77e650d","is_master":true,"last_seen":"2014-01-07T19:57:00.000Z","transport_address":"http://127.0.0.1:12900/","type":"server","short_node_id":"a19d2c6f"}]} >> >> On Tuesday, January 7, 2014 2:32:36 PM UTC-5, lennart wrote: >>> >>> Sorry, I meant >>> >>> curl -XGET http://127.0.0.1:12900/system/cluster/nodes -v >>> >>> and >>> >>> curl -XGET http://10.0.2.15:12900/system/cluster/nodes -v >>> >>> On Tue, Jan 7, 2014 at 2:11 PM, Joseph Kondel >>> <[email protected]> wrote: >>> > [vagrant@centos64 conf]$ curl -v http://10.0.2.15:12900/cluster/nodes >>> > * About to connect() to 10.0.2.15 port 12900 (#0) >>> > * Trying 10.0.2.15... connected >>> > * Connected to 10.0.2.15 (10.0.2.15) port 12900 (#0) >>> >> GET /cluster/nodes HTTP/1.1 >>> >> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 >>> >> NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 >>> >> Host: 10.0.2.15:12900 >>> >> Accept: */* >>> >> >>> > < HTTP/1.1 404 Not Found >>> > < Transfer-Encoding: chunked >>> > < >>> > * Connection #0 to host 10.0.2.15 left intact >>> > * Closing connection #0 >>> > >>> > and >>> > >>> > [vagrant@centos64 conf]$ curl -v http://127.0.0.1:12900/cluster/nodes >>> > * About to connect() to 127.0.0.1 port 12900 (#0) >>> > * Trying 127.0.0.1... connected >>> > * Connected to 127.0.0.1 (127.0.0.1) port 12900 (#0) >>> >> GET /cluster/nodes HTTP/1.1 >>> >> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 >>> >> NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 >>> >> Host: 127.0.0.1:12900 >>> >> Accept: */* >>> >> >>> > < HTTP/1.1 404 Not Found >>> > < Transfer-Encoding: chunked >>> > < >>> > * Connection #0 to host 127.0.0.1 left intact >>> > * Closing connection #0 >>> > >>> > -joe >>> > >>> > On Tuesday, January 7, 2014 6:04:12 AM UTC-5, lennart wrote: >>> >> >>> >> Can you post the output of the node discovery curl call with verbose >>> >> output? >>> >> >>> >> curl -v http://10.0.2.15:12900/cluster/nodes >>> >> >>> >> ...and also the way the web interface will try to connect: >>> >> >>> >> curl -v http://127.0.0.1:12900/cluster/nodes >>> >> >>> >> Thank you! :) >>> >> >>> >> On Mon, Jan 6, 2014 at 10:19 PM, Joseph Kondel >>> >> <[email protected]> wrote: >>> >> > Hi Lennart, >>> >> > >>> >> > graylog2-web-interface.conf: >>> >> > >>> >> > # graylog2-server REST URIs (one or more, comma separated) For >>> >> > example: >>> >> > "http://127.0.0.1:12900/,http://127.0.0.1:12910/" >>> >> > graylog2-server.uris="http://127.0.0.1:12900/" >>> >> > >>> >> > # Secret key >>> >> > # ~~~~~ >>> >> > # The secret key is used to secure cryptographics functions. Set >>> >> > this to >>> >> > a >>> >> > long and randomly generated string. >>> >> > # If you deploy your application to several instances be sure to use >>> >> > the >>> >> > same key! >>> >> > # Generate for example with: pwgen -s 96 >>> >> > application.secret="OMITTED" >>> >> > >>> >> > # Web interface timezone >>> >> > # Graylog2 stores all timestamps in UTC. To properly display times, >>> >> > set >>> >> > the >>> >> > default timezone of the interface. >>> >> > # If you leave this out, Graylog2 will pick your system default as >>> >> > the >>> >> > timezone. Usually you will want to configure it explicitly. >>> >> > # timezone="Europe/Berlin" >>> >> > >>> >> > graylog2.conf ( I've removed comments and commented out settings >>> >> > that I >>> >> > didn't touch ): >>> >> > >>> >> > is_master = true >>> >> > node_id_file = /etc/graylog2-server-node-id >>> >> > password_secret = OMITTED >>> >> > root_password_sha2 = OMITTED >>> >> > plugin_dir = plugin >>> >> > rest_listen_uri = http://127.0.0.1:12900/ >>> >> > elasticsearch_max_docs_per_index = 20000000 >>> >> > elasticsearch_max_number_of_indices = 20 >>> >> > retention_strategy = delete >>> >> > elasticsearch_shards = 4 >>> >> > elasticsearch_replicas = 0 >>> >> > elasticsearch_index_prefix = graylog2 >>> >> > elasticsearch_analyzer = standard >>> >> > output_batch_size = 5000 >>> >> > processbuffer_processors = 5 >>> >> > outputbuffer_processors = 5 >>> >> > processor_wait_strategy = blocking >>> >> > ring_size = 1024 >>> >> > mongodb_useauth = false >>> >> > mongodb_host = 127.0.0.1 >>> >> > mongodb_database = graylog2 >>> >> > mongodb_port = 27017 >>> >> > mongodb_max_connections = 100 >>> >> > mongodb_threads_allowed_to_block_multiplier = 5 >>> >> > >>> >> > I've not tried specifically setting the rest_transport_uri as the >>> >> > comments >>> >> > before it lead me to believe it'll default to the first non-loopback >>> >> > address. I've confirmed that the rest API is responding by curling >>> >> > the >>> >> > non-loopback address based on the api documented here: >>> >> > http://docs.graylog2.apiary.io/ >>> >> > >>> >> > ex: >>> >> > >>> >> > curl http://10.0.2.15:12900/count/total >>> >> > {"events":0} >>> >> > >>> >> > Although interestingly "curl http://10.0.2.15:12900/cluster/nodes" >>> >> > doesn't >>> >> > return anything. Not sure if it's supposed to before I actually >>> >> > configure an >>> >> > input or not. >>> >> > >>> >> > Thanks, >>> >> > Joe >>> >> > >>> >> > On Monday, January 6, 2014 3:22:17 PM UTC-5, lennart wrote: >>> >> >> >>> >> >> Can you post your graylog2.conf and your >>> >> >> graylog2-web-interface.conf? >>> >> >> Thanks! >>> >> >> >>> >> >> I am suspecting that this is somehow related no node discovery and >>> >> >> configured rest_transport addresses. >>> >> >> >>> >> >> On Mon, Jan 6, 2014 at 8:30 PM, Joseph Kondel >>> >> >> <[email protected]> wrote: >>> >> >> > Hi, >>> >> >> > >>> >> >> > Running preview 8 on centos 6.4. Followed instructions and got >>> >> >> > graylog2-server and the web interface up and running on a vm. ES, >>> >> >> > Mongo, >>> >> >> > and >>> >> >> > GL2-server/web are all running on the same vm. >>> >> >> > >>> >> >> > Java version: >>> >> >> > [vagrant@centos64 bin]$ java -version >>> >> >> > java version "1.7.0_45" >>> >> >> > OpenJDK Runtime Environment (rhel-2.4.3.4.el6_5-x86_64 u45-b15) >>> >> >> > OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode) >>> >> >> > >>> >> >> > I can login to the UI and navigate around but am getting errors >>> >> >> > when >>> >> >> > trying >>> >> >> > to setup my first input according to the directions. I click on >>> >> >> > "nodes" >>> >> >> > on >>> >> >> > the system page and get "Oops, an error occurred." >>> >> >> > >>> >> >> > Graylog2 web-ui logs complain about an unavailable >>> >> >> > graylog2-server: >>> >> >> > >>> >> >> > play.api.Application$$anon$1: Execution >>> >> >> > exception[[Graylog2ServerUnavailableException: null]] >>> >> >> > at >>> >> >> > play.api.Application$class.handleError(Application.scala:293) >>> >> >> > ~[com.typesafe.play.play_2.10-2.2.0.jar:2.2.0] >>> >> >> > at >>> >> >> > play.api.DefaultApplication.handleError(Application.scala:399) >>> >> >> > [com.typesafe.play.play_2.10-2.2.0.jar:2.2.0] >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) >>> >> >> > [com.typesafe.play.play_2.10-2.2.0.jar:2.2.0] >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261) >>> >> >> > [com.typesafe.play.play_2.10-2.2.0.jar:2.2.0] >>> >> >> > at scala.Option.map(Option.scala:145) >>> >> >> > [org.scala-lang.scala-library-2.10.2.jar:na] >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2.applyOrElse(PlayDefaultUpstreamHandler.scala:261) >>> >> >> > [com.typesafe.play.play_2.10-2.2.0.jar:2.2.0] >>> >> >> > Caused by: lib.security.Graylog2ServerUnavailableException: null >>> >> >> > at lib.ServerNodes.all(ServerNodes.java:76) >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > ~[graylog2-web-interface.graylog2-web-interface-0.20.0-preview.8.jar:0.20.0-preview.8] >>> >> >> > at lib.ServerNodes.any(ServerNodes.java:108) >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > ~[graylog2-web-interface.graylog2-web-interface-0.20.0-preview.8.jar:0.20.0-preview.8] >>> >> >> > at lib.ServerNodes.any(ServerNodes.java:104) >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > ~[graylog2-web-interface.graylog2-web-interface-0.20.0-preview.8.jar:0.20.0-preview.8] >>> >> >> > at >>> >> >> > >>> >> >> > lib.ApiClientImpl$ApiRequestBuilder.execute(ApiClientImpl.java:324) >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > ~[graylog2-web-interface.graylog2-web-interface-0.20.0-preview.8.jar:0.20.0-preview.8] >>> >> >> > at models.NodeService.radios(NodeService.java:91) >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > ~[graylog2-web-interface.graylog2-web-interface-0.20.0-preview.8.jar:0.20.0-preview.8] >>> >> >> > at >>> >> >> > controllers.NodesController.nodes(NodesController.java:64) >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > ~[graylog2-web-interface.graylog2-web-interface-0.20.0-preview.8.jar:0.20.0-preview.8] >>> >> >> > >>> >> >> > and looking at the graylog2-server logs I find: >>> >> >> > >>> >> >> > ERROR: org.graylog2.jersey.container.netty.NettyContainer - >>> >> >> > Uncaught >>> >> >> > exception during jersey resource handling >>> >> >> > java.io.IOException: Broken pipe >>> >> >> > at sun.nio.ch.FileDispatcherImpl.write0(Native Method) >>> >> >> > at >>> >> >> > sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) >>> >> >> > at >>> >> >> > sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) >>> >> >> > at sun.nio.ch.IOUtil.write(IOUtil.java:51) >>> >> >> > at >>> >> >> > sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:487) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.socket.nio.SocketSendBufferPool$UnpooledSendBuffer.transferTo(SocketSendBufferPool.java:203) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.socket.nio.AbstractNioWorker.write0(AbstractNioWorker.java:201) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.socket.nio.AbstractNioWorker.writeFromUserCode(AbstractNioWorker.java:146) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:99) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:36) >>> >> >> > at >>> >> >> > org.jboss.netty.channel.Channels.write(Channels.java:725) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.handler.codec.oneone.OneToOneEncoder.doEncode(OneToOneEncoder.java:71) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:59) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.handler.stream.ChunkedWriteHandler.flush(ChunkedWriteHandler.java:280) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.handler.stream.ChunkedWriteHandler.handleDownstream(ChunkedWriteHandler.java:121) >>> >> >> > at >>> >> >> > org.jboss.netty.channel.Channels.write(Channels.java:704) >>> >> >> > at >>> >> >> > org.jboss.netty.channel.Channels.write(Channels.java:671) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.AbstractChannel.write(AbstractChannel.java:248) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.graylog2.jersey.container.netty.NettyContainer$NettyResponseWriter.commit(NettyContainer.java:149) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.glassfish.jersey.server.ContainerResponse.close(ContainerResponse.java:412) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:526) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:333) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:323) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:227) >>> >> >> > at >>> >> >> > org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) >>> >> >> > at >>> >> >> > org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) >>> >> >> > at >>> >> >> > org.glassfish.jersey.internal.Errors.process(Errors.java:315) >>> >> >> > at >>> >> >> > org.glassfish.jersey.internal.Errors.process(Errors.java:297) >>> >> >> > at >>> >> >> > org.glassfish.jersey.internal.Errors.process(Errors.java:267) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:198) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:946) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.graylog2.jersey.container.netty.NettyContainer.messageReceived(NettyContainer.java:254) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.handler.stream.ChunkedWriteHandler.handleUpstream(ChunkedWriteHandler.java:142) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:459) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:536) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:435) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) >>> >> >> > at >>> >> >> > >>> >> >> > org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:318) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) >>> >> >> > at >>> >> >> > >>> >> >> > org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) >>> >> >> > at >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) >>> >> >> > at java.lang.Thread.run(Thread.java:744) >>> >> >> > >>> >> >> > followed by a bunch of "ERROR: >>> >> >> > org.graylog2.jersey.container.netty.NettyContainer - Uncaught >>> >> >> > exception >>> >> >> > during jersey resource handling >>> >> >> > java.nio.channels.ClosedChannelException " errors. >>> >> >> > >>> >> >> > No other errors are in either components logs. I haven't changed >>> >> >> > any >>> >> >> > of >>> >> >> > the >>> >> >> > config defaults other than those pointed out in the installation >>> >> >> > instructions. >>> >> >> > >>> >> >> > Any thoughts? >>> >> >> > >>> >> >> > For what it's worth the "logging" URL ( >>> >> >> > http://127.0.0.1:9000/system/logging >>> >> >> > ) off the system page throws the same set of errors for me. >>> >> >> > >>> >> >> > -j >>> >> >> > >>> >> >> > -- >>> >> >> > You received this message because you are subscribed to the >>> >> >> > Google >>> >> >> > Groups >>> >> >> > "graylog2" group. >>> >> >> > To unsubscribe from this group and stop receiving emails from it, >>> >> >> > send >>> >> >> > an >>> >> >> > email to [email protected]. >>> >> >> > For more options, visit https://groups.google.com/groups/opt_out. >>> >> > >>> >> > -- >>> >> > You received this message because you are subscribed to the Google >>> >> > Groups >>> >> > "graylog2" group. >>> >> > To unsubscribe from this group and stop receiving emails from it, >>> >> > send >>> >> > an >>> >> > email to [email protected]. >>> >> > For more options, visit https://groups.google.com/groups/opt_out. >>> > >>> > -- >>> > You received this message because you are subscribed to the Google >>> > Groups >>> > "graylog2" group. >>> > To unsubscribe from this group and stop receiving emails from it, send >>> > an >>> > email to [email protected]. >>> > For more options, visit https://groups.google.com/groups/opt_out. > > -- > You received this message because you are subscribed to the Google Groups > "graylog2" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/groups/opt_out. -- You received this message because you are subscribed to the Google Groups "graylog2" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/groups/opt_out.
