Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Statistics #43

Open
yannisgu opened this issue Jun 14, 2020 · 20 comments · May be fixed by #54
Open

Statistics #43

yannisgu opened this issue Jun 14, 2020 · 20 comments · May be fixed by #54

Comments

@yannisgu
Copy link

Hello Edward,

I would like to be able to see the SRT statistics (Dropped packages, RTT, etc...).
I configured the stat_post_url and my API is called all 5 seconds, however the call is empty. There are no query string nor request body. How can I now access the statistics?

Cheers,
Yannis

@Edward-Wu
Copy link
Owner

hi, Yannis,
the stat_post_url is not for SRT statistic info, but just for sis connection info , such as:
const char SLS_SERVER_STAT_INFO_BASE[] = "
{
"port": "%d",
"role": "%s",
"pub_domain_app": "",
"stream_name": "",
"url": "",
"remote_ip": "",
"remote_port": "",
"start_time": "%s",
"kbitrate": "0"
}";

if you want to get the SRT statistic info please add a interface like stat_srt_post_url by yourself.

@rodneyallan
Copy link

rodneyallan commented Jul 13, 2020

Hello Edward, it is also empty for me as well. I don't see any sis connection info. The only modification I did was to change the stat_post_url. I can see the call being made, but there is no data.

@matiaspl
Copy link

Same for me. Callback URL works fine, stat returns empty body.

@odensc odensc linked a pull request Aug 22, 2020 that will close this issue
@odensc
Copy link

odensc commented Aug 22, 2020

Hey folks - I (hopefully) fixed this in #54. Feel free to give it a try from my fork: https://github.com/odensc/srt-live-server

@rodneyallan
Copy link

Thanks, I will give this a try.

@Edward-Wu
Copy link
Owner

hi, rodneyallan
how 's your test result?

@rodneyallan
Copy link

@Edward-Wu I have not had a chance to test it yet. I will try it this week.

@konjkavi
Copy link

konjkavi commented Oct 3, 2020

Hi,
sls is installed on an U18.04 VPS. Publish, Play and Record are working! However, when a connection info request is sent from browser to http://publicip:8001/sls/stat there's no response. Same result using "odensc" fork.

sls.conf :
stat_post_url http://publicip:8001/sls/stat;

error.log says 'Connection refused':
SLS_INFO
: [0x55c65c70b730]CTCPRole::connect, ok, m_fd=6, host=publicip, port==8001.
: [0x55c65c70b730]CHttpClient::generate_http_request, write_post_content, ret=0, remote_host='publicip', remote_port=8001.
: [0x55c65c70b730]CHttpClient::generate_http_request, ok, m_url='http://publicip:8001/sls/stat', content len=2.
: [0x55c65c70b730]CTCPRole::read, len=-1, errno=111, err='Connection refused'
: [0x55c65c70b730]CTCPRole::read, invalid tcp.
....
: [0x55e03202f730]CHttpClient::check_timeout, ok, url='http://publicip:8001/sls/stat', http_method='POST', content_len=0, m_response_content_length=-1.

UFW is disabled! Assuming this is not a bug, appreciate comments on what may be causing the connection refused and invalid tcp.
Thanks.

@odensc
Copy link

odensc commented Oct 3, 2020

@konjkavi You can't request that URL from the browser, that's the URL it sends the stats to. So you need a server running on that IP that can receive the JSON POST data.

@konjkavi
Copy link

konjkavi commented Oct 3, 2020

Thanks.
I know this request is outside the scope of this section, but would you have a NGINX conf file by any chance for receiving JSON POST?

@odensc
Copy link

odensc commented Oct 3, 2020

Nope sorry, I'd recommend a simple Node.js server using express to test.

@konjkavi
Copy link

konjkavi commented Oct 3, 2020

Have not worked with node.js before, but created app.js (below) on the same sls server listening on port 3000 . The publicip:3000 responds to requests, but /sls/stat still not working. Obviously my app.js is no good. Appreciate if you could post replacement lines so that I may get stat working. Thank you.

const express = require('express')
const app = express()
const port = 3000

app.post('/sls/stat', function(request, response){
console.log(request.body); // your JSON
response.send(request.body); // echo the result back
});

app.listen(port, () => {
console.log(srt stat listening at http://localhost:${port})

@odensc
Copy link

odensc commented Oct 3, 2020

You need body-parser. This should work:

const express = require("express");
const bodyParser = require("body-parser");

const app = express();
app.use(bodyParser.json());

app.post("/sls/stat", (req, res) => {
	console.log(req.body)

	res.sendStatus(200);
});

app.listen(3000, () => console.log("Server started"));

@konjkavi
Copy link

konjkavi commented Oct 3, 2020

Hmm... server response to http://publicip:3000/sls/stat is: "Cannot GET /sls/stat"

FYI, sls server is up and ffplay currently playing srt stream from it. Furthermore, sls says:
[0x55cef2723730]CTCPRole::setup, setsockopt reused ok, m_fd=6.
: [0x55cef2723730]CTCPRole::set_nonblock, set O_NONBLOCK ok, m_fd=6.
: [0x55cef2723730]CTCPRole::connect, ok, m_fd=6, host=publicip, port==3000.
: [0x55cef2723730]CHttpClient::generate_http_request, write_post_content, ret=0, remote_host='publicip', remote_port=3000.
: [0x55cef2723730]CHttpClient::generate_http_request, ok, m_url='http://publicip:3000/sls/stat', content len=388.
[0x55cef2723730]CHttpClient::parse_http_response, m_response_code:'200', url='http://publicip:3000/sls/stat', http_method='POST'.
: [0x55cef2723730]CHttpClient::parse_http_response, m_response_content_length=2.
: [0x55cef2723730]CHttpClient::parse_http_response, finished, url='http://publicip:3000/sls/stat', http_method='POST', content_len=2.
: [0x55cef2723730]CHttpClient::recv, finished.
: [0x55cef2723730]CTCPRole::close ok, m_fd=6.

Any thoughts?
Thanks.

@odensc
Copy link

odensc commented Oct 3, 2020

It completed the POST request successfully. The Node.js server should have printed the JSON data to the console - do you not see that?

You won't be able to GET the url, you would have to implement that (e.g assign the request body to a variable and send that back via the GET route)

@konjkavi
Copy link

konjkavi commented Oct 3, 2020

Yes, I do see the stats now in console. Thank you.
This is fine for now, but if you happens to have the full code that allows GET from URL, that would be awesome.

Feedback:
If one day this project could come to have similar capabilities to "https://github.com/arut/nginx-rtmp-module" its utilization and popularity could balloon. From my perspective, most critical will be adapt and/or extend the current ts file recording to provide live multi bit rate hls stream. Thanks again for your help today.

@odensc
Copy link

odensc commented Oct 3, 2020

Something like this should work.

const express = require("express");
const bodyParser = require("body-parser");

const app = express();
app.use(bodyParser.json());

let lastStats = {};

app.post("/sls/stat", (req, res) => {
	lastStats = req.body;

	res.sendStatus(200);
});

app.get("/sls/stat", (req, res) => res.json(lastStats));

app.listen(3000, () => console.log("Server started"));

@konjkavi
Copy link

konjkavi commented Oct 3, 2020

It does work! Much appreciated. Thank you.

@rodneyallan
Copy link

@Edward-Wu and @odensc - sorry for the long delay, but I have finally be able to test the fork and it looks like it works.

[ { port: '8080',
role: 'player',
pub_domain_app: 'uplive.sls.com/live',
stream_name: 'Lydia',
url: 'live.sls.com/live/Lydia',
remote_ip: '209.177.xxx.xxx',
remote_port: '38535',
start_time: '2020-10-08 15:41:35',
kbitrate: '1347' },
{ port: '8080',
role: 'publisher',
pub_domain_app: 'uplive.sls.com/live',
stream_name: 'Lydia',
url: 'uplive.sls.com/live/Lydia',
remote_ip: '209.87.xxx.xxx',
remote_port: '55484',
start_time: '2020-10-08 15:41:33',
kbitrate: '1376' },
{ port: '8080',
role: 'listener',
pub_domain_app: '',
stream_name: '',
url: '',
remote_ip: '',
remote_port: '',
start_time: '2020-10-08 15:41:29',
kbitrate: '0' } ]

@jengajenga
Copy link

Hi guys. I'm pretty new to SRT but coming from an NGIN/RTMP background.

How exactly are we making this happen? When I click on my link the, server says no such page exists. Firewalls are off, internet is strong and stable.

Secondly, where does the code written by @odensc go? do i create a .js , paste the code and put it in the html folder?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

7 participants