Skip to content

Instantly share code, notes, and snippets.

@defp
Created January 6, 2021 02:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save defp/922186b2487b0f98e783ec6b9fdaa34e to your computer and use it in GitHub Desktop.
Save defp/922186b2487b0f98e783ec6b9fdaa34e to your computer and use it in GitHub Desktop.
socket_server.ex
defmodule SocketServer do
require Logger
import Sentry.Event
@doc """
Starts accepting connections on the given `port`.
"""
def accept(port) do
{:ok, socket} = :gen_tcp.listen(port,
[:binary, packet: :line, active: false, reuseaddr: true])
Logger.info "Accepting connections on port #{port}"
loop_acceptor(socket)
end
defp loop_acceptor(socket) do
{:ok, client} = :gen_tcp.accept(socket)
{:ok, pid} = Task.Supervisor.start_child(Omsentry.TaskSupervisor, fn -> serve(client) end)
:ok = :gen_tcp.controlling_process(client, pid)
loop_acceptor(socket)
end
defp serve(socket) do
case :gen_tcp.recv(socket, 0) do
{:ok, data} ->
Logger.info("receive #{data}")
process(data)
serve(socket)
{:error, :closed} ->
Logger.info("client close")
{:error, reason} ->
Sentry.capture_message(reason)
Logger.error(reason)
end
end
# jjh.fj jjh-server-1 jjh.zfxd.staging.3 [:0000000e] {"level":"debug","msg":"client 103 from 125.118.69.44:54543 connect","name":"gate","time":"2017-10-23T16:17:48+0800"}
# SocketServer.process("jjh.fj jjh-server-1 jjh.zfxd.staging.3 [:0000000e] {\"level\":\"debug\",\"msg\":\"client 105 from 125.118.69.44:25505 connect\",\"name\":\"gate\",\"time\":\"2017-10-23T17:41:14+0800\"}\n")
# SocketServer.process("jjh.fj jjh-server-1 jjh.zfxd.staging.3 [:0000000e] asdfasdf")
def process("jjh.fj" <> raw_msg) do
System.put_env("SENTRY_DSN", "http://690553b1978d4240aa5d1a3751a996b8:148af5f778b24348bc886e9aede59487@49.4.8.249:9099/4")
fields = raw_msg
|> String.trim
|> String.split(" ", parts: 4)
if length(fields) == 4 do
[host, app_env, mem_addr, msg_field] = fields
tags = %{"host" => host, "app_env" => app_env, "mem_addr" => mem_addr}
case Poison.decode(msg_field) do
{:ok, json} ->
event = create_event(tags: tags, message: json["msg"], level: json["level"], extra: json)
Sentry.send_event(event)
_ ->
event = create_event(tags: tags, message: msg_field)
Sentry.send_event(event)
end
else
Sentry.capture_message(raw_msg)
end
end
# SocketServer.process("jjh.fish jjh-server-1 jjh.zfxd.staging.3 [:0000000e] asdfasdf")
def process("jjh.fish" <> raw_msg) do
System.put_env("SENTRY_DSN", "http://2d9e798e617d4792b1141c56187a012c:a3a7c762feaf4c65aa56de6b30be295c@49.4.8.249:9099/3")
Sentry.capture_message(raw_msg)
end
def process("GET" <> _rest) do
:ignored
end
def process(raw_msg) do
Logger.warn("Unknow msg #{raw_msg}")
:ignored
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment