Created
January 6, 2021 02:33
-
-
Save defp/922186b2487b0f98e783ec6b9fdaa34e to your computer and use it in GitHub Desktop.
socket_server.ex
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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:[email protected]: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:[email protected]: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